並發相機流

Android 允許裝置支援相機裝置的同時串流傳輸。例如,這允許設備同時運行前置攝像頭和後置攝像頭。從 Android 11 開始,Camera2 API 包含以下方法,應用程式可以呼叫這些方法來確定相機是否支援並發流傳輸以及支援的串流配置。

透過SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS屬性中的相機設備的相機特性,包含並發流期間必須支援的一組強制流組合。

透過getConcurrentStreamingCameraIds()通告的每個相機設備必須支援以下並發流保證配置。

目標1目標2
類型最大尺寸類型最大尺寸範例用例
YUV s1440p應用程式內視訊或影像處理
普里夫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 取代 YUV 流。

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×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 無法支援同時運行的所有相機的完整串流配置,則它們應該因ERROR_MAX_CAMERAS_IN_USE導致openCamera呼叫失敗。