Android 9 đã giới thiệu tính năng hỗ trợ API cho các thiết bị có nhiều camera thông qua một thiết bị camera logic mới bao gồm 2 hoặc nhiều thiết bị camera thực hướng về cùng một hướng. Thiết bị camera 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 camera 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 camera thực, siêu dữ liệu và 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 camera khác nhau được mã hoá bằng màu. Ứng dụng có thể truyền trực tuyến các vùng đệm thô từ mỗi camera thực cùng một lúc. Bạn cũng có thể thiết lập các chế độ kiểm soát riêng biệt và nhận siêu dữ liệu riêng biệt từ các camera thực khác nhau.
Ví dụ và nguồn
Bạn phải quảng cáo các thiết bị có nhiều camera bằng khả năng nhiều camera logic.
Ứng dụng camera có thể truy vấn mã nhận dạng camera của các thiết bị thực mà một camera logic cụ thể được tạo thành 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 để điều khiển từng thiết bị thực tế thông qua setPhysicalCameraId()
.
Bạn có thể truy vấn kết quả từ những yêu cầu riêng lẻ như vậy từ kết quả hoàn chỉnh bằng cách gọi getPhysicalCameraResults()
.
Các yêu cầu về camera thực riêng lẻ có thể chỉ hỗ trợ một số ít tham số. Để 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 xử lý lại và chỉ dành cho cảm biến đơn sắc và bayer.
Triển khai
Danh sách kiểm tra hỗ trợ
Cách thêm các thiết bị có nhiều camera logic ở phía HAL:
- Thêm chức năng
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
cho mọi thiết bị camera logic được hỗ trợ bởi 2 camera thực trở lên, đồng thời được hiển thị cho một ứng dụng. - Điền sẵn trường siêu dữ liệu tĩnh
ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS
bằng danh sách mã nhận dạng camera thực. - Điền sẵn siêu dữ liệu tĩnh liên quan đến độ sâu cần thiết để tương quan giữa các pixel của luồng camera 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 tĩnh
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE
thành:ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE
: Đối với các cảm biến ở chế độ chính-chính, không có 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ác 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 sẵn
ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS
bằng danh sách các thông số được hỗ trợ cho từng camera thực. Danh sách này 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 các yêu cầu riêng lẻ được hỗ trợ, hãy xử lý và áp dụng từng
physicalCameraSettings
có thể xuất hiện trong các yêu cầu ghi hình và thêm từngphysicalCameraMetadata
cho phù hợp.Đố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 camera vật lý đang hoạt động hiện tại hỗ trợ camera logic.
Đối với các thiết bị chạy Android 9, các thiết bị camera 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 các luồng RAW) và cùng định dạng từ 2 camera 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 camera là 3.5 trở lên, thiết bị camera phải hỗ trợ isStreamCombinationSupported
để các ứng dụng truy vấn xem một tổ hợp luồng cụ thể chứa các luồng thực có được hỗ trợ hay không.
Bản đồ cấu hình luồng
Đối với một camera logic, các tổ hợp luồng bắt buộc cho thiết bị camera ở một cấp phần cứng nhất định cũng giống như những gì được yêu cầu trong CameraDevice.createCaptureSession
.
Tất cả các luồng trong bản đồ cấu hình luồng đều phải là luồng logic.
Đối với một thiết bị camera logic hỗ trợ khả năng RAW với các camera phụ vật lý có kích thước khác nhau, nếu một ứng dụng định cấu hình một luồng RAW logic, thì thiết bị camera logic không được chuyển sang các camera phụ vật lý 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 ảnh thô 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 camera phụ vật lý trong quá trình chụp ảnh RAW, các ứng dụng phải định cấu hình các luồng camera phụ vật lý thay vì luồng RAW logic.
Đảm bảo kết hợp luồng
Cả camera logic và các camera thực tế cơ bản của camera đó đều phải đảm bảo các tổ hợp luồng bắt buộc cần thiết cho cấp độ thiết bị của chúng.
Thiết bị camera logic phải hoạt động giống như thiết bị camera thực dựa trên cấp độ phần cứng và các chức năng của thiết bị. Bạn nên sử dụng bộ tính năng là một siêu tập hợp của bộ tính năng của từng camera thực.
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, camera logic phải hỗ trợ:
Thay thế một luồng YUV_420_888 hoặc luồng thô logic 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 camera thực riêng biệt, với điều kiện là các camera thực hỗ trợ kích thước và định dạng đó.
Thêm 2 luồng thô, mỗi luồng từ một camera thực, nếu camera logic không quảng cáo khả năng RAW, nhưng các camera thực cơ bản thì có. Điều này thường xảy ra khi các camera thực có kích thước cảm biến khác nhau.
Sử dụng các luồng thực tế thay vì một luồng logic có cùng kích thước và định dạng. Việc này không được làm giảm tốc độ khung hình của quá trình ghi hình khi thời lượng khung hình tối thiểu của luồng vật lý và luồng logic là như nhau.
Những điểm cần cân nhắc về hiệu suất và mức tiêu thụ điện
Hiệu suất:
- Việc định cấu hình và truyền trực tuyến các luồng vật lý có thể làm giảm tốc độ chụp của camera logic do hạn chế về tài nguyên.
- Việc áp dụng chế độ cài đặt camera thực có thể làm giảm tốc độ chụp nếu các camera cơ bản được đặt ở tốc độ khung hình khác nhau.
Nguồn điện:
- Tính năng tối ưu hoá nguồn của HAL vẫn hoạt động trong trường hợp mặc định.
- Việc định cấu hình hoặc yêu cầu các luồng thực có thể ghi đè chế độ tối ưu hoá năng lượng nội bộ của HAL và tiêu thụ nhiều năng lượng hơn.
Tuỳ chỉnh
Bạn có thể tuỳ chỉnh việc triển khai thiết bị theo các cách sau.
- Đầu ra kết hợp của thiết bị camera 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 kết hợp được lấy từ camera thực là hoàn toàn minh bạch đối với ứng dụng và khung camera Android.
- Bạn có thể chọn hỗ trợ các yêu cầu và kết quả riêng lẻ về thể chất. Tập hợp các tham số có sẵn trong những yêu cầu như vậy cũng hoàn toàn phụ thuộc vào việc triển khai HAL cụ thể.
- Từ Android 10, HAL có thể giảm số lượng camera 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 đó, việc gọigetPhysicalCameraCharacteristics
phải trả về các đặc điểm của camera thực.
Xác nhận kết quả
Các thiết bị có nhiều camera logic phải vượt qua CTS camera giống như mọi camera 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
.
3 bài kiểm thử ITS này nhắm đến các hệ thống nhiều camera để tạo điều kiện thuận lợi cho việc kết hợp 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 bài kiểm thử cảnh 1 và cảnh 4 chạy bằng giàn kiểm thử ITS-in-a-box. Thử nghiệm test_multi_camera_match
khẳng định rằng độ sáng của tâm ảnh khớp nhau khi cả hai camera đều được bật. Thử nghiệm test_multi_camera_alignment
khẳng định rằng khoảng cách, hướng và các tham số biến dạng của camera được tải đúng cách. Nếu hệ thống nhiều camera có một camera có Góc nhìn rộng (>90o), thì bạn cần có phiên bản rev2 của hộp ITS.
Sensor_fusion
là một giàn thử nghiệm thứ hai cho phép chuyển động lặp lại, được chỉ định của điện thoại và khẳng định 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 và các khung hình nhiều camera được đồng bộ hoá.
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
Để tận dụng tối đa các tính năng do nhiều camera mang lại 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 camera logic:
- (Android 10 trở lên) Ẩn các camera phụ thực khỏi
getCameraIdList
. Điều này làm giảm số lượng camera mà ứng dụng có thể mở trực tiếp, giúp ứng dụng không cần phải có logic chọn camera phức tạp. - (Android 11 trở lên) Đối với một 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ỉ 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 cao hơn. Trong trường hợp này, HAL phải điều chỉnh hệ thống 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 hoạt động của cảm biến. Để 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ị có nhiều camera vật lý với các chức năng khác nhau, hãy đảm bảo rằng thiết bị quảng cáo khả năng hỗ trợ một giá trị hoặc dải giá trị nhất định cho một chế độ điều khiển chỉ khi toàn bộ dải thu phóng hỗ trợ giá trị hoặc dải giá trị đó. Ví dụ: nếu camera logic bao gồm một camera siêu rộng, một camera rộng và một camera tiêu cự dài, hãy làm như sau:
- Nếu kích thước mảng đang hoạt động của các camera thực khác nhau, thì HAL camera phải thực hiện việc ánh xạ từ mảng đang hoạt động của các camera thực sang mảng đang hoạt động của camera 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
để theo góc độ của ứng dụng, hệ toạ độ là kích thước mảng đang hoạt động của camera logic. - Nếu camera góc rộng và camera tele hỗ trợ tính năng tự động lấy nét, nhưng camera góc siêu rộng có tiêu cự cố định, hãy đảm bảo camera logic quảng cáo hỗ trợ tính năng 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 camera góc siêu rộng để khi ứng dụng thu nhỏ đến ống kính góc siêu rộng, thực tế là camera vật lý cơ bản được lấy nét cố định sẽ trong suốt đối với ứng dụng và máy trạng thái tự động lấy nét cho các chế độ AF được hỗ trợ hoạt động như mong đợi.
- Nếu camera góc rộng và camera tele hỗ trợ 4K ở tốc độ 60 khung hình/giây, còn camera 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 camera 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 camera 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
nhỏ hơn 1.
- Nếu kích thước mảng đang hoạt động của các camera thực khác nhau, thì HAL camera phải thực hiện việc ánh xạ từ mảng đang hoạt động của các camera thực sang mảng đang hoạt động của camera logic cho
- Kể từ Android 10, bạn không cần có một hệ thống nhiều camera 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 các luồng thực tế:
- (Android 11 trở lên) Để xử lý tốt hơn các trường hợp sử dụng như độ sâu từ chế độ âm thanh nổi và tính năng theo dõi chuyển động, hãy đặt trường nhìn của các đầ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 một luồng thực và một luồng logic bắt nguồn từ cùng một camera thực, thì các hạn chế 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 tình trạng thiếu bộ nhớ do nhiều luồng thực gây ra, hãy đảm bảo rằng các ứng dụng sử dụng
discardFreeBuffers
để giải phóng các 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 đưa vào hàng đợi) nếu một 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 vật lý từ các camera vật lý khác nhau 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 dùng
surface group
để một hàng đợi bộ nhớ đệm được dùng để hỗ trợ 2 nền tảng hướng đến ứng dụng, giúp giảm mức tiêu thụ bộ nhớ.