Camera2会话不支持MediaCodec的持久输入表面吗?

时间:2019-04-08 22:07:40

标签: android android-camera2 mediacodec

我正在编写一个支持保存RAW / JPEG并同时录制视频的Android应用。创建public IMvxCommand RefreshCommand { get { return new MvxCommand(async () => { // This simulates some refresh work which takes 3 seconds await Task.Delay(3000); IsRefreshing = false; }); } } 时,我尝试传递4个曲面:预览,CameraCaptureSession创建的2x ImageSaver和1x PersistentInputSurface。通过使用持久性输入表面,我打算避免两次捕获之间的停顿。

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

MediaCodec#createPersistentInputSurface

我尝试取出所有其他表面,仅留下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();
        }
    }

1 个答案:

答案 0 :(得分:1)

最好在该错误行之前查看系统日志行,这很有帮助,但很可能是这样:

在创建相机捕获会话之前,您实际上需要将persistentRecorderSurface绑定到MediaRecorderMediaCodec,并在其上调用prepare()。

否则,持久曲面的另一端实际上没有任何东西,并且相机无法告知需要什么分辨率或其他设置。

还请记住,取决于相机支持的硬件级别和功能,相机可以同时输出的数量是有限的。不幸的是,当前并不需要设备必须支持您的输出组合(预览,记录,JPEG,RAW),因此很可能很多或所有设备仍然会给您带来错误。