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

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

现在,在研究Camera2时,我“从最后”开始并设法将YUV420_888转换为Bitmap(见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提供一系列预览图片,这些图片可以在给定频率下从那里选取.有人可以就如何实现这个提供一些指导吗?非常感谢.

解决方法:

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

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

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

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

上一篇:MT6739 Android 8.1 修改HAL层mtkcam,避免camera对不支持的分辨率做裁剪拉伸


下一篇:表格边框的合并