摄像头 2 API 视频分辨率



我正在使用Camera2录制视频。要获取可用分辨率的列表,我们有 2 个选项:

List<android.util.Size> resolutions = Arrays.asList(map.getOutputSizes(MediaRecorder.class));

和:

// CAMCORDER_PROFILES is an int array listing all the profiles ids
for(int profileId : CAMCORDER_PROFILES) {
    if(CamcorderProfile.hasProfile(profileId)) {
        CamcorderProfile profile = CamcorderProfile.get(profileId);
        // Here we can get a resolution with profile.videoFrameWidth & profile.videoFrameHeight
    }
}

起初我只使用选项 2。在我尝试三星Galaxy A3 2016之前,它一直工作正常。在此设备上,如果我尝试使用 1920*1080 分辨率,它将失败并显示此错误:

E/CameraDevice-0-LE:具有尺寸(w=1920,h=1080(和格式0x1的表面 无效,尺寸设置无效:[960x720, 880x720, 720x720, 720x480、640x480、352x288、320x240、176x144]

为了解决这个问题,我现在得到一个配置文件,其分辨率在map.getOutputSizes(MediaRecorder.class的结果中。我工作,但我可以使用的最佳配置文件是 640x480,这不足以满足我的需求。

有没有办法在A1920上使用1080分辨率和Camera2?还是该分辨率仅适用于三星SDK

???

编辑:这是我开始录制视频时所做的:

private void startRecordingVideo() {
    if (null == mCameraDevice || !mTextureView.isAvailable() || null == mPreviewResolution) {
        return;
    }
    try {
        closeCaptureSession();
        setUpMediaRecorder();
        SurfaceTexture texture = mTextureView.getSurfaceTexture();
        assert texture != null;
        texture.setDefaultBufferSize( (int) mPreviewResolution.getWidth(), (int) mPreviewResolution.getHeight());
        List<Surface> surfaces = new ArrayList<>();
        // Set up Surface for the camera preview
        Surface previewSurface = new Surface(texture);
        surfaces.add(previewSurface);
        mPreviewRequestBuilder.addTarget(previewSurface);
        // Set up Surface for the MediaRecorder
        Surface recorderSurface = mMediaRecorder.getSurface();
        surfaces.add(recorderSurface);
        mPreviewRequestBuilder.addTarget(recorderSurface);
        // Start a capture session:
        mCameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {
            @Override
            public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
                mCaptureSession = cameraCaptureSession;
                updatePreview();
                // Start recording
                mMediaRecorder.start();
            }
            @Override
            public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
                Log.e(this, "Unable to start recording video");
            }
        }, mBackgroundHandler);
    }
    catch (CameraAccessException | IOException e) {
        e.printStackTrace();
    }
}

A3有一个Legacy相机。这意味着 camera2 API 是旧相机 API 的包装器。很多时候,这个包装器带来的麻烦比它解决的要多。我建议直接通过旧的相机API使用此设备和其他旧设备。

相关内容

  • 没有找到相关文章

最新更新