Camera2 可以连续访问相机预览图像
Camera2 get continuous access to camera preview images
我想根据 API 将应用程序从 Camera1 扩展到 Camera2。该应用程序的一个核心机制在于以每秒约 20 张图片的速度拍摄预览图片。使用 Camera1,我意识到通过创建一个 SurfaceView,在其支架上添加一个回调,并在创建表面后通过定期 setOneShotPreviewCallbacks 访问预览图片。这非常简单可靠。
现在,在研究Camera2时,我来了"from the end"并设法将YUV420_888转换为Bitmap(见YUV420_888 to Bitmap Conversion)。然而,我现在正在为 "capture technique" 苦苦挣扎。从 Google 示例中,我看到您需要使用 CameraDevice.TEMPLATE_PREVIEW 创建 "setRepeating" CaptureRequest 以显示预览,例如表面上看。那也行。但是,为了拍摄实际照片,我需要使用(这次)builder.addTarget(imageReader.getSurface()) 发出另一个捕获请求。 IE。数据将在 imageReader 的 onImageAvailable 方法中可用。
问题:创建 captureRequest 是一项相当繁重的操作,在我的设备上大约需要 200 毫秒。因此,使用捕获请求(无论是使用模板 STILL_CAPTUR 还是使用 PREVIEW)都不可能成为每秒捕获 20 张图像的可行方法,因为我需要它。我在这里找到的关于 SO 的建议主要基于(教育效率适中)Google 示例,我不太理解...
我觉得解决方案必须是为 ImageReader 提供连续的预览图片流,可以按给定的频率从那里挑选。有人可以就如何实施这一点提供一些指导吗?非常感谢。
如果您想为每一帧都向预览 SurfaceView 和 YUV ImageReader 发送缓冲区,只需将这两个 Surface 作为目标添加到重复预览请求中。
通常,捕获请求可以针对
会话的配置输出目标。
此外,如果您只想使用 .capture() 偶尔捕获一个帧到 YUV ImageReader,则不必每次都重新创建捕获请求构建器;只需在同一个构建器上再次调用 .build() ,或者如果您不更改任何设置,则只需重用实际构造的 CaptureRequest 。
即使是这种偶尔的捕获,您也可能希望将预览表面作为目标包含在 YUV 捕获请求中,以便在显示的预览中没有跳过的帧。
我想根据 API 将应用程序从 Camera1 扩展到 Camera2。该应用程序的一个核心机制在于以每秒约 20 张图片的速度拍摄预览图片。使用 Camera1,我意识到通过创建一个 SurfaceView,在其支架上添加一个回调,并在创建表面后通过定期 setOneShotPreviewCallbacks 访问预览图片。这非常简单可靠。
现在,在研究Camera2时,我来了"from the end"并设法将YUV420_888转换为Bitmap(见YUV420_888 to Bitmap Conversion)。然而,我现在正在为 "capture technique" 苦苦挣扎。从 Google 示例中,我看到您需要使用 CameraDevice.TEMPLATE_PREVIEW 创建 "setRepeating" CaptureRequest 以显示预览,例如表面上看。那也行。但是,为了拍摄实际照片,我需要使用(这次)builder.addTarget(imageReader.getSurface()) 发出另一个捕获请求。 IE。数据将在 imageReader 的 onImageAvailable 方法中可用。
问题:创建 captureRequest 是一项相当繁重的操作,在我的设备上大约需要 200 毫秒。因此,使用捕获请求(无论是使用模板 STILL_CAPTUR 还是使用 PREVIEW)都不可能成为每秒捕获 20 张图像的可行方法,因为我需要它。我在这里找到的关于 SO 的建议主要基于(教育效率适中)Google 示例,我不太理解...
我觉得解决方案必须是为 ImageReader 提供连续的预览图片流,可以按给定的频率从那里挑选。有人可以就如何实施这一点提供一些指导吗?非常感谢。
如果您想为每一帧都向预览 SurfaceView 和 YUV ImageReader 发送缓冲区,只需将这两个 Surface 作为目标添加到重复预览请求中。
通常,捕获请求可以针对 会话的配置输出目标。
此外,如果您只想使用 .capture() 偶尔捕获一个帧到 YUV ImageReader,则不必每次都重新创建捕获请求构建器;只需在同一个构建器上再次调用 .build() ,或者如果您不更改任何设置,则只需重用实际构造的 CaptureRequest 。
即使是这种偶尔的捕获,您也可能希望将预览表面作为目标包含在 YUV 捕获请求中,以便在显示的预览中没有跳过的帧。