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

塞滕布里尼

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

现在,在学习Camera2时,我“从头开始”,设法将YUV420_888转换为Bitmap(请参见YUV420_888到Bitmap Conversion)。但是我现在正在为“捕获技术”而苦苦挣扎。从Google的示例中,我看到您需要使用CameraDevice.TEMPLATE_PREVIEW进行“ setRepeating” CaptureRequest以在例如表面视图上显示预览。那也行。但是,为了拍摄实际照片,我需要使用(这次)builder.addTarget(imageReader.getSurface())发出另一个捕获请求。即,数据将在imageReader的onImageAvailable方法中可用。

问题是:captureRequest的创建是一项相当繁重的操作,在我的设备上大约需要200毫秒。因此,根据我的需要,使用捕获请求(无论是模板STILL_CAPTUR还是PREVIEW)都不可能是每秒捕获20张图像的可行方法。我在此处找到的建议主要基于(教育程度适中的)Google示例,我对此并不了解...

我认为解决方案必须是向ImageReader提供连续的预览图片流,可以从那里以给定的频率选择预览图片。有人可以提供一些实施指导吗?非常感谢。

埃迪·塔尔瓦拉(Eddy Talvala)

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

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章