【发布时间】:2017-11-22 17:28:03
【问题描述】:
现在是 2017 年,我终于开始从 Camera1 切换到 Camera2。在 Camera1 中,我非常依赖 setPreviewCallbackWithBuffer() 来执行实时帧处理,但是在 Camera2 中,它的运行速度要慢得多,以至于几乎无法使用。
相比之下,在 Moto G3 上,Camera1 可以轻松产生 30-40 FPS,而在 Camera2 上我无法获得超过 10-15 FPS。
这是我创建ImageReader的方式
imageReader = ImageReader
.newInstance(
previewSize.width, // size is around 1280x720
previewSize.height,
ImageFormat.YUV_420_888, // note, it is not JPEG
2 // max number of images, does not really affect performance
);
imageReader.setOnImageAvailableListener(
callback,
CameraThread.getInstance().createHandler()
);
回调本身做了尽可能少的工作:
Image image = reader.acquireNextImage();
image.close();
我已经检查过类似的答案,例如this one。然而他们的问题是他们使用JPEG 图像格式而不是YUV_420_888。
如何达到类似Camera1的性能?
【问题讨论】:
-
ImageReader 的大小决定了相机的输出。您也可以使用
YV12图像格式,并确保您拥有最新版本的Android API -
@KingReload 与 YUV 不同,并非所有设备都支持 YV12。此外,我不希望所有客户都拥有最新版本的 Android。如果 Camera1 工作正常,为什么 Camera2 也不能正常工作?
-
您可以减小
ImageReader的图像大小,以便预览可以更流畅,如此答案所述:stackoverflow.com/a/40152147/2949966 -
@ahasbini 帧速率确实会增加。但是,我希望拥有与使用 Camera1 完全相同的预览帧分辨率。否则,Camera2 将是 Camera1 功能的降级,使用它毫无意义。
-
你好,德米特里。我有同样的问题。你解决了吗?还是返回Camera1?您是否尝试使用
setRepeatingBurst而不是setRepeatingRequest?