Android 允許設備支持相機設備的並發流。例如,這允許設備同時運行前置和後置攝像頭。從 Android 11 開始,Camera2 API 包括以下方法,應用可以調用這些方法來確定相機是否支持並發流以及支持的流配置。
-
getConcurrentStreamingCameraIds
:獲取當前連接的支持同時配置相機設備會話的相機設備標識符的組合集。 -
isConcurrentSessionConfigurationSupported
:檢查提供的一組相機設備及其相應的會話配置是否可以同時配置。
通過相機設備的相機特性在SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS
屬性中包含一組必須在並發流式傳輸期間支持的強制流組合。
每個通過getConcurrentStreamingCameraIds()
通告的相機設備必須支持以下保證的並發流配置。
目標 1 | 目標 2 | |||
---|---|---|---|---|
類型 | 最大尺寸 | 類型 | 最大尺寸 | 示例用例 |
YUV | s1440p | 應用內視頻或圖像處理 | ||
私人信息 | 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 流、Dataspace Dataspace::DEPTH
和 sVGA 分辨率,其中 sVGA 是以下兩個分辨率中的較小者:
- 給定格式的最大輸出分辨率
- 640 x 480
執行
要讓應用程序查詢設備以確定其攝像頭是否支持並發流,請實現ICameraProvider@2.6
HAL 接口,該接口包括以下方法:
有關ICameraProvider@2.6
HAL 接口的參考實現,請參閱 EmulatedCameraProviderHWLImpl.cpp 中的模擬相機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
)。這允許相機提供商相應地分配資源。為了解決無法處理全變焦範圍比例的問題,請確保相機應用程序在同時使用相機時,保證使用僅 1x 和
MAX_DIGITAL_ZOOM
之間的ZOOM_RATIO
控制設置,而不是完整的ZOOM_RATIO_RANGE
(這可以防止切換內部的物理相機,這可能需要更多的 ISP)。
testDualCameraPreview 的問題
當您進行上述更新時,可能會導致MultiViewTest.java#testDualCameraPreview
測試允許的行為出現問題。
測試testDualCameraPreview
僅在打開所有相機後才配置會話。它遵循以下順序:
for each camera in cameraDevices :
device = openCamera(camera)
createCaptureSession(device);
但是,它確實可以容忍帶有ERROR_MAX_CAMERAS_IN_USE [1]
的相機打開失敗。第三方應用程序可能取決於此行為。
由於相機 HAL 在配置會話之前不知道為並發操作打開的完整相機 ID 集,因此它可能很難分配硬件資源(假設它們存在一些競爭)。
為了解決這個問題,除了支持並發流式傳輸之外,還要保持向後兼容性,如果相機 HAL 不能支持同時運行的所有相機的完整流式配置,相機 HAL 應該使用ERROR_MAX_CAMERAS_IN_USE
openCamera
調用失敗。