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

Android cho phép các thiết bị hỗ trợ truyền trực tuyến đồng thời các thiết bị có camera. Ví dụ: tính năng 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. Kể 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 máy ảnh có hỗ trợ tính năng truyền trực tuyến đồng thời và các cấu hình truyền trực tuyến được hỗ trợ hay không.

  • getConcurrentCameraIds: Lấy tập hợp các tổ hợp giá trị nhận dạng thiết bị máy ảnh hiện đang 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 có thể định cấu hình đồng thời nhóm thiết bị máy ảnh được cung cấp và cấu hình phiên tương ứng của các thiết bị đó 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 đồng thời được đưa vào thông qua các đặc điểm của máy ảnh của thiết bị máy ảnh 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() đều 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ý hình ảnh hoặc video trong ứng dụng
PRIV (Xác minh danh tính cá nhân) s1440p Phân tích kính ngắm trong ứng dụng
JPEG s1440p Không chụp ảnh tĩnh bằng kính ngắm
YUV / PRIV s720p JPEG s1440p Chụp ảnh tĩnh chuẩn
YUV / PRIV s720p YUV / PRIV s1440p Video trong ứng dụng hoặc đang xử lý với bản xem trước

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

s720p là 720p (1280 x 720) hoặc độ phân giải tối đa được hỗ trợ cho định dạng cụ thể được trả về bởi StreamConfigurationMap.getOutputSizes(). s1440p là 1440p (1920 x 1440) hoặc độ phân giải tối đa được hỗ trợ cho định dạng cụ thể được trả về bởi StreamConfigurationMap.getOutputSizes(). Những thiết bị 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 có độ 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 đã 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 máy ảnh hỗ trợ phát trực tuyến đồng thời, hãy triển khai ICameraProvider@2.6 Giao diện HAL, bao gồm các phương thức sau:

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

Xác nhận kết quả

Để kiểm tra 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 quy trình kiểm thử CTS ConcurrentCameraTest.java. Ngoài ra, hãy thử nghiệm bằng một ứng dụng mở ra nhiều máy ảnh và vận hành chúng đồng thời.

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

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

Tình huống ví dụ

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

Sự cố

Thiết bị này có cấu hình 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 góc 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 máy ảnh 1 là một máy ảnh 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 máy ảnh 0 được mở và một phiên được định cấu hình, thì có thể HAL máy ảnh sẽ đặt trước hai ISP để dự đoán việc sử dụng cả máy ảnh góc siêu rộng và máy ảnh góc rộng.

Nếu trường hợp đó xảy ra, thì máy ảnh trước (Mã 1) không thể định cấu hình bất kỳ vì cả hai ISP đang được sử dụng.

Giải pháp

Để giải quyết vấn đề này, khung có thể mở cả mã máy ảnh 01 trước khi định cấu hình các phiên để cung cấp gợi ý cho HAL máy ảnh 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 máy ảnh). Tuy nhiên, điều này có thể dẫn đến các chức năng bị hạn chế, ví dụ: tính năng 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 mã nhận dạng máy ảnh thực tế 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 đối với provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds.

  • Yêu cầu camera phải hoạt động đồng thời, khung phải mở thiết bị máy ảnh (@3.2::ICameraDevice::open) trước định cấu hình bất kỳ phiên nào trên thiết bị máy ảnh. Điều này cho phép nhà cung cấp máy ảnh phân bổ tài nguyên cho 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 chế độ cài đặt điều khiển ZOOM_RATIO chỉ giữa 1x và MAX_DIGITAL_ZOOM thay vì ZOOM_RATIO_RANGE đầy đủ (điều này ngăn việc chuyển đổi máy ảnh thực tế trong nội bộ, có thể yêu cầu nhiều ISP hơn).

Sự cố với testDualCameraPreview

Khi bạn thực hiện các nội dung cập nhật ở trên, điều này có thể tạo ra vấn đề với một hành vi được phép 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ả camera. Lệnh này tuân theo trình tự sau:

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

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

Vì HAL máy ảnh sẽ không biết toàn bộ bộ mã nhận dạng máy ảnh đang được mở để hoạt động đồng thời trước khi định cấu hình các phiên, nên HAL máy ảnh có thể khó phân bổ tài nguyên phần cứng (giả sử có một số hoạt động cạnh tranh với các 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 để hỗ trợ phát trực tuyến đồng thời, các HAL máy ảnh sẽ không thực hiện được lệnh gọi openCamera bằng ERROR_MAX_CAMERAS_IN_USE nếu 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.