Truyền trực tuyến nhiều camera đồng thời

Android cho phép các thiết bị hỗ trợ việc phát trực tuyến đồng thời của các thiết bị camera. Ví dụ: điều này cho phép thiết bị vận hành cả camera trước và camera sau cùng một lúc. Từ Android 11, Camera2 API bao gồm các phương thức sau mà ứng dụng có thể gọi để xác định xem camera có hỗ trợ truyền phát trực tiếp đồng thời hay không và các cấu hình truyền phát trực tiếp được hỗ trợ.

  • getConcurrentCameraIds: Lấy tập hợp các tổ hợp mã nhận dạng thiết bị camera hiện được kết nối hỗ trợ việc định cấu hình đồng thời các phiên thiết bị camera.
  • isConcurrentSessionConfigurationSupported: Kiểm tra xem bạn có thể định cấu hình đồng thời nhóm thiết bị camera đã cho và cấu hình phiên tương ứng hay không.

Một nhóm các tổ hợp luồng bắt buộc phải được hỗ trợ trong quá trình truyền phát trực tuyến đồng thời được đưa vào thông qua các đặc điểm camera của thiết bị camera trong thuộc tính SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS.

Mỗi thiết bị camera được quảng cáo thông qua getConcurrentStreamingCameraIds() phải hỗ trợ các cấu hình được đảm bảo sau đây cho các luồng đồng thời.

Mục tiêu 1 Mục tiêu 2
Loại Kích thước tối đa Loại Kích thước tối đa Các trường hợp sử dụng mẫu
YUV s1440p Xử lý video hoặc hình ảnh trong ứng dụng
PRIV s1440p Phân tích kính ngắm trong ứng dụng
JPEG s1440p Không chụp ảnh tĩnh bằng ống ngắm
YUV / PRIV s720p JPEG s1440p Chụp ảnh tĩnh tiêu chuẩn
YUV / PRIV s720p YUV / PRIV s1440p Video trong ứng dụng hoặc video đang xử lý có bản xem trước

Các thiết bị có khả năng MONOCHROME (CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES bao gồm CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME) hỗ trợ Y8 phải hỗ trợ thay thế luồng YUV bằng Y8 trong tất cả các tổ hợp luồng được đảm bảo.

s720p đề cập đến độ phân giải 720p (1280 x 720) hoặc độ phân giải tối đa được hỗ trợ cho định dạng cụ thể do StreamConfigurationMap.getOutputSizes() trả về. s1440p đề cập đến độ phân giải 1440p (1920 x 1440) hoặc độ phân giải tối đa được hỗ trợ cho định dạng cụ thể do StreamConfigurationMap.getOutputSizes() trả về. Những thiết bị có các chức năng không bao gồm ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE phải hỗ trợ ít nhất một luồng Y16, Dataspace::DEPTH với độ phân giải sVGA, trong quá trình hoạt động đồng thời, trong đó sVGA là độ phân giải nhỏ hơn trong hai độ phân giải sau:

  • độ phân giải đầu ra tối đa cho định dạng đã cho
  • 640 x 480

Triển khai

Để cho phép các ứng dụng truy vấn một thiết bị nhằm xác định xem camera của thiết bị đó có hỗ trợ truyền phát trực tiếp đồng thời hay không, hãy triển khai giao diện HAL ICameraProvider@2.6, bao gồm các phương thức sau:

Để biết thông tin về cách triển khai tham chiếu của giao diện HAL ICameraProvider@2.6, hãy xem thư viện HAL camera được mô phỏng tại EmulatedCameraProviderHWLImpl.cpp.

Xác nhận kết quả

Để kiểm thử xem việc triển khai tính năng này có hoạt động như dự kiến hay không, hãy sử dụng kiểm thử CTS ConcurrentCameraTest.java. Ngoài ra, hãy kiểm thử bằng một ứng dụng mở nhiều camera và vận hành chúng đồng thời.

Vấn đề về việc phân bổ tài nguyên

Nếu HAL camera quảng cáo khả năng hỗ trợ hoạt động đồng thời của các thiết bị camera, thì chúng có thể gặp phải vấn đề về việc phân bổ tài nguyên, đặc biệt là trong trường hợp có đủ tài nguyên bộ xử lý tín hiệu hình ảnh (ISP) trên điện thoại để truyền trực tuyến cả camera trước và sau (hoặc các camera khác) cùng lúc, nhưng không đạt đến công suất tối đa. Trong trường hợp này, HAL camera phải phân bổ tài nguyên phần cứng có hạn cho mỗi thiết bị camera.

Tình huống ví dụ

Tình huống sau đây minh hoạ vấn đề này.

Sự cố

Thiết bị có cấu hình sau:

  • Mã nhận dạng máy ảnh 0 là một máy ảnh logic được hỗ trợ bởi một máy ảnh có ống kính rộng và siêu rộng, mỗi máy ảnh sẽ sử dụng một tài nguyên ISP.
  • Mã nhận dạng camera 1 là một camera sử dụng một tài nguyên ISP.

Thiết bị (điện thoại) có 2 ISP. Nếu mã nhận dạng camera 0 được mở và một phiên được định cấu hình, thì có thể HAL camera sẽ dự trữ 2 ISP để dự đoán cả việc sử dụng camera siêu rộng và camera rộng.

Nếu vậy, camera trước (mã nhận dạng 1) không thể định cấu hình bất kỳ luồng nào vì cả hai ISP đều đang được sử dụng.

Giải pháp

Để giải quyết vấn đề này, khung có thể mở cả mã nhận dạng camera 01 trước khi định cấu hình các phiên để cung cấp gợi ý cho HAL camera về cách phân bổ tài nguyên (vì hiện tại, khung này dự kiến hoạt động đồng thời của các camera). Tuy nhiên, điều này có thể dẫn đến những hạn chế về chức năng, chẳng hạn như tính năng thu phóng có thể không xử lý được toàn bộ tỷ lệ phạm vi thu phóng (vì việc chuyển đổi mã nhận dạng camera thực có thể gặp vấn đề).

Để triển khai giải pháp này, hãy cập nhật provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds như sau.

  • Bắt buộc rằng để hoạt động đồng thời của camera, khung camera phải mở các thiết bị camera (@3.2::ICameraDevice::open) trước khi định cấu hình bất kỳ phiên nào trên các thiết bị camera. Điều này cho phép các nhà cung cấp camera phân bổ tài nguyên cho phù hợp.

  • Để giải quyết vấn đề không xử lý được tỷ lệ phạm vi thu phóng đầy đủ, hãy đảm bảo rằng các ứng dụng camera khi sử dụng camera đồng thời, được đảm bảo sử dụng chế độ cài đặt điều khiển ZOOM_RATIO chỉ từ 1x đến MAX_DIGITAL_ZOOM thay vì ZOOM_RATIO_RANGE hoàn chỉnh (việc này ngăn chặn việc chuyển đổi camera vật lý bên trong, có thể yêu cầu nhiều ISP hơn).

Vấn đề với testDualCameraPreview

Khi bạn thực hiện các bản cập nhật ở trên, có thể sẽ xảy ra vấn đề với một hành vi được phép theo kiểm thử MultiViewTest.java#testDualCameraPreview.

testDualCameraPreview kiểm thử không định cấu hình các phiên chỉ sau khi mở tất cả các camera. Quy trình này diễn ra theo trình tự sau:

for each camera  in cameraDevices :
  device = openCamera(camera)
     createCaptureSession(device);

Tuy nhiên, hoạt động này vẫn chấp nhận các lỗi mở camera bằng ERROR_MAX_CAMERAS_IN_USE [1]. Các ứng dụng bên thứ ba có thể phụ thuộc vào hành vi này.

Vì HAL camera sẽ không biết toàn bộ tập hợp mã nhận dạng camera đang được mở để hoạt động đồng thời trước khi định cấu hình các phiên, nên có thể khó phân bổ tài nguyên phần cứng (giả sử có sự cạnh tranh về tài nguyên).

Để giải quyết vấn đề này, ngoài việc duy trì khả năng tương thích ngược và hỗ trợ truyền phát trực tiếp đồng thời, HAL camera sẽ không thực hiện được các lệnh gọi openCamera bằng ERROR_MAX_CAMERAS_IN_USE nếu không hỗ trợ được cấu hình luồng đầy đủ cho tất cả các camera đang chạy đồng thời.