並行攝影機串流

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 應用程式內影片或處理預覽畫面

具備 MONOCHROME 功能的裝置 (包括 CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIESCameraMetadata#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 01,再設定工作階段,向攝影機 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 呼叫。