HEIF 成像

運行 Android 10 的設備支持 HEIC 壓縮圖像格式,這是ISO/IEC 23008-12中指定的高效圖像文件格式 (HEIF) 的高效視頻編碼 (HEVC) 特定品牌。與 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 內部流:

  • 帶有JPEG_APPS_SEGMENT使用標誌的 BLOB 流,用於存儲應用程序段,包括 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 測試