運行 Android 10 的裝置支援 HEIC 壓縮影像格式,這是ISO/IEC 23008-12中指定的高效視訊編碼 (HEVC) 特定品牌的高效影像檔案格式 (HEIF)。與 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 應用程式段的數量。
對於每個強制流組合,您的相機設備必須支援將 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 。
有關更多信息,請參閱以下來源。
相機哈爾
圖形緩衝區資料空間
圖形緩衝區使用空間
驗證
若要驗證您的實作是否支援 HEIC 影像,請使用TestingCamera2
測試應用程式並執行下列相機 CTS 和 VTS 測試。
相機CTS測試
NativeImageReaderTest#testHeic
-
ImageReaderTest#testHeic
-
ImageReaderTest#testRepeatingHeic
-
ReprocessCaptureTest#testBasicYuvToHeicReprocessing
-
ReprocessCaptureTest#testBasicOpaqueToHeicReprocessing
-
RobustnessTest#testMandatoryOutputCombinations
-
StillCaptureTest#testHeicExif
攝影機 VTS 測試