搭载 Android 10 的设备支持 HEIC 压缩图片格式,它是 ISO/IEC 23008-12 中规定的高效图片文件格式 (HEIF) 的高效视频编码 (HEVC) 特定品牌。与 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 类型编解码器使用具有
GRALLOC_USAGE_HW_VIDEO_ENCODER
用法的IMPLEMENTATION_DEFINED
格式或HAL_PIXEL_FORMAT_YCBCR_420_888
格式,具体取决于图片大小。 - HEIC 类型编解码器使用具有
GRALLOC_USAGE_HW_IMAGE_ENCODER
用法的IMPLEMENTATION_DEFINED
格式。
相机
在静态元数据中,将 ANDROID_HEIC_INFO_SUPPORTED
设置为 true,并将 ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT
设置为介于 [1, 16]
之间的值,以表明 JPEG 应用细分的数量。
对于每个必要的流组合,您的摄像头设备必须支持使用相同大小的 HEIC 流替换 JPEG 流。
对于公共 API 上的 HEIC 输出流,摄像头服务会创建两个 HAL 内部流:
- 具有
JPEG_APPS_SEGMENT
使用标志的 BLOB 流,可存储应用细分(包括 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 测试