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

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. Cho ví dụ: tuỳ chọn này cho phép một thiết bị hoạt động cả camera trước và sau . Từ Android 11, API Camera2 bao gồm các phương thức sau mà các ứng dụng có thể gọi để xác định xem camera có hỗ trợ phát trực tuyến đồng thời và những cấu hình luồng được hỗ trợ.

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

Một nhóm các tổ hợp luồng bắt buộc phải được hỗ trợ trong khi thiết lập đồng thời được bao gồm thông qua các đặc điểm camera của thiết bị camera trong SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS thuộc tính này.

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 video đang xử lý bằng tính năng 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ợ thay thế luồng YUV bằng Y8 trong tất cả các luồng được đảm bảo các kiểu kết hợp phát trực tuyến.

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(). Các 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 có sVGA trong quá trình hoạt động đồng thời, trong đó sVGA là giá trị nhỏ hơn trong các độ 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ự định hay không, hãy sử dụng ConcurrentCameraTest.java thử nghiệm CTS. 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, lớp trừu tượng phần cứng (HAL) của máy ảnh phải được phân bổ hạn chế vào mỗi 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ã máy ảnh 0 là một máy ảnh logic được hỗ trợ bởi một ống kính rộng và siêu rộng camera và mỗi camera lấy một tài nguyên ISP.
  • Camera ID 1 là camera lấy một tài nguyên ISP.

Thiết bị (điện thoại) có 2 ISP. Nếu mã máy ảnh 0 đang mở và một phiên hoạt động đã định cấu hình, có thể HAL của máy ảnh đặt trước hai ISP dự đoán dùng cả camera góc siêu rộng và camera 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 lớp trừu tượng phần cứng (HAL) cho máy ảnh về cách phân bổ tài nguyên (vì giờ đây nó dự kiến hoạt động đồng thời của camera). Tuy nhiên, việc này có thể khiến bạn bị hạn chế khả năng (ví dụ: có thể không thu phóng được) có thể xử lý tỷ lệ phạm vi thu phóng đầy đủ (vì chuyển đổi máy ảnh thực Mã nhận dạng có thể có 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. Thao tác này cho phép để phân bổ tài nguyên một cách phù hợp.

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

Sự cố với testDualCameraPreview

Khi bạn cập nhật ở trên, nó có thể gây ra sự cố với hành vi được cho phép bằng quy trình 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 bên thứ ba có thể phụ thuộc vào hành vi này.

Do lớp trừu tượng phần cứng (HAL) cho máy ảnh không biết toàn 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 có thể khó khăn phân bổ tài nguyên phần cứng (giả sử có sự cạnh tranh nào đó dành cho chúng).

Để 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, HAL của máy ảnh sẽ không thực hiện được các lệnh gọi openCamera bằng 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 camera đang chạy đồng thời.