Camera2可以连续访问相机预览图像

时间:2016-03-16 22:29:14

标签: android preview capture camera2

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

现在,在研究Camera2时,我“从最后”开始,并设法将YUV420_888转换为位图(请参阅YUV420_888 to Bitmap Conversion)。但是我现在正在努力使用“捕获技术”。从Google示例中我看到您需要使用CameraDevice.TEMPLATE_PREVIEW进行“setRepeating”CaptureRequest以显示预览,例如在表面视图上。那样就好。但是,为了获取实际图片,我需要使用(此时)builder.addTarget(imageReader.getSurface())进行另一个捕获请求。即数据将在imageReader的onImageAvailable方法中可用。

问题:captureRequest的创建是一个相当繁重的操作,在我的设备上花费大约200ms。因此,捕获请求(无论是使用模板STILL_CAPTUR还是PREVIEW)的使用不可能成为每秒捕获20个图像的可行方法,因为我需要它。我在SO上找到的提案主要是基于(教育上适度有效的)Google示例,我并不理解......

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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

相关问题