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

标签 android preview capture camera2

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

现在,在研究 Camera2 时,我“从头开始”并设法将 YUV420_888 转换为位图(参见 YUV420_888 to Bitmap Conversion)。但是,我现在正在为“捕获技术”而苦苦挣扎。从 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 作为目标添加到重复预览请求中。

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

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

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

关于android - Camera2 可以连续访问相机预览图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36048189/

相关文章:

android - 在 API 级别 30 (Android 11) : getDefaultDisplay() and getMetrics() are now deprecated. 上获取屏幕宽度我们应该改用什么?

android - 如何使用java socket编程将android连接到oracle

android - 在 Configuration Activity 中创建 Widget 的 "Preview"

c++ - 捕获任何 Windows 应用程序的屏幕?

android - Firebase Auth (android) 电子邮件验证需要一些建议

android - 如何在 Android Studio 2.2 Preview 1 中正确使用 NDK-Build

css - 如何关闭 Eclipse 中的 CSS 预览 View ?

python - 是否可以在 PyQt 应用程序中预览 pdf?

java - 捕获 DOS(命令提示符)的输出并显示在 JAVA Frame 中

c# - 如何在 C# 中获取音频/视频和捕获设备的列表?