並行鏡頭串流

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

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

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

目標 1 目標 2
類型 大小上限 類型 大小上限 應用實例
YUV 指數 1,440p 應用程式內影片或圖片處理
中華電信 1,440p 應用程式內觀景窗分析
JPEG 1,440p 無法拍攝觀景窗靜態影像
YUV / PRIV 720p JPEG 1,440p 標準靜止影像
YUV / PRIV 720p YUV / PRIV 1,440p 透過預覽或在應用程式內進行影片或處理

具備 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::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 應無法透過具有下列特性的 openCamera 呼叫: 如果無法支援完整的串流設定,請ERROR_MAX_CAMERAS_IN_USE 同時執行所有攝影機