HEIF 图像

运行 Android 10 的设备支持 HEIC 压缩图像格式,这是一种高效视频编码 (HEVC) 特定的高效图像文件格式 (HEIF) 品牌,如 ISO/IEC 23008-12 中所述。与 JPEG 文件相比,HEIC 编码的图像在提供更佳图像质量的同时,文件大小更小。

HEIC 图像由相机框架生成,该框架从 相机 HAL 请求未压缩的图像,并将其发送到媒体子系统,以便由 HEIC 或 HEVC 编码器进行编码。

要求

要支持 HEIC 图像格式,您的设备必须具有硬件编码器,该编码器支持 MIMETYPE_IMAGE_ANDROID_HEICMIMETYPE_VIDEO_HEVC 以及 恒定质量模式

实现

要在您的设备上支持 HEIC 图像格式,请实现 HEIC/HEVC 编解码器并提供对所需流配置的支持,这些配置包括 IMPLEMENTATION_DEFINED/YUV 流和 JPEG 应用段流。

媒体

按如下方式在恒定质量 (CQ) 模式下为相应的硬件实现 HEIC/HEVC 编解码器

  • HEVC 类型编解码器使用 IMPLEMENTATION_DEFINED 格式(带有 GRALLOC_USAGE_HW_VIDEO_ENCODER 用法)或 HAL_PIXEL_FORMAT_YCBCR_420_888 格式(具体取决于图像大小)。
  • HEIC 类型编解码器使用 IMPLEMENTATION_DEFINED 格式(带有 GRALLOC_USAGE_HW_IMAGE_ENCODER 用法)。

相机

在静态元数据中,将 ANDROID_HEIC_INFO_SUPPORTED 设置为 true,并将 ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT 设置为介于 [1, 16] 之间的值,以指示 JPEG 应用段的数量。

对于每个强制性流组合,您的相机设备必须支持将 JPEG 流与大小相同的 HEIC 流交换。

对于公共 API 处的 HEIC 输出流,相机服务会创建两个 HAL 内部流

  • 一个 BLOB 流,带有 JPEG_APPS_SEGMENT 用法标志,用于存储应用段(包括 EXIF 和缩略图段)
  • 一个 IMPLEMENTATION_DEFINEDYCBCR_420_888 流,大小与 HEIC 流的大小相同,具体取决于目标编解码器和 HEIC 流大小

根据 ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT,相机框架会分配足够大的缓冲区,供相机 HAL 填充 JPEG 应用段。APP1 段是必需的,但 APP1 段之后的段(APP2 及更高段)是可选的。相机框架会覆盖 APP1 段中可从捕获结果元数据派生或与主图像位流相关的 EXIF 标记,并将其发送到 MediaMuxer

由于媒体编码器将方向嵌入到输出图像的元数据中,为了确保主图像和缩略图之间方向一致,相机 HAL 不得根据 android.jpeg.orientation. 旋转缩略图。框架会将方向写入 EXIF 元数据和 HEIC 容器。

与 JPEG 格式相关的静态、控制和动态元数据标记也适用于 HEIC 格式。例如,捕获请求中的 android.jpeg.orientationandroid.jpeg.quality 元数据标记用于控制 HEIC 图像的方向和质量。

要在应用中使用 HEIC 格式,请使用 HEIC 公共 API

如需了解详情,请参阅以下来源。

相机 HAL

图形缓冲区数据空间

图形缓冲区使用空间

验证

要验证您的实现是否支持 HEIC 图像,请使用 TestingCamera2 测试应用并运行以下相机 CTS 和 VTS 测试。

相机 CTS 测试

相机 VTS 测试