Android允許設備支持相機設備的並發流。例如,這使設備可以同時操作前置和後置攝像頭。從Android 11開始,Camera2 API包含以下方法,應用可以調用以下方法來確定相機是否支持並發流和支持的流配置。
-
getConcurrentStreamingCameraIds
:獲取支持同時配置攝像頭設備會話的當前連接的攝像頭設備標識符的組合集。 -
isConcurrentSessionConfigurationSupported
:檢查是否可以同時配置提供的一組攝像頭設備及其相應的會話配置。
SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS
屬性中的攝像頭設備的攝像頭特徵包括並發流期間必須支持的一組強制流組合。
通過getConcurrentStreamingCameraIds()
播發的每個攝像頭設備必須支持並發流的以下保證配置。
目標1 | 目標2 | |||
---|---|---|---|---|
類型 | 最大尺寸 | 類型 | 最大尺寸 | 樣例用例 |
YUV | s1440p | 應用內視頻或圖像處理 | ||
PRIV | s1440p | 應用內取景器分析 | ||
JPEG格式 | s1440p | 沒有取景器靜止圖像拍攝 | ||
YUV / PRIV | s720p | JPEG格式 | s1440p | 標準靜態影像 |
YUV / PRIV | s720p | YUV / PRIV | s1440p | 應用內視頻或帶預覽的處理 |
支持Y8的具有MONOCHROME
功能( CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
包括CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME
)的設備必須支持在所有保證的流組合中用Y8替換YUV流。
s720p
是指720p(1280 x 720)或StreamConfigurationMap.getOutputSizes()
返回的特定格式的最大支持分辨率。 s1440p
表示1440p(1920 x 1440)或StreamConfigurationMap.getOutputSizes()
返回的特定格式的最大支持分辨率。功能不包括ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
設備在並發操作期間必須至少支持單個Y16流(具有sVGA分辨率的Dataspace Dataspace::DEPTH
,其中sVGA是以下兩個分辨率中較小的一個:
- 給定格式的最大輸出分辨率
- 640 x 480
實作
為了允許應用程序查詢設備以確定其攝像機是否支持並發流,請實現ICameraProvider@2.6
HAL接口,該接口包括以下方法:
對於一個參考實現的ICameraProvider@2.6
HAL接口,見在模擬攝像機HAL庫EmulatedCameraProviderHWLImpl.cpp
。
驗證方式
要測試此功能的實現是否按預期工作,請使用ConcurrentCameraTest.java
CTS測試。另外,請使用可打開多個攝像機並同時操作的應用程序進行測試。
資源分配問題
如果攝像頭HAL宣傳支持攝像頭設備的並發操作,則它們可能會遇到資源分配問題,尤其是在電話上有足夠的圖像信號處理器(ISP)資源同時傳輸前後攝像頭(或其他攝像頭)的情況下,但沒有充分發揮作用。在這種情況下,相機HAL必須為每個相機設備分配有限的硬件資源。
示例場景
下面的情況演示了此問題。
問題
設備具有以下配置:
- 攝像機ID
0
是由寬和超寬攝像機支持的邏輯攝像機,每個攝像機都佔用一個ISP資源。 - 攝像機ID
1
是佔用一個ISP資源的攝像機。
設備(電話)有兩個ISP。如果打開了攝像機ID 0
並配置了會話,則攝像機HAL可能會保留兩個ISP,以預期超寬和超寬攝像機的使用。
在這種情況下,前置攝像頭(ID 1
)無法配置任何流,因為兩個ISP都在使用。
解
為了解決此問題,框架可以在配置會話之前打開攝像機ID 0
和1
,以向攝像機HAL提供有關如何分配資源的提示(因為它現在期望攝像機並發運行)。但是,這可能會導致功能受限,例如,縮放可能無法處理完整的縮放範圍比率(因為切換物理相機ID可能會出現問題)。
要實現此解決方案,請對provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds
進行以下更新。
@3.2::ICameraDevice::open
攝像機同時運行,攝像機框架必須先打開攝像機設備(@3.2::ICameraDevice::open
),然後才能在攝像機設備上配置任何會話。這允許攝像機提供商相應地分配資源。為了解決無法處理完整變焦範圍比率的問題,請確保在同時使用相機時,相機應用程序確保僅在1x和
MAX_DIGITAL_ZOOM
之間使用ZOOM_RATIO
控制設置,而不是在整個ZOOM_RATIO_RANGE
(這防止了切換內部的物理攝像機,這可能需要更多的ISP)。
testDualCameraPreview問題
MultiViewTest.java#testDualCameraPreview
上述更新時,它可能會導致MultiViewTest.java#testDualCameraPreview
測試允許的行為出現問題。
測試testDualCameraPreview
不會僅在打開所有攝像機之後配置會話。遵循以下順序:
for each camera in cameraDevices :
device = openCamera(camera)
createCaptureSession(device);
但是,它確實允許使用ERROR_MAX_CAMERAS_IN_USE [1]
打開相機。第三方應用程序可能取決於此行為。
由於攝像機HAL在配置會話之前不知道要為並發操作打開的完整攝像機ID集合,因此分配硬件資源可能很困難(假設它們之間存在競爭)。
為了解決此問題,除了支持並發流以外,還保持向後兼容性,如果攝像機HAL無法支持所有並發運行的攝像機的完整流配置,則它們應使用ERROR_MAX_CAMERAS_IN_USE
openCamera
調用失敗。