4

我想根据 API 将应用程序从 Camera1 扩展到 Camera2。该应用程序的一个核心机制是以每秒约 20 张照片的速度拍摄预览照片。使用 Camera1,我意识到通过创建一个 SurfaceView,在其持有者上添加一个回调,并在创建表面后通过定期 setOneShotPreviewCallbacks 访问预览图片。这非常简单可靠。

现在,在学习 Camera2 时,我“从头到尾”成功地将 YUV420_888 转换为位图(请参阅YUV420_888 到位图转换)。但是我现在正在努力使用“捕获技术”。从 Google 示例中,我看到您需要使用 CameraDevice.TEMPLATE_PREVIEW 进行“setRepeating” CaptureRequest 以显示预览,例如在表面视图上。没事儿。但是,为了拍摄实际照片,我需要使用(这次)builder.addTarget(imageReader.getSurface()) 发出另一个捕获请求。即数据将在 imageReader 的 onImageAvailable 方法中可用。

问题:在我的设备上创建 captureRequest 是一项相当繁重的操作,大约需要 200 毫秒。因此,使用捕获请求(无论是模板 STILL_CAPTUR 还是 PREVIEW)不可能是每秒捕获 20 张图像的可行方法,因为我需要它。我在这里找到的关于 SO 的建议主要基于(教育效率适中)谷歌示例,我不太明白......

我觉得解决方案必须是为 ImageReader 提供连续的预览图片流,可以以给定的频率从那里挑选。有人可以就如何实现这一点提供一些指导吗?非常感谢。

4

1 回答 1

4

如果您想为每一帧向预览 SurfaceView 和您的 YUV ImageReader 发送一个缓冲区,只需将两个 Surface 作为目标添加到重复的预览请求中。

通常,捕获请求可以针对会话配置的输出目标的任何子集(或全部)。

此外,如果您只想使用 .capture() 将偶尔的帧捕获到 YUV ImageReader,则不必每次都重新创建捕获请求构建器;只需在同一个构建器上再次调用 .build() ,或者如果您不更改任何设置,则只需重用实际构造的 CaptureRequest 。

即使是偶尔捕获,您也可能希望将预览 Surface 作为目标包含在 YUV 捕获请求中,以便在显示的预览中没有跳帧。

于 2016-03-17T19:06:27.883 回答