运行 Android 10 的设备支持 HEIC 压缩图像格式,这是一种高效视频编码 (HEVC) 特定的高效图像文件格式 (HEIF) 品牌,如 ISO/IEC 23008-12 中所述。与 JPEG 文件相比,HEIC 编码的图像在提供更佳图像质量的同时,文件大小更小。
HEIC 图像由相机框架生成,该框架从 相机 HAL 请求未压缩的图像,并将其发送到媒体子系统,以便由 HEIC 或 HEVC 编码器进行编码。
要求
要支持 HEIC 图像格式,您的设备必须具有硬件编码器,该编码器支持 MIMETYPE_IMAGE_ANDROID_HEIC
或 MIMETYPE_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_DEFINED
或YCBCR_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.orientation
和 android.jpeg.quality
元数据标记用于控制 HEIC 图像的方向和质量。
要在应用中使用 HEIC 格式,请使用 HEIC 公共 API。
如需了解详情,请参阅以下来源。
相机 HAL
图形缓冲区数据空间
图形缓冲区使用空间
验证
要验证您的实现是否支持 HEIC 图像,请使用 TestingCamera2
测试应用并运行以下相机 CTS 和 VTS 测试。
相机 CTS 测试
NativeImageReaderTest#testHeic
ImageReaderTest#testHeic
ImageReaderTest#testRepeatingHeic
ReprocessCaptureTest#testBasicYuvToHeicReprocessing
ReprocessCaptureTest#testBasicOpaqueToHeicReprocessing
RobustnessTest#testMandatoryOutputCombinations
StillCaptureTest#testHeicExif
相机 VTS 测试