像素 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()
?
我正在尝试使用 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()
?