並行攝影機串流

Android 允許裝置支援相機裝置的並行串流功能。適用對象 因此,無論使用前置鏡頭或後置鏡頭, 相同的軟體。從 Android 11 中,Camera2 API 包含下列方法 應用程式可以透過呼叫的方式,判斷攝影機是否支援並行串流與 支援的串流設定

並行期間必須支援的一組必要串流組合 串流播放時,是以攝影機裝置的相機特性在 Google 的 SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS 資源。

透過 getConcurrentStreamingCameraIds() 宣傳的每部攝影機裝置,都必須支援下列保證設定,以便同時串流。

目標 1 目標 2
類型 大小上限 類型 大小上限 應用實例範例
YUV 指數 s1440p 應用程式內影片或圖片處理
中華電信 1,440p 應用程式內觀景窗分析
JPEG 1,440p 不提供觀景窗靜態影像擷取功能
YUV / PRIV s720p JPEG 1,440p 標準靜態影像
YUV / PRIV s720p YUV/PRIV 1,440p 應用程式內影片或含有預覽畫面的處理作業

支援 Y8 的裝置 (CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES 包含 CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME) 必須支援在所有保證的串流組合中,將 YUV 串流替換為 Y8。

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.6HAL 介面的參考實作,請參閱 模擬相機 HAL 程式庫 EmulatedCameraProviderHWLImpl.cpp

驗證

如要測試這項功能的實作是否正常運作,請使用 ConcurrentCameraTest.java CTS 測試。此外,請使用可開啟多部攝影機的應用程式進行測試 兩者並行

資源配置問題

如果相機 HAL 廣告支援 相機裝置可能會遇到資源分配問題,尤其是在 萬一裝置上有足夠的影像訊號處理器 (ISP) 資源, 同步串流播放前置和後置 (或其他) 鏡頭,但不包括 以及完整容量在這種情況下,相機 HAL 必須分配有限度 佈建硬體資源

情境示例

以下情境說明這個問題。

問題

裝置的設定如下:

  • 相機 ID 0 是以廣角和超廣角鏡頭支援的邏輯相機 攝影機每個搭載一個網際網路服務供應商 (ISP) 資源
  • 攝影機 ID 1 是會取用一個網際網路服務供應商 (ISP) 資源的相機。

裝置 (手機) 有兩個 ISP。如果相機 ID 0 已開啟,且工作階段已開啟 攝影機 HAL 可能會保留兩個 ISP 預測的 ISP 支援超廣角和廣角鏡頭

如果是這種情況,前置鏡頭 (ID 1) 無法設定任何 串流傳輸量,因為兩個網際網路服務供應商 (ISP) 都使用中

解決方案

如要解決這個問題,架構可開啟相機 ID 01 ,再為相機 HAL 提供操作說明 來分配資源 (因為現在應預期相機的並行作業)。 但這可能導致功能受到限制,例如縮放功能可能無法 能夠因應完整的變焦範圍比例 (因為切換實體相機) ID 可能會發生問題)。

如要實作這個解決方案,請對下列項目進行以下更新: provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds

  • 規定相機同時運作的強制要求 架構必須開啟相機裝置 (@3.2::ICameraDevice::open) 在相機裝置上設定任何工作階段。這樣一來,攝影機供應商就能據此分配資源。

  • 修正無法處理 縮放範圍比率,務必當同時使用相機時, 我們保證只使用 ZOOM_RATIO 控制設定介於 1 倍和 請使用 MAX_DIGITAL_ZOOM,而非完整的 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