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 0
và 1
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 đếnMAX_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.