Truyền trực tuyến máy ảnh đồng thời

Android cho phép các thiết bị hỗ trợ truyền phát đồng thời các thiết bị camera. Ví dụ: điều này cho phép một thiết bị có cả camera trước và sau hoạt động cùng một lúc. Từ Android 11, API Camera2 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ợ phát trực tiếp đồng thời hay không và các cấu hình phát trực tiếp được hỗ trợ hay không.

  • getConcurrentCameraIds : Nhận tập hợp các kết hợp số nhận dạng thiết bị máy ảnh hiện được kết nối để hỗ trợ định cấu hình đồng thời các phiên thiết bị máy ảnh.
  • isConcurrentSessionConfigurationSupported : Kiểm tra xem bộ thiết bị camera được cung cấp và cấu hình phiên tương ứng của chúng có thể được cấu hình đồng thời hay không.

Một tập hợp các kết hợp luồng bắt buộc phải được hỗ trợ trong quá trình 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
Kiểu Kích thước tối đa Kiểu 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
RIÊNG TƯ s1440p Phân tích kính ngắm trong ứng dụng
JPEG s1440p Không có kính ngắm để chụp ảnh tĩnh
YUV / PRIV s720p JPEG s1440p Hình ảnh tĩnh tiêu chuẩn
YUV / PRIV s720p YUV / PRIV s1440p Video trong ứng dụng hoặc 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 kết hợp luồng được đảm bảo.

s720p đề cập đến 720p (1280 x 720) hoặc độ phân giải được hỗ trợ tối đa cho định dạng cụ thể được trả về bởi StreamConfigurationMap.getOutputSizes() . s1440p đề cập đến 1440p (1920 x 1440) hoặc độ phân giải được hỗ trợ tối đa cho định dạng cụ thể được trả về bởi StreamConfigurationMap.getOutputSizes() . Các thiết bị có khả 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 khi 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 nhất định
  • 640 x 480

Thực hiện

Để 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ợ phát trực tuyến đồng thời hay không, hãy triển khai giao diện ICameraProvider@2.6 HAL, bao gồm các phương pháp sau:

Để tham khảo cách triển khai giao diện ICameraProvider@2.6 HAL, hãy xem thư viện HAL của máy ảnh mô phỏng tại EmulatedCameraProviderHWLImpl.cpp .

Thẩm định

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

Vấn đề phân bổ nguồn lực

Nếu HAL máy ảnh quảng cáo hỗ trợ hoạt động đồng thời của thiết bị máy ảnh, chúng có thể gặp phải vấn đề phân bổ tài nguyên, đặc biệt 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 phát đồng thời cả camera trước và sau (hoặc loại khác) , nhưng chưa phát huy hết công suất. Trong trường hợp này, HAL camera phải phân bổ tài nguyên phần cứng hạn chế cho từng thiết bị camera.

Kịch bản ví dụ

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

Vấn đề

Máy có cấu hình như sau:

  • Camera ID 0 là một camera logic được hỗ trợ bởi một camera góc rộng và siêu rộng, mỗi camera chiếm một tài nguyên ISP.
  • Camera ID 1 là camera sử dụng một tài nguyên ISP.

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

Nếu đúng như vậy, camera trước (ID 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ả ID camera 01 trước khi định cấu hình 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 yêu cầu các camera hoạt động đồng thời). Tuy nhiên, điều này có thể dẫn đến khả năng hạn chế, chẳng hạn như thu phóng có thể không xử lý được tỷ lệ phạm vi thu phóng đầy đủ (vì việc chuyển đổi ID máy ảnh vật lý có thể gặp vấn đề).

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

  • Yêu cầu 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 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 phù hợp.

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

Sự cố với testDualCameraPreview

Khi bạn thực hiện các cập nhật ở trên, điều này có thể tạo ra sự cố với hành vi được phép thử nghiệm MultiViewTest.java#testDualCameraPreview cho phép.

Thử nghiệm testDualCameraPreview không chỉ định cấu hình phiên sau khi mở tất cả camera. Nó tuân theo trình tự này:

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

Tuy nhiên, nó có thể chấp nhận các lỗi mở camera với ERROR_MAX_CAMERAS_IN_USE [1] . Ứng dụng của bên thứ ba có thể phụ thuộc vào hành vi này.

Vì máy ảnh HAL sẽ không biết bộ ID máy ảnh hoàn chỉnh đang được mở để hoạt động đồng thời trước khi định cấu hình phiên nên nó có thể khó phân bổ tài nguyên phần cứng (giả sử có một số cạnh tranh dành cho chúng).

Để giải quyết vấn đề này, duy trì khả năng tương thích ngược ngoài việc hỗ trợ phát trực tuyến đồng thời, HAL của máy ảnh phải thực hiện các cuộc gọi openCamera với ERROR_MAX_CAMERAS_IN_USE nếu chúng không thể hỗ trợ cấu hình luồng đầy đủ cho tất cả các máy ảnh chạy đồng thời.