Android 允許裝置同時串流攝影機裝置。舉例來說,這項功能可讓裝置同時運作前置和後置鏡頭。從 Android 11 開始,Camera2 API 包含下列方法,應用程式可呼叫這些方法,判斷相機是否支援並行串流,以及支援的串流設定。
getConcurrentCameraIds
:取得目前連線的攝影機裝置 ID 組合,這些 ID 支援同時設定攝影機裝置工作階段。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 | 應用程式內影片或處理預覽畫面 |
具備 MONOCHROME
功能的裝置 (包括 CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
和 CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME
),如果支援 Y8,就必須在所有保證的串流組合中,支援以 Y8 取代 YUV 串流。
s720p
是指 720p (1280 x 720),或是 StreamConfigurationMap.getOutputSizes()
傳回的特定格式支援的最高解析度。s1440p
是指 1440p (1920 x 1440),或是 StreamConfigurationMap.getOutputSizes()
傳回的特定格式支援的最大解析度。如果裝置功能不包含 ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
,則必須在並行作業期間,至少支援單一 Y16 串流 (Dataspace::DEPTH
),且解析度為 sVGA。sVGA 是下列兩種解析度中較小者:
- 指定格式的最大輸出解析度
- 640 x 480
實作
如要允許應用程式查詢裝置,判斷裝置的攝影機是否支援並行串流,請實作 ICameraProvider@2.6
HAL 介面,其中包含下列方法:
如要瞭解 ICameraProvider@2.6
HAL 介面的參考實作方式,請參閱 EmulatedCameraProviderHWLImpl.cpp
的模擬相機 HAL 程式庫。
驗證
如要測試這項功能的導入作業是否正常運作,請使用 ConcurrentCameraTest.java
CTS 測試。此外,請使用可開啟多個攝影機並同時運作的應用程式進行測試。
資源分配問題
如果相機 HAL 宣傳支援相機裝置的並行作業,可能會遇到資源分配問題,特別是手機上有足夠的影像訊號處理器 (ISP) 資源,可同時串流前置和後置 (或其他) 攝影機,但無法充分利用這些資源時。在這種情況下,相機 HAL 必須為每個攝影機裝置分配有限的硬體資源。
情境示例
以下情境說明瞭這個問題。
問題
裝置的設定如下:
- 相機 ID
0
是由廣角和超廣角相機支援的邏輯相機,兩者各佔用一個 ISP 資源。 - 相機 ID
1
是指採用一個 ISP 資源的相機。
裝置 (手機) 有兩個 ISP。如果開啟攝影機 ID 0
並設定工作階段,攝影機 HAL 可能會預留兩個 ISP,以因應超廣角和廣角攝影機的使用需求。
如果是這樣,由於兩個 ISP 都正在使用中,前置鏡頭 (ID 1
) 就無法設定任何串流。
解決方案
為解決這個問題,架構可以先開啟攝影機 ID 0
和 1
,再設定工作階段,向攝影機 HAL 提供資源分配方式的提示 (因為現在預期攝影機可並行運作)。不過,這可能會導致功能受限,例如縮放功能可能無法處理完整的縮放範圍比例 (因為切換實體攝影機 ID 可能會有問題)。
如要實作此解決方案,請對 provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds
進行下列更新。
強制規定相機架構必須先開啟相機裝置 (
@3.2::ICameraDevice::open
),才能在相機裝置上設定任何工作階段,以同時運作相機。攝影機供應商可據此分配資源。為解決無法處理完整變焦範圍比例的問題,請確保相機應用程式同時使用相機時,保證只會使用 1 倍到
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 也應維持回溯相容性,如果無法支援所有並行運作攝影機的完整串流設定,就應使用 ERROR_MAX_CAMERAS_IN_USE
失敗 openCamera
呼叫。