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

问题描述 投票:1回答:1

我正在编写一个Android应用程序,支持保存RAW / JPEG并同时录制视频。我在创建CameraCaptureSession时尝试传递4个曲面:预览,2x ImageSaver和qxxswpoi创建的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();
        }
    }

android android-camera2 mediacodec
1个回答
1
投票

在错误行之前查看系统日志行以确认是有帮助的,但最有可能的是:

在创建摄像头捕获会话之前,您需要将persistentRecorderSurface实际绑定到 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(); } } MediaRecorder,并在这些上调用prepare()。

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

另请注意,根据支持的硬件级别和功能,您可以从摄像机获得多少并发输出。不幸的是,目前没有要求设备必须支持您的输出组合(预览,记录,JPEG,RAW),因此很可能很多或所有设备仍然会给您一个错误。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.