Android 9 ra mắt tính năng hỗ trợ API cho chế độ 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ị thiết bị camera hướng theo cùng một hướng. Thiết bị camera logic là 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 dữ liệu cơ bản của camera thực, siêu dữ liệu và các nút điều khiển.
Hình 1 Hỗ trợ nhiều camera
Trong sơ đồ này, các mã nhận dạng máy ảnh được mã hoá bằng màu. Ứng dụng này có thể phát trực tuyến bộ đệm thô từ mỗi máy ảnh thực cùng lúc. Điều này cũng có thể đặt các biện pháp kiểm soát riêng biệt và nhận siêu dữ liệu riêng biệt từ camera thực.
Ví dụ và nguồn
Thiết bị có nhiều camera phải được quảng cáo kèm theo chức năng logic nhiều camera.
Ứng dụng máy ảnh có thể truy vấn mã máy ảnh của thiết bị thực mà một ứng dụng
camera logic đượ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 để điều khiển các thiết bị thực
riêng lẻ qua
setPhysicalCameraId()
.
Kết quả từ các yêu cầu riêng lẻ như vậy có thể được truy vấn từ
bằng cách gọi
getPhysicalCameraResults()
.
Từng yêu cầu camera thực tế chỉ có thể hỗ trợ một số ít
tham số. Để nhận được danh sách các thông số được hỗ trợ, nhà phát triển có thể gọi
getAvailablePhysicalCameraRequestKeys()
.
Luồng camera thực tế 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à 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 camera hợp lý ở phía HAL:
- Thêm một
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
cho bất kỳ thiết bị máy ảnh logic nào được hỗ trợ bởi ít nhất 2 camera tiếp xúc với một ứng dụng. - Điền giá trị cố định
ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS
trường siêu dữ liệu có danh sách mã nhận dạng máy ảnh thực. - Điền siêu dữ liệu tĩnh liên quan đến chiều sâu cần thiết để tương quan giữa
luồng máy ảnh thực pixel:
ANDROID_LENS_POSE_ROTATION
!ANDROID_LENS_POSE_TRANSLATION
,ANDROID_LENS_INTRINSIC_CALIBRATION
,ANDROID_LENS_DISTORTION
,ANDROID_LENS_POSE_REFERENCE
. Đặt giá trị tĩnh
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE
trường siêu dữ liệu sang:ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE
: Đối với các cảm biến ở chế độ chính-chính, việc đồng bộ hoá màn trập/phơi sáng phần cứng sẽ không được đồng bộ hoá.ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED
: Đối với cảm biến ở chế độ chính-phụ, màn trập/phơi sáng phần cứng sẽ đồng bộ hoá.
Điền
ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS
kèm theo danh sách các thông số được hỗ trợ cho từng camera thực. Chiến lược phát hành đĩa đơn 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 có yêu cầu riêng lẻ được hỗ trợ, hãy xử lý và áp dụng yêu cầu riêng lẻ
physicalCameraSettings
có thể xuất hiện như một phần của yêu cầu chụp và thêm từng thuộc tínhphysicalCameraMetadata
cho phù hợp.Đối với các phiên bản thiết bị HAL (Lớp trừu tượng phần cứng) cho Máy ảnh 3.5 (được giới thiệu trong Android 10) trở lên, điền sẵn
ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID
khoá kết quả bằng mã nhận dạng của máy ảnh thực đang hoạt động camera hợp lý.
Đối với thiết bị chạy Android 9, thiết bị có máy ảnh phải hỗ trợ thay thế một luồng YUV/RAW logic bằng các luồng vật lý của cùng kích thước (không áp dụng cho các luồng RAW) và có cùng một định dạng từ hai thiết bị camera. Đ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 của máy ảnh là
3,5
hoặc cao hơn, thiết bị máy ảnh phải hỗ trợ
isStreamCombinationSupported
để các ứng dụng truy vấn xem một tổ hợp luồng cụ thể có chứa
hỗ trợ luồng thực.
Bản đồ cấu hình luồng
Đối với camera logic, tổ hợp luồng bắt buộc cho thiết bị camera của
một cấp độ phần cứng nhất định cũng giống như yêu cầu trong
CameraDevice.createCaptureSession
.
Tất cả các luồng trong bản đồ cấu hình luồng phải là các luồng logic.
Dành cho thiết bị máy ảnh logic hỗ trợ chức năng RAW 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 luồng RAW logic, thiết bị camera logic không được chuyển sang camera phụ thực có kích thước cảm biến. Điều này giúp đảm bảo các ứng dụng chụp ảnh RAW hiện có không bị lỗi.
Để tận dụng tính năng thu phóng quang học triển khai HAL (Lớp trừu tượng phần cứng) bằng cách chuyển đổi giữa camera phụ vật lý trong khi chụp ảnh RAW, ứng dụng phải định cấu hình luồng camera phụ thực thay vì luồng RAW hợp lý.
Tổ hợp luồng được đảm bảo
Cả camera logic và camera thực cơ bản đề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 họ.
Một thiết bị camera logic phải hoạt động giống như camera thực dựa trên cấp độ phần cứng và khả năng của thiết bị đó. Bạn nên bộ tính năng là tập mẹ của từng camera thực riêng lẻ.
Trên các thiết bị chạy Android 9, với mỗi phiên bản được đảm bảo kết hợp luồng, camera logic phải hỗ trợ:
Thay thế một luồng logic YUV_420_888 hoặc luồng thô bằng hai luồng vật lý có cùng kích thước và định dạng, mỗi cụm từ một camera thực riêng biệt, do kích thước và định dạng được máy ảnh thực hỗ trợ.
Thêm 2 luồng thô, một luồng từ mỗi camera thực, nếu camera logic không quảng cáo tính năng RAW, nhưng các máy ảnh vật lý cơ bản thì có. Điều này thường xảy ra khi các camera thực tế có kích thước cảm biến khác nhau.
Sử dụng luồng vật lý thay cho một luồng logic có cùng kích thước và . Thao tác này không được làm chậm tốc độ khung hình của ảnh chụp khi thời lượng khung hình tối thiểu của luồng thực và luồng logic là như nhau.
Những điều 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 luồng vật lý có thể làm chậm tốc độ tốc độ chụp của máy ảnh logic do các hạn chế về tài nguyên.
- Việc áp dụng chế độ cài đặt của máy ảnh thực có thể làm chậm tốc độ chụp nếu các camera cơ bản được đưa vào 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 tiếp tục hoạt động theo trường hợp mặc định.
- Việc định cấu hình hoặc yêu cầu luồng vật lý có thể ghi đè cấu hình nội bộ của HAL tối ưu hoá pin và tốn nhiều pin hơn.
Tuỳ chỉnh
Bạn có thể tuỳ chỉnh cách triển khai thiết bị theo những 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 HAL trong quá trình triển khai. Quyết định về cách nguồn gốc của các luồng logic kết hợp máy ảnh thực trong suốt ứng dụng và máy ảnh Android khung.
- Từng yêu cầu thực tế và kết quả có thể được hỗ trợ nếu muốn. Chiến lược phát hành đĩa đơn các thông số sẵn có trong các yêu cầu nà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
máy ảnh mà một ứ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ả PHYSICS_ID trong
getCameraIdList
. Đang 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 của camera 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
LogicalCameraDeviceTest
.
Ba thử nghiệm ITS này nhắm mục tiêu đến các hệ thống nhiều camera để tạo điều kiện hợp nhất hình ảnh:
scene1/test_multi_camera_match.py
scene4/test_multi_camera_alignment.py
sensor_fusion/test_multi_camera_frame_sync.py
Các thử nghiệm của cảnh 1 và cảnh 4 chạy với
Bài kiểm thử tính năng tích hợp sẵn
thiết bị kỹ thuật số. Quy trình kiểm thử test_multi_camera_match
xác nhận rằng độ sáng của
tâm của hình ảnh khớp khi hai camera đều được bật. Chiến lược phát hành đĩa đơn
Quy trình kiểm tra test_multi_camera_alignment
xác nhận rằng khoảng cách, hướng của máy ảnh
và các thông số biến dạng được tải đúng cách. Nếu hệ thống nhiều camera
Bao gồm camera Wide FoV (> 90o), cần có phiên bản Rev2 của hộp ITS.
Sensor_fusion
là thiết bị thử nghiệm thứ hai cho phép sử dụng điện thoại lặp lại theo quy định
chuyển động và xác nhận rằng dấu thời gian của con quay hồi chuyển và dấu thời gian cảm biến hình ảnh khớp với nhau và
các khung hình nhiều camera sẽ đồng bộ hoá.
Tất cả các hộp đều được cung cấp thông qua AcuSpec, Inc. (www.acuspecinc.com, fred@acuspecinc.com) và MYWAY Sản xuất (www.myway.tw, sales@myway.tw). Ngoài ra, bạn có thể mua hộp Rev1 ITS 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 chế độ 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 một giao diện logic thiết bị nhiều camera:
- (Android 10 trở lên) Ẩn camera phụ vật lý khỏi
getCameraIdList
. Chế độ này làm giảm số lượng máy ảnh mà hệ thống có thể mở trực tiếp giúp các ứng dụng không cần sử dụng logic lựa chọn máy ảnh phức tạp. - (Android 11 trở lên) Dành cho hệ điều hành nhiều camera logic
thiết bị hỗ trợ thu phóng quang học, hãy triển khai
ANDROID_CONTROL_ZOOM_RATIO
API và sử dụngANDROID_SCALER_CROP_REGION
chỉ dùng để 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ệ thống toạ độ củaANDROID_SCALER_CROP_REGION
,ANDROID_CONTROL_AE_REGIONS
,ANDROID_CONTROL_AWB_REGIONS
,ANDROID_CONTROL_AF_REGIONS
,ANDROID_STATISTICS_FACE_RECTANGLES
thân mến! vàANDROID_STATISTICS_FACE_LANDMARKS
để xử lý sau khi thu phóng trường nhìn dưới dạng 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
, xemcamera3_crop_reprocess#cropping
. - Đối với các thiết bị nhiều camera có camera thực
hãy đảm bảo thiết bị quảng cáo hỗ trợ đối với một giá trị nhất định
hoặc dải ô cho điều khiển chỉ khi toàn bộ phạm vi thu phóng hỗ trợ giá trị
hoặc dải ô. Ví dụ: nếu camera logic bao gồm một camera góc siêu rộng,
một camera góc 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 hoạt động của máy ảnh thực khác nhau,
lớp trừu tượng phần cứng (HAL) của máy ảnh phải ánh xạ từ mảng hoạt động của máy ảnh thực đến
mảng hoạt động 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
thân mến! vàANDROID_STATISTICS_FACE_LANDMARKS
để từ góc độ của ứng dụng, hệ toạ độ là kích thước mảng hoạt động của camera logic. - Nếu máy ảnh góc rộng và máy ảnh tiêu cự dài hỗ trợ tính năng tự động lấy nét, nhưng máy ảnh góc siêu rộng máy ảnh ở chế độ lấy nét cố định, hãy đảm bảo máy ảnh logic quảng cáo tính năng tự động lấy nét của Google. HAL phải mô phỏng máy trạng thái tự động lấy nét cho ống kính siêu rộng camera sao cho khi ứng dụng thu nhỏ đến ống kính siêu rộng, thì trên thực tế là máy ảnh thực bên dưới là tiêu điểm cố định trong suốt đối với ứng dụng, và các máy trạng thái tự động lấy nét cho chế độ AF được hỗ trợ hoạt động như như dự kiến.
- Nếu camera rộng và camera tiêu cự dài hỗ trợ 4K ở tốc độ 60 khung hình/giây và
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 phải 4K ở tốc độ 60 khung hình/giây, hãy đảm bảo camera logic không quảng cáo chất lượng 4k @
60 khung hình/giây trong các cấu hình phát trực tiếp được hỗ trợ. Điều này đảm bảo
tính toàn vẹn của 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 khung hình/giây ở
ANDROID_CONTROL_ZOOM_RATIO
có giá trị nhỏ hơn 1.
- Nếu kích thước mảng hoạt động của máy ảnh thực khác nhau,
lớp trừu tượng phần cứng (HAL) của máy ảnh phải ánh xạ từ mảng hoạt động của máy ảnh thực đến
mảng hoạt động máy ảnh logic cho
- Khám phá Android 10, một hệ thống camera hợp lý
không bắt buộc để hỗ trợ các tổ hợp luồng bao gồm luồng thực.
Nếu HAL hỗ trợ việc kết hợp với luồng thực:
- (Android 11 trở lên) Để xử lý việc sử dụng hiệu quả hơn các trường hợp như chiều sâu từ âm thanh nổi và theo dõi chuyển động, tạo trường nhìn đầu ra luồng vật lý lớn nhất có thể mà phần cứng có thể đạt được. 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 luồng camera thực, những hạn chế về phần cứng có thể buộc trường nhìn của luồng vật lý giống với luồng logic.
- Để giải quyết áp lực bộ nhớ do nhiều luồng vật lý gây ra,
đảm bảo các ứng dụng sử dụng
discardFreeBuffers
để phân bổ các vùng đệm miễn phí (vùng đệm mà người dùng giải phóng, nhưng chưa được nhà sản xuất đưa vào hàng đợi) nếu một luồng thực dự kiến không hoạt động trong một khoảng thời gian. - Nếu luồng vật lý từ các camera thực 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 ứng dụng sử dụng
surface group
để một hàng đợi bộ đệm được dùng để sao lưu 2 nền tảng dành cho ứng dụng, giảm mức tiêu thụ bộ nhớ.