像素 4a 上的 camera2 createConstrainedHighSpeedCaptureSession 失败

camera2 createConstrainedHighSpeedCaptureSession on pixel 4a fails

我正在尝试使用 createConstrainedHighSpeedCaptureSession 捕获高 fps 视频,相同的代码在 OnePlus 8T / Honor 10 上运行正常,但在 Pixel 4a 上运行失败

开始预览代码:

        surfaces.clear();
        SurfaceTexture texture = mTextureView.getSurfaceTexture();
        assert texture != null;

        texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());

        mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
        Surface previewSurface = new Surface(texture);

        surfaces.add(previewSurface);
        mPreviewBuilder.addTarget(previewSurface);

        setUpMediaRecorder();
        surfaces.add(mMediaRecorder.getSurface());
        mPreviewBuilder.addTarget(mMediaRecorder.getSurface());
        
        mCameraDevice.createConstrainedHighSpeedCaptureSession(surfaces, new CameraCaptureSession.StateCallback() { ...

错误:

01-11 16:12:22.335 11406 11438 W System.err: java.lang.IllegalArgumentException: Surface size 1841x1036 is not part of the high speed supported size list [1280x720, 1920x1080]
    01-11 16:12:22.336 11406 11438 W System.err:    at android.hardware.camera2.utils.SurfaceUtils.checkConstrainedHighSpeedSurfaces(SurfaceUtils.java:266)
    01-11 16:12:22.336 11406 11438 W System.err:    at android.hardware.camera2.impl.CameraDeviceImpl.createCaptureSessionInternal(CameraDeviceImpl.java:741)
    01-11 16:12:22.336 11406 11438 W System.err:    at android.hardware.camera2.impl.CameraDeviceImpl.createConstrainedHighSpeedCaptureSession(CameraDeviceImpl.java:638)
    01-11 16:12:22.336 11406 11438 W System.err:    at com.revelio.highspeedvideodemo.CaptureHighSpeedVideoModeFragment.startPreview(CaptureHighSpeedVideoModeFragment.java:527)
    01-11 16:12:22.336 11406 11438 W System.err:    at com.revelio.highspeedvideodemo.CaptureHighSpeedVideoModeFragment.access0(CaptureHighSpeedVideoModeFragment.java:64)
    01-11 16:12:22.336 11406 11438 W System.err:    at com.revelio.highspeedvideodemo.CaptureHighSpeedVideoModeFragment.onOpened(CaptureHighSpeedVideoModeFragment.java:190)
    01-11 16:12:22.336 11406 11438 W System.err:    at android.hardware.camera2.impl.CameraDeviceImpl.run(CameraDeviceImpl.java:168)
    01-11 16:12:22.336 11406 11438 W System.err:    at android.os.Handler.handleCallback(Handler.java:938)
    01-11 16:12:22.336 11406 11438 W System.err:    at android.os.Handler.dispatchMessage(Handler.java:99)
    01-11 16:12:22.336 11406 11438 W System.err:    at android.os.Looper.loopOnce(Looper.java:201)
    01-11 16:12:22.336 11406 11438 W System.err:    at android.os.Looper.loop(Looper.java:288)
    01-11 16:12:22.336 11406 11438 W System.err:    at android.os.HandlerThread.run(HandlerThread.java:67)

CaptureHighSpeedVideoModeFragment.java:527 是上面代码片段中的 mCameraDevice.createConstrainedHighSpeedCaptureSession

我将 previewSize 和 videoSize 设置为 1920x1080,但不知何故在 Pixel 4a 上不受尊重

1841x1036 分辨率从何而来?为什么此代码适用于其他手机但不适用于 Pixel 4a?

如何使预览表面保持我希望它保持的分辨率?

感谢任何提示

我看到默认情况下所有相机设备都强制使用可用的最高 fps。 Pixel 4a 设备除外,它有制造商的错误。所有其他设备都被迫以相机设备可用的最高 fps 录制视频。我什至还调查了摄像头管理器。

CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES 将 return 最大 [30-30] fps 但不是慢动作 fps 范围。 return它仅适用于 Pixel 4a 设备,尽管据报道它们支持 60fps。这是代码:Check Code

第 29 行到第 52 行

对于遇到同样问题的任何其他人,我通过将布局从 match_parent 更改为固定分辨率来解决它,在我的情况下我想要全高清所以我只设置

<com.revelio.highspeedvideodemo.AutoFitTextureView
    android:id="@+id/texture"
    android:layout_width="1920px"
    android:layout_height="1080px" />

这不是最好的解决方案,但解决了我眼前的问题

使用 SurfaceView 代替 TextureView 可能会更好,但找不到任何示例如何做到这一点

至于 Eternal Life 提出的答案 - fps 不是这里的问题,请查看我得到的错误,textureView 分辨率与 createConstrainedHighSpeedCaptureSession 支持的分辨率不匹配,即使我正在设置它,唯一的问题工作接缝是布局固定分辨率...但是感谢您的帮助,感谢

您可能试图在 UI 布局完成之前设置相机。 TextureView 在获得布局尺寸后设置缓冲区大小,您需要确保在该点之后调用 setDefaultBufferSize

您是在等待 TextureView.SurfaceTextureListener.onSurfaceTextureSizeChanged 还是 onSurfaceTextureAvailable 之后再致电 TextureView.getSurfaceTexture()