並行鏡頭串流

Android 允許裝置支援相機裝置的並行串流功能。舉例來說,這可讓裝置同時使用前置和後置鏡頭。自 Android 11 起,Camera2 API 包含以下方法,可讓應用程式呼叫以判斷相機是否支援並行串流,以及支援的串流設定。

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 的裝置 (CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES 包含 CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME) 必須支援在所有保證的串流組合中,將 YUV 串流替換為 Y8。MONOCHROME

s720p 是指 720p (1280 x 720),或 StreamConfigurationMap.getOutputSizes() 傳回的特定格式所支援的最高解析度。s1440p 是指 1440p (1920 x 1440),或 StreamConfigurationMap.getOutputSizes() 傳回的特定格式所支援的最大解析度。功能不包含 ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE 的裝置,在並行運作期間,至少必須支援單一 Y16 串流,即解析度為 sVGA 的 Dataspace::DEPTH,其中 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,以便使用超廣角和廣角相機。

在這種情況下,前置鏡頭 (ID 1) 無法設定任何串流,因為兩個 ISP 都已在使用中。

解決方案

為解決這個問題,架構可以在設定工作階段之前開啟相機 ID 01,以便向相機 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 還應維持向後相容性,如果無法支援所有同時執行的相機的完整串流設定,則應拒絕 openCameraERROR_MAX_CAMERAS_IN_USE 的呼叫。