Các thiết bị chạy Android 10 hỗ trợ định dạng hình ảnh nén HEIC, một thương hiệu cụ thể của định dạng tệp hình ảnh hiệu quả cao (HEIF) là chuẩn mã hoá video hiệu quả cao (HEVC) theo quy định trong ISO/IEC 23008-12. Hình ảnh được mã hoá bằng HEIC có chất lượng hình ảnh tốt hơn với kích thước tệp nhỏ hơn so với tệp JPEG.
Hình ảnh HEIC được tạo bằng khung camera yêu cầu hình ảnh chưa nén từ HAL camera và gửi hình ảnh đó đến hệ thống con đa phương tiện để được mã hoá bằng bộ mã hoá HEIC hoặc HEVC.
Yêu cầu
Để hỗ trợ định dạng hình ảnh HEIC, thiết bị của bạn phải có một bộ mã hoá phần cứng hỗ trợ MIMETYPE_IMAGE_ANDROID_HEIC
hoặc MIMETYPE_VIDEO_HEVC
với chế độ chất lượng không đổi.
Triển khai
Để hỗ trợ định dạng hình ảnh HEIC trên thiết bị, hãy triển khai bộ mã hoá và giải mã HEIC/HEVC, đồng thời hỗ trợ các cấu hình luồng cần thiết, đó là các luồng IMPLEMENTATION_DEFINED
/YUV
và các luồng phân đoạn ứng dụng JPEG.
Nội dung nghe nhìn
Triển khai bộ mã hoá và giải mã HEIC/HEVC ở chế độ chất lượng không đổi (CQ) cho phần cứng tương ứng như sau:
- Bộ mã hoá và giải mã loại HEVC sử dụng định dạng
IMPLEMENTATION_DEFINED
với mức sử dụngGRALLOC_USAGE_HW_VIDEO_ENCODER
hoặc định dạngHAL_PIXEL_FORMAT_YCBCR_420_888
tuỳ thuộc vào kích thước hình ảnh. - Bộ mã hoá và giải mã loại HEIC sử dụng định dạng
IMPLEMENTATION_DEFINED
với mức sử dụngGRALLOC_USAGE_HW_IMAGE_ENCODER
.
Camera
Trong siêu dữ liệu tĩnh, hãy đặt ANDROID_HEIC_INFO_SUPPORTED
thành true và ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT
thành một giá trị trong khoảng [1, 16]
, cho biết số lượng phân đoạn ứng dụng JPEG.
Đối với mỗi tổ hợp luồng bắt buộc, thiết bị camera của bạn phải hỗ trợ việc hoán đổi luồng JPEG với luồng HEIC có cùng kích thước.
Đối với luồng đầu ra HEIC tại API công khai, dịch vụ camera sẽ tạo ra 2 luồng nội bộ HAL:
- Luồng BLOB có cờ sử dụng
JPEG_APPS_SEGMENT
để lưu trữ các phân đoạn ứng dụng, bao gồm cả phân đoạn EXIF và hình thu nhỏ - Luồng
IMPLEMENTATION_DEFINED
hoặcYCBCR_420_888
có kích thước của luồng HEIC, tuỳ thuộc vào bộ mã hoá và giải mã đích cũng như kích thước luồng HEIC
Dựa trên ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT
, khung camera sẽ phân bổ các vùng đệm đủ lớn để HAL camera điền vào các phân đoạn ứng dụng JPEG. Phân đoạn APP1
là bắt buộc nhưng các phân đoạn sau phân đoạn APP1
(APP2
trở lên) là không bắt buộc. Khung camera sẽ ghi đè các thẻ EXIF trong phân đoạn APP1
có thể được lấy từ siêu dữ liệu kết quả chụp hoặc liên quan đến luồng bit hình ảnh chính và gửi chúng đến MediaMuxer
.
Vì bộ mã hoá nội dung nghe nhìn nhúng hướng vào siêu dữ liệu của hình ảnh đầu ra, nên để đảm bảo hướng nhất quán giữa hình ảnh chính và hình thu nhỏ, HAL máy ảnh không được xoay hình thu nhỏ dựa trên android.jpeg.orientation.
Khung sẽ ghi hướng vào siêu dữ liệu EXIF và vùng chứa HEIC.
Các thẻ siêu dữ liệu tĩnh, thẻ siêu dữ liệu kiểm soát và thẻ siêu dữ liệu động liên quan đến định dạng JPEG cũng áp dụng cho định dạng HEIC. Ví dụ: các thẻ siêu dữ liệu android.jpeg.orientation
và android.jpeg.quality
trong yêu cầu chụp được dùng để kiểm soát hướng và chất lượng của hình ảnh HEIC.
Để sử dụng định dạng HEIC trong một ứng dụng, hãy dùng API công khai HEIC.
Để biết thêm thông tin, hãy xem các nguồn sau.
HAL máy ảnh
Không gian dữ liệu vùng đệm đồ hoạ
Không gian sử dụng vùng đệm đồ hoạ
Xác nhận kết quả
Để xác thực rằng chế độ triển khai của bạn hỗ trợ hình ảnh HEIC, hãy sử dụng ứng dụng kiểm thử TestingCamera2
và chạy các kiểm thử CTS và VTS sau đây cho camera.
Các kiểm thử CTS của camera
NativeImageReaderTest#testHeic
ImageReaderTest#testHeic
ImageReaderTest#testRepeatingHeic
ReprocessCaptureTest#testBasicYuvToHeicReprocessing
ReprocessCaptureTest#testBasicOpaqueToHeicReprocessing
RobustnessTest#testMandatoryOutputCombinations
StillCaptureTest#testHeicExif
Các bài kiểm thử VTS của camera