【问题标题】:How do I choose an ImageReader buffer type for my Android camera app?如何为我的 Android 相机应用选择 ImageReader 缓冲区类型?
【发布时间】:2017-02-08 01:37:41
【问题描述】:

我有一个带有相机功能的应用程序。我正在使用 Android Camera2 API。我发现如果 ImageReader 配置为提供 JPEG,某些 Android 设备(例如 Nexus 6p、Nexus 5)会更好地工作:

imageReader = ImageReader.NewInstance(width, height, ImageFormatType.Jpeg, 2);

如果将ImageReader 配置为提供RGBA_8888,则某些Android 设备(例如Nexus 7 2013)会更好地工作:

imageReader = ImageReader.NewInstance(width, height, (ImageFormatType)1 /* PixelFormat.RGBA_8888 */, 2);

如果我使用RGBA_8888,更适合 JPEG 的设备会吐出此错误:

[ImageReader_JNI] Producer output buffer format: 0x22, ImageReader configured format: 0x1

如果我使用 JPEG,使用 RGBA 缓冲区效果更好的设备会发出此警告:(它仍然可以工作,但速度很慢,以至于捕获的图片很暗。)

[ImageReader_JNI] ImageReader_lockedImageSetup: Receiving JPEG in HAL_PIXEL_FORMAT_RGBA_8888 buffer.

我必须对我返回的内容进行一些处理,所以最终如果我可以将相机配置为只吐出某种位图而不是 JPEG 会更好,因为我必须将 JPEG 转换为 @ 987654329@,然后继续。

我应该如何选择传递给ImageReader的缓冲区类型?

【问题讨论】:

  • 您的用例是什么?单张快照(每秒捕捉次数不多)还是连续捕捉(~30fps)?
  • 我有一个预览界面,它可以连续捕捉,直到你点击拍照按钮,此时它会单次捕捉到ImageReader。

标签: android android-camera android-camera2


【解决方案1】:

所有相机设备必须支持的唯一保证格式是 YUV_420_888 和 JPEG;即便如此,LEGACY 级别的设备通常只支持最大分辨率的 JPEG(以及预览分辨率的 YUV_420_888,一般不高于 1080p)。

您应该检查设备的StreamConfigurationMap 中支持的格式列表,而不是盲目地尝试一些 - 虽然某些设备可能支持未在其官方列表中列出的随机格式,但并不能保证它们的性能如何所以。

JPEG 捕获往往较慢,因为 LEGACY 级别的设备假定当您需要 JPEG 时,您希望获得最高的静止捕获质量,这需要更多的后期处理而不仅仅是预览帧;此外,LEGACY 设备可以进行闪光测光和闪光。 LIMITED 或更好的设备允许您控制后处理质量,因此它不受输出格式的束缚,并且通常还支持更高分辨率的 YUV 捕获。

如果您想要广泛的支持,我通常会远离 RGBA - 它与 LEGACY 设备一起使用有点怪癖,LIMITED 和更好的设备不太可能支持它。

当您说 JPEG 可以工作,但速度太慢以至于捕获的图像变暗时,我有点困惑 - 为什么速度慢意味着图像变暗?还是您只是说图像变暗了?

【讨论】:

  • 在我的大多数设备上,捕捉到 JPEG 都可以。但是在这个 Nexus 7 2013 上,如果我捕捉到 YUV,颜色很好,但如果我捕捉到 JPEG,有时它很暗。我一开始以为是停止重复预览帧之类的情况,但似乎并非如此。
猜你喜欢
  • 2017-06-14
  • 2014-08-19
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多