運行 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 類型編解碼器使用
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 內部流:
- 帶有
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 測試