Luồng video đồng thời của camera

Android cho phép các thiết bị hỗ trợ phát trực tuyến đồng thời các thiết bị máy ảnh. Ví dụ: tính năng này cho phép 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ị máy ảnh đượ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ý hình ảnh hoặc video trong ứng dụng
PRIV s1440p Phân tích kính ngắm trong ứng dụng
JPEG s1440p Không có tính năng chụp ảnh tĩnh qua kính 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 đ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 đề cập đến 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 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ó 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 ứ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ợ tính năng truyền trực tuyến đồ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:

Để tham khảo cách triển khai giao diện HAL ICameraProvider@2.6, hãy xem thư viện HAL 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 kiểm thử bằng một ứng dụng mở nhiều máy ảnh và vận hành đồng thời các máy ảnh đó.

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

Nếu HAL máy ảnh quảng cáo hỗ trợ hoạt động đồng thời của các thiết bị máy ảnh, thì chúng có thể gặp phải vấn đề 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) đồng thời, nhưng không phải ở mức công suất tối đa. 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ị 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 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ó hai 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à góc rộng.

Trong trường hợp đó, camera trước (mã nhận dạng 1) không thể định cấu hình luồng nào vì cả hai ISP đều đang hoạt độ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 để đưa ra 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 cập nhật provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds như sau.

  • Yêu cầu để hoạt động đồng thời của máy ảnh, khung máy ảnh phải mở các thiết bị máy ảnh (@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ị 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 hoàn chỉnh (đ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).

Vấn đề 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 hành vi được phép của quy trình kiểm thử MultiViewTest.java#testDualCameraPreview.

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

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

Tuy nhiên, phương thức này có thể chấp nhận các lỗi mở máy ảnh bằng 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ợ tính năng truyền trực tuyến đồng thời, 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.