【问题标题】:Camera2 get continuous access to camera preview imagesCamera2 可以连续访问相机预览图像
【发布时间】:2016-07-03 01:42:52
【问题描述】:

我想根据 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 提供连续的预览图片流,可以从那里以给定的频率从中挑选。有人可以就如何实现这一点提供一些指导吗?非常感谢。

【问题讨论】:

  • 抱歉,忘记添加android标签了。
  • 你能解决吗?

标签: android preview capture camera2


【解决方案1】:

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

通常,捕获请求可以针对 会话配置的输出目标。

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

即使是偶尔捕获,您也可能希望将预览 Surface 作为目标包含在 YUV 捕获请求中,这样在显示的预览中就不会出现跳帧。

【讨论】:

  • 谢谢 Eddy,这很有帮助,而且听起来很直观。但是,为了有效地实现它,我认为需要更详细地研究 Camera2,因为我仍然不了解许多方面(例如线程的作用)。我会回到这里,接受您的回答,并希望能够发布一些对其他人也有帮助的代码。也许在那之前我会有一些后续问题......再次感谢。
  • 我快要放弃了。每次我将 imageReader 添加为附加目标时,预览不再可见,或者我遇到崩溃“无法使用未配置的表面”。此外,我搜索了很多小时以获取通过 imagereader(我认为是一个相当基本的应用程序)获取预览图片的完整示例,但我没有找到任何内容。我试图尽可能简化谷歌示例,但评估各个部分与我的问题的相关性仍然太复杂......
  • 很抱歉听到这个消息。 “不能使用未配置的表面”意味着您没有将 ImageReader Surface 作为 CameraDevice.createCaptureSession 参数的一部分。您需要两个 Surfaces 作为 createCaptureSession 的参数,然后是使用 setRepeatingRequest 提交的 CaptureRequest。一个重要的细节:确保在完成后立即关闭从 ImageReader 收到的图像;否则一切都会停止(阅读器中有固定数量的缓冲区,如果无法填充空的缓冲区,相机就会停止)。
  • 那是缺少的链接!唯一的问题确实是我没有将 ImageReaders 的表面添加到 mCameraDevice.createCaptureSession()...的 Arrays.asList(...) 参数中。如此简单。谢谢你,艾迪!现在我非常期待与 Camera2 合作!
猜你喜欢
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多