如何为我的 Android 相机应用程序选择 ImageReader 缓冲区类型?

How do I choose an ImageReader buffer type for my Android camera app?

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

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

一些 Android 设备(例如 Nexus 7 2013)如果 ImageReader 配置为提供 RGBA_8888:

则工作得更好
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 转换为a Bitmap 在继续之前。

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

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

您应该检查设备 StreamConfigurationMap 中支持的格式列表,而不是盲目尝试一些 - 虽然某些设备可能支持未在其官方列表中列出的随机格式,但并不能保证有多好他们会这样做的。

JPEG 捕获往往较慢,因为 LEGACY-level 设备假定当您需要 JPEG 时,您需要最大的静态捕获质量,这比仅预览帧需要更多 post-processing;另外,LEGACY 设备可能会进行闪光测光和闪光。 LIMITED 或更好的设备允许您控制 post-processing 质量,因此它不受输出格式的限制,并且通常还支持更高分辨率的 YUV 捕获。

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

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