Hỗ trợ nhiều camera

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ỗ trợ nhiều camera

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:

Đố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ọi getPhysicalCameraCharacteristics 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:

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ụng ANDROID_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ủa 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 để 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ách ANDROID_SCALER_CROP_REGION hoạt động cùng với ANDROID_CONTROL_ZOOM_RATIO, xem camera3_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.
  • 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ớ.