Camera2 会话不支持媒体编解码器的持久输入表面?



我正在编写一个支持保存RAW/JPEG并同时录制视频的Android应用程序。我在创建CameraCaptureSession时尝试传递 4 个表面:预览、2 倍ImageSaver和 1 MediaCodec#createPersistentInputSurface 创建的 1 倍PersistentInputSurface。通过使用持久输入表面,我打算避免 2 次捕获之间的中断。

创建会话时,它失败并显示:

W/CameraDevice-JV-0: Stream configuration failed due to: endConfigure:380: Camera 0: Unsupported set of inputs/outputs provided
Session 0: Failed to create capture session; configuration failed

我尝试取出所有其他表面,只留下PersistentInputSurface,仍然失败。

 @Override
    public void onResume() {
        super.onResume();
        //Some other setups...
        if (persistentRecorderSurface == null) {
            persistentRecorderSurface = MediaCodec.createPersistentInputSurface();
        }
        startBackgroundThread();
        startCamera();
        if (mPreviewView.isAvailable()) {
            configureTransform(mPreviewView.getWidth(), mPreviewView.getHeight());
        } else {
            mPreviewView.setSurfaceTextureListener(mSurfaceTextureListener);
        }
        if (mOrientationListener != null && mOrientationListener.canDetectOrientation()) {
            mOrientationListener.enable();
        }
    }
    private void createCameraPreviewSessionLocked() {
        try {
            SurfaceTexture texture = mPreviewView.getSurfaceTexture();
            texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
            Surface surface = new Surface(texture);
            mPreviewRequestBuilder = mBackCameraDevice.createCaptureRequest(
                    CameraDevice.TEMPLATE_PREVIEW);
            mPreviewRequestBuilder.addTarget(surface);
            mBackCameraDevice.createCaptureSession(Arrays.asList(
                                surface,
                                mJpegImageReader.get().getSurface(),
                                mRAWImageReader.get().getSurface(),
                                persistentRecorderSurface
                        ), new CameraCaptureSession.StateCallback() {
                    @Override
                    public void onConfigured(CameraCaptureSession session) {
                        synchronized (mCameraStateLock) {
                            if (mBackCameraDevice == null) {
                                return;
                            }
                            try {
                                setup3AControlsLocked(mPreviewRequestBuilder);
                                session.setRepeatingRequest(mPreviewRequestBuilder.build(),
                                        mPreCaptureCallback, mBackgroundHandler);
                                mState = CameraStates.PREVIEW;
                            } catch (CameraAccessException | IllegalStateException e) {
                                e.printStackTrace();
                                return;
                            }
                            mSession = session;
                        }
                    }
                    @Override
                    public void onConfigureFailed(CameraCaptureSession session) {
                        showToast("Failed to configure camera.");
                    }
                }, mBackgroundHandler);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }
在该

错误行之前查看系统日志行以进行确认会很有帮助,但最有可能:

在创建相机捕获会话之前,您需要将 persistentRecorderSurface 绑定到 MediaRecorder 或 MediaCodec,并调用 prepare((。

否则,在持久表面的另一端实际上没有任何内容,并且相机无法分辨所需的分辨率或其他设置。

另请记住,摄像机可以同时输出的数量有限制,具体取决于其支持的硬件级别和功能。不幸的是,目前没有要求设备必须支持您的输出组合(预览、录制、JPEG、RAW(,因此很可能许多或所有设备仍会给您错误。

最新更新