Android 9 đã ra mắt tính năng hỗ trợ API cho các thiết bị nhiều máy ảnh thông qua một thiết bị máy ảnh logic mới bao gồm hai hoặc nhiều thiết bị máy ảnh thực tế hướng về cùng một hướng. Thiết bị máy ảnh logic được hiển thị dưới dạng một CameraDevice/CaptureSession duy nhất cho một ứng dụng cho phép tương tác với các tính năng nhiều máy ảnh tích hợp HAL. Các ứng dụng có thể tuỳ ý truy cập và kiểm soát các luồng máy ảnh thực tế, siêu dữ liệu và các chế độ điều khiển cơ bản.
Hình 1 Hỗ trợ nhiều camera
Trong sơ đồ này, các mã nhận dạng máy ảnh khác nhau được mã hoá bằng màu sắc. Ứng dụng có thể truyền trực tuyến vùng đệm thô từ mỗi máy ảnh thực tế cùng một lúc. Bạn cũng có thể đặt các chế độ điều khiển riêng biệt và nhận siêu dữ liệu riêng biệt từ các máy ảnh thực tế khác nhau.
Ví dụ và nguồn
Bạn phải quảng cáo thiết bị nhiều máy ảnh bằng chức năng nhiều máy ảnh logic.
Ứng dụng máy ảnh có thể truy vấn mã nhận dạng máy ảnh của các thiết bị thực tế mà một máy ảnh logic cụ thể được tạo bằng cách gọi getPhysicalCameraIds()
.
Sau đó, các mã nhận dạng được trả về trong kết quả sẽ được dùng để kiểm soát từng thiết bị thực tế thông qua setPhysicalCameraId()
.
Bạn có thể truy vấn kết quả của các yêu cầu riêng lẻ đó từ kết quả đầy đủ bằng cách gọi getPhysicalCameraResults()
.
Các yêu cầu về máy ảnh thực tế riêng lẻ có thể chỉ hỗ trợ một số thông số hạn chế. Để nhận danh sách các tham số được hỗ trợ, nhà phát triển có thể gọi getAvailablePhysicalCameraRequestKeys()
.
Luồng camera thực chỉ được hỗ trợ cho các yêu cầu không tái xử lý và chỉ dành cho cảm biến đơn sắc và cảm biến bayer.
Triển khai
Danh sách kiểm tra hỗ trợ
Cách thêm thiết bị nhiều máy ảnh logic ở phía HAL:
- Thêm tính năng
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
cho mọi thiết bị máy ảnh logic được hỗ trợ bởi hai hoặc nhiều máy ảnh thực cũng hiển thị với ứng dụng. - Điền danh sách mã nhận dạng máy ảnh thực vào trường siêu dữ liệu
ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS
tĩnh. - Điền siêu dữ liệu tĩnh liên quan đến độ sâu cần thiết để liên kết giữa các pixel của luồng máy ảnh thực:
ANDROID_LENS_POSE_ROTATION
,ANDROID_LENS_POSE_TRANSLATION
,ANDROID_LENS_INTRINSIC_CALIBRATION
,ANDROID_LENS_DISTORTION
,ANDROID_LENS_POSE_REFERENCE
. Đặt trường siêu dữ liệu
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE
tĩnh thành:ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE
: Đối với cảm biến ở chế độ chính-chính, không có chế độ đồng bộ hoá màn trập/độ phơi sáng phần cứng.ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED
: Đối với cảm biến ở chế độ chính-phụ, đồng bộ hoá màn trập/độ phơi sáng phần cứng.
Điền vào
ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS
danh sách các tham số được hỗ trợ cho từng máy ảnh thực. Danh sách có thể trống nếu thiết bị logic không hỗ trợ các yêu cầu riêng lẻ.Nếu hỗ trợ các yêu cầu riêng lẻ, hãy xử lý và áp dụng từng
physicalCameraSettings
có thể đến trong các yêu cầu chụp và thêm từngphysicalCameraMetadata
tương ứng.Đối với các phiên bản thiết bị Camera HAL 3.5 (ra mắt trong Android 10) trở lên, hãy điền khoá kết quả
ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID
bằng mã nhận dạng của máy ảnh thực tế đang hoạt động hiện đang hỗ trợ máy ảnh logic.
Đối với các thiết bị chạy Android 9, thiết bị máy ảnh phải hỗ trợ việc thay thế một luồng YUV/RAW logic bằng các luồng thực có cùng kích thước (không áp dụng cho luồng RAW) và cùng định dạng từ hai máy ảnh thực. Điều này không áp dụng cho các thiết bị chạy Android 10.
Đối với các thiết bị chạy Android 10 có phiên bản thiết bị HAL máy ảnh là 3.5 trở lên, thiết bị máy ảnh phải hỗ trợ isStreamCombinationSupported
để ứng dụng truy vấn xem một tổ hợp luồng cụ thể có chứa luồng thực tế có được hỗ trợ hay không.
Bản đồ cấu hình luồng
Đối với máy ảnh logic, các tổ hợp luồng bắt buộc cho thiết bị máy ảnh ở một cấp phần cứng nhất định giống với yêu cầu trong CameraDevice.createCaptureSession
.
Tất cả luồng trong bản đồ cấu hình luồng phải là luồng logic.
Đối với thiết bị máy ảnh logic hỗ trợ tính năng RAW với các máy ảnh phụ thực có kích thước khác nhau, nếu một ứng dụng định cấu hình luồng RAW logic, thì thiết bị máy ảnh logic không được chuyển sang máy ảnh phụ thực có kích thước cảm biến khác nhau. Điều này đảm bảo rằng các ứng dụng chụp RAW hiện có không bị lỗi.
Để tận dụng tính năng thu phóng quang học do HAL triển khai bằng cách chuyển đổi giữa các máy ảnh phụ thực tế trong quá trình chụp ảnh RAW, ứng dụng phải định cấu hình luồng máy ảnh phụ thực tế thay vì luồng RAW logic.
Tổ hợp luồng được đảm bảo
Cả máy ảnh logic và máy ảnh thực tế cơ bản của máy ảnh đó đều phải đảm bảo các tổ hợp luồng bắt buộc cần thiết cho các cấp thiết bị của chúng.
Thiết bị máy ảnh logic phải hoạt động giống như thiết bị máy ảnh thực dựa trên cấp độ phần cứng và chức năng của thiết bị. Bạn nên đặt bộ tính năng của máy ảnh này là tập hợp con của bộ tính năng của từng máy ảnh thực tế.
Trên các thiết bị chạy Android 9, đối với mỗi tổ hợp luồng được đảm bảo, máy ảnh logic phải hỗ trợ:
Thay thế một luồng YUV_420_888 logic hoặc luồng thô bằng hai luồng thực có cùng kích thước và định dạng, mỗi luồng từ một máy ảnh thực riêng biệt, với điều kiện là kích thước và định dạng được máy ảnh thực hỗ trợ.
Thêm hai luồng thô, một luồng từ mỗi máy ảnh thực, nếu máy ảnh logic không quảng cáo khả năng RAW nhưng các máy ảnh thực cơ bản thì có. Điều này thường xảy ra khi các máy ảnh thực có kích thước cảm biến khác nhau.
Sử dụng luồng thực thay vì luồng logic có cùng kích thước và định dạng. Điều này không được làm chậm tốc độ khung hình của bản ghi khi thời lượng khung hình tối thiểu của luồng vật lý và luồng logic giống nhau.
Những điểm cần cân nhắc về hiệu suất và nguồn điện
Hiệu suất:
- Việc định cấu hình và truyền trực tuyến các luồng thực có thể làm chậm tốc độ chụp của camera logic do các hạn chế về tài nguyên.
- Việc áp dụng chế độ cài đặt máy ảnh thực tế có thể làm chậm tốc độ chụp nếu các máy ảnh cơ bản được đặt ở các tốc độ khung hình khác nhau.
Nguồn điện:
- Tính năng tối ưu hoá nguồn điện của HAL vẫn tiếp tục hoạt động trong trường hợp mặc định.
- Việc định cấu hình hoặc yêu cầu luồng thực tế có thể ghi đè tính năng tối ưu hoá nguồn điện nội bộ của HAL và tiêu tốn nhiều điện năng hơn.
Tuỳ chỉnh
Bạn có thể tuỳ chỉnh cách triển khai thiết bị theo các cách sau.
- Đầu ra kết hợp của thiết bị máy ảnh logic hoàn toàn phụ thuộc vào việc triển khai HAL. Quyết định về cách các luồng logic hợp nhất được lấy từ máy ảnh thực tế sẽ được ứng dụng và khung máy ảnh Android hiển thị một cách minh bạch.
- Bạn có thể chọn hỗ trợ các yêu cầu và kết quả riêng lẻ về địa điểm thực tế. Tập hợp các tham số có sẵn trong các yêu cầu như vậy cũng hoàn toàn phụ thuộc vào cách triển khai HAL cụ thể.
- Kể từ Android 10, HAL có thể giảm số lượng máy ảnh mà ứng dụng có thể mở trực tiếp bằng cách chọn không quảng cáo một số hoặc tất cả PHYSICAL_ID trong
getCameraIdList
. Sau đó, lệnh gọigetPhysicalCameraCharacteristics
phải trả về các đặc điểm của máy ảnh thực.
Xác nhận kết quả
Các thiết bị nhiều máy ảnh logic phải vượt qua CTS máy ảnh như mọi máy ảnh thông thường khác.
Bạn có thể tìm thấy các trường hợp kiểm thử nhắm đến loại thiết bị này trong mô-đun LogicalCameraDeviceTest
.
Ba bài kiểm thử ITS này nhắm đến các hệ thống nhiều camera để hỗ trợ việc hợp nhất hình ảnh đúng cách:
scene1/test_multi_camera_match.py
scene4/test_multi_camera_alignment.py
sensor_fusion/test_multi_camera_frame_sync.py
Các kiểm thử cảnh 1 và cảnh 4 chạy bằng thiết bị kiểm thử ITS-in-a-box. Kiểm thử test_multi_camera_match
xác nhận rằng độ sáng của tâm hình ảnh khớp nhau khi cả hai camera đều được bật. Quy trình kiểm thử test_multi_camera_alignment
xác nhận rằng khoảng cách, hướng và các tham số méo của máy ảnh được tải đúng cách. Nếu hệ thống nhiều camera có máy ảnh FoV rộng (>90o), thì bạn phải dùng hộp ITS phiên bản rev2.
Sensor_fusion
là thiết bị thử nghiệm thứ hai cho phép chuyển động điện thoại được lặp lại, theo quy định và xác nhận rằng dấu thời gian của con quay hồi chuyển và cảm biến hình ảnh khớp nhau cũng như các khung hình của nhiều máy ảnh đồng bộ với nhau.
Tất cả các hộp đều có sẵn thông qua AcuSpec, Inc. (www.acuspecinc.com, fred@acuspecinc.com) và MYWAY Manufacturing (www.myway.tw, sales@myway.tw). Ngoài ra, bạn có thể mua hộp ITS rev1 thông qua West-Mark (www.west-mark.com, dgoodman@west-mark.com).
Các phương pháp hay nhất
Để khai thác tối đa các tính năng do nhiều máy ảnh hỗ trợ trong khi vẫn duy trì khả năng tương thích của ứng dụng, hãy làm theo các phương pháp hay nhất sau đây khi triển khai thiết bị nhiều máy ảnh logic:
- (Android 10 trở lên) Ẩn máy ảnh phụ thực tế khỏi
getCameraIdList
. Điều này làm giảm số lượng máy ảnh mà ứng dụng có thể mở trực tiếp, giúp ứng dụng không cần phải có logic lựa chọn máy ảnh phức tạp. - (Android 11 trở lên) Đối với thiết bị nhiều camera logic hỗ trợ tính năng thu phóng quang học, hãy triển khai API
ANDROID_CONTROL_ZOOM_RATIO
và chỉ sử dụngANDROID_SCALER_CROP_REGION
để cắt theo tỷ lệ khung hình.ANDROID_CONTROL_ZOOM_RATIO
cho phép thiết bị thu nhỏ và duy trì độ chính xác tốt hơn. Trong trường hợp này, HAL phải điều chỉnh hệ toạ độ củaANDROID_SCALER_CROP_REGION
,ANDROID_CONTROL_AE_REGIONS
,ANDROID_CONTROL_AWB_REGIONS
,ANDROID_CONTROL_AF_REGIONS
,ANDROID_STATISTICS_FACE_RECTANGLES
vàANDROID_STATISTICS_FACE_LANDMARKS
để coi trường nhìn sau khi thu phóng là mảng cảm biến đang hoạt động. Để biết thêm thông tin về cáchANDROID_SCALER_CROP_REGION
hoạt động cùng vớiANDROID_CONTROL_ZOOM_RATIO
, hãy xemcamera3_crop_reprocess#cropping
. - Đối với các thiết bị nhiều camera có máy ảnh thực có nhiều tính năng, hãy đảm bảo thiết bị chỉ quảng cáo hỗ trợ một giá trị hoặc phạm vi nhất định cho một chế độ điều khiển nếu toàn bộ phạm vi thu phóng hỗ trợ giá trị hoặc phạm vi đó. Ví dụ: nếu máy ảnh logic bao gồm máy ảnh siêu rộng, máy ảnh rộng và máy ảnh tele, hãy làm như sau:
- Nếu kích thước mảng đang hoạt động của các máy ảnh thực tế khác nhau, thì HAL máy ảnh phải liên kết từ mảng đang hoạt động của máy ảnh thực tế đến mảng đang hoạt động của máy ảnh logic cho
ANDROID_SCALER_CROP_REGION
,ANDROID_CONTROL_AE_REGIONS
,ANDROID_CONTROL_AWB_REGIONS
,ANDROID_CONTROL_AF_REGIONS
,ANDROID_STATISTICS_FACE_RECTANGLES
vàANDROID_STATISTICS_FACE_LANDMARKS
để từ góc độ của ứng dụng, hệ toạ độ là kích thước mảng đang hoạt động của máy ảnh logic. - Nếu máy ảnh góc rộng và máy ảnh tele hỗ trợ tự động lấy nét, nhưng máy ảnh góc siêu rộng là lấy nét cố định, hãy đảm bảo máy ảnh logic quảng cáo tính năng hỗ trợ tự động lấy nét. HAL phải mô phỏng một máy trạng thái tự động lấy nét cho máy ảnh góc siêu rộng để khi ứng dụng thu nhỏ đến ống kính góc siêu rộng, ứng dụng sẽ biết được máy ảnh thực tế cơ bản đang lấy nét cố định và máy trạng thái tự động lấy nét cho các chế độ AF được hỗ trợ sẽ hoạt động như dự kiến.
- Nếu máy ảnh góc rộng và máy ảnh tele hỗ trợ 4K ở tốc độ 60 khung hình/giây, còn máy ảnh góc siêu rộng chỉ hỗ trợ 4K ở tốc độ 30 khung hình/giây hoặc 1080p ở tốc độ 60 khung hình/giây nhưng không hỗ trợ 4K ở tốc độ 60 khung hình/giây, hãy đảm bảo máy ảnh logic không quảng cáo 4K ở tốc độ 60 khung hình/giây trong các cấu hình luồng được hỗ trợ. Điều này đảm bảo tính toàn vẹn của các chức năng máy ảnh logic, đảm bảo rằng ứng dụng sẽ không gặp phải vấn đề không đạt được 4k ở tốc độ 60 fps với giá trị
ANDROID_CONTROL_ZOOM_RATIO
dưới 1.
- Nếu kích thước mảng đang hoạt động của các máy ảnh thực tế khác nhau, thì HAL máy ảnh phải liên kết từ mảng đang hoạt động của máy ảnh thực tế đến mảng đang hoạt động của máy ảnh logic cho
- Kể từ Android 10, bạn không cần phải có nhiều máy ảnh logic để hỗ trợ các tổ hợp luồng bao gồm cả luồng thực.
Nếu HAL hỗ trợ kết hợp với luồng vật lý:
- (Android 11 trở lên) Để xử lý tốt hơn các trường hợp sử dụng như chiều sâu từ âm thanh nổi và tính năng theo dõi chuyển động, hãy đặt trường nhìn của đầu ra luồng thực tế lớn nhất có thể đạt được bằng phần cứng. Tuy nhiên, nếu luồng thực và luồng logic bắt nguồn từ cùng một máy ảnh thực, thì các giới hạn về phần cứng có thể buộc trường nhìn của luồng thực phải giống với luồng logic.
- Để giải quyết áp lực bộ nhớ do nhiều luồng thực gây ra, hãy đảm bảo ứng dụng sử dụng
discardFreeBuffers
để phân bổ lại vùng đệm trống (vùng đệm do người dùng giải phóng nhưng nhà sản xuất chưa loại bỏ khỏi hàng đợi) nếu luồng thực dự kiến sẽ ở trạng thái rảnh trong một khoảng thời gian. - Nếu các luồng thực tế từ nhiều máy ảnh thực tế thường không được đính kèm vào cùng một yêu cầu, hãy đảm bảo rằng các ứng dụng sử dụng
surface group
để một hàng đợi bộ đệm được dùng để sao lưu hai nền tảng hướng đến ứng dụng, giảm mức sử dụng bộ nhớ.