多鏡頭支援

Android 9 推出了多相機的 API 支援 透過全新邏輯相機裝置 (由兩部以上的實體機組組成) 鏡頭裝置的朝相同方向移動。邏輯相機裝置 以單一 CameraDevice/CaptureSession 的形式,向應用程式公開發布, 與 HAL 整合式多鏡頭功能互動應用程式可選擇 存取及控管基礎實體相機串流、中繼資料和控制選項。

多鏡頭支援

圖 1. 多鏡頭支援

在這個圖表中,不同的相機 ID 會以不同顏色標示。應用程式可以 同時串流播放每台實體攝影機的原始緩衝區。這個 可以設定個別的控制項,並接收來自不同的 實體相機

範例和來源

宣傳多機裝置時,請務必使用 多鏡頭邏輯

相機用戶端可以查詢特定實體裝置的相機 ID 邏輯相機是由呼叫 getPhysicalCameraIds()。 從結果中傳回的 ID 會用於控制實體裝置 分別管理 setPhysicalCameraId()。 您可以從整份 叫用後的結果 getPhysicalCameraResults()

提出個別實體相機要求時,可能僅支援一部分實體 參數。如要接收支援的參數清單,開發人員可以呼叫 getAvailablePhysicalCameraRequestKeys()

實體相機串流僅支援非重新處理的要求,且 這僅適用於單色和海灣感應器

實作

支援檢查清單

如要在 HAL 端新增多鏡頭邏輯裝置:

搭載 Android 9 的裝置必須在相機裝置上啟用 支援將一個邏輯 YUV/RAW 串流替換成 相同大小 (不適用於 RAW 串流) 和兩個實體提供的格式相同 相機上不適用於搭載 Android 10 的裝置。

搭載 Android 10 且 相機 HAL 裝置版本為 3.5 相機裝置必須支援 isStreamCombinationSupported敬上 讓應用程式查詢特定串流組合是否包含 實體串流。

串流設定對應

邏輯攝影機必須具備以下攝影機裝置所需的串流組合: 所需的硬體等級 CameraDevice.createCaptureSession。 串流設定對應中的所有串流都必須是邏輯串流。

適用於支援 RAW 功能且具備實體子相機的邏輯相機裝置 設定不同的 RAW 串流時, 邏輯相機裝置不得切換至不同實體的子攝影機 感應器大小這可確保現有的 RAW 擷取應用程式不會中斷。

為了充分利用 HAL 實作的光學變焦功能 實體子相機在 RAW 拍攝期間,應用程式必須 設定實體子相機串流,而不是 RAW 串流。

保證串流組合

邏輯相機及底層實體攝影機必須確保 必要的串流組合 應用程式層級所需的資源

邏輯相機裝置的運作方式應與實體相機相同 判斷裝置是否相容我們建議 具備個別實體相機的超集功能。

在搭載 Android 9 的裝置上, 串流組合,邏輯相機必須支援:

  • 將一個邏輯 YUV_420_888 或原始串流取代為兩個實體串流 大小和格式都相同,而且都是使用不同的實體相機 但是實體相機可支援的大小和格式

  • 新增兩個原始串流,每個實體相機各一個串流 (如果是邏輯相機的話) 並未宣傳 RAW 功能,但基礎的實體相機卻有。 這通常是因為實體攝影機的感應器大小不同。

  • 以實體串流取代相同大小和 格式。避免在擷取影格速率時 實體和邏輯串流的最短影格持續時間相同。

效能和電源注意事項

  • 成效:

    • 設定及串流實體串流可能會拖慢 邏輯相機因資源限製而擷取率。
    • 套用實體相機設定可能會拖慢拍攝速度, 所有底片相機的影格速率不同
  • 電源:

    • HAL 的電源最佳化功能會繼續在預設情況下運作。
    • 設定或要求實體串流可能會覆寫 HAL 的內部 電源最佳化,從而增加耗電量。

自訂

您可以透過下列方式自訂裝置實作方式。

  • 邏輯相機裝置融合的輸出內容完全取決於 HAL 。決定融合邏輯串流如何衍生自 實體相機和 Android 相機保持公開透明 這個架構的重點在於
  • 您可以選擇支援個別的實體要求和結果。 這類請求中的可用參數集也完全取決於 特定 HAL 實作項目
  • 從 Android 10 開始,HAL 可以減少 可由應用程式直接開啟的相機 宣傳以下項目的部分或全部 PHYSICAL_ID: getCameraIdList。 正在撥打 getPhysicalCameraCharacteristics 然後傳回實體相機的特性

驗證

邏輯多鏡頭裝置必須像其他一般鏡頭一樣傳送相機 CTS。 如需指定這類裝置的測試案例,請前往 LogicalCameraDeviceTest敬上 後續課程我們將逐一介紹 預先訓練的 API、AutoML 和自訂訓練

這三項 ITS 測試的目標是多鏡頭系統, 融合圖片:

場景 1 和場景 4 使用 ITS 收納盒測試 才華test_multi_camera_match 測試會宣告 將兩部攝影機同時啟用時,影像中央相符。 test_multi_camera_alignment 測試會宣告相機間距、方向、 和變形參數正確載入如果多機拍攝系統 配備廣角 FoV 攝影機 (>90o 以上),則必須使用 2 版的 ITS 包裝盒。

Sensor_fusion 是第二個測試 rig,可執行重複且預先指定的手機 動作及斷言陀螺儀和影像感應器的時間戳記相符,以及 多鏡頭影格會保持同步

你可以在 AcuSpec, Inc. 購買所有包裝盒 (www.acuspecinc.com、 fred@acuspecinc.com) 和 MYWAY 製造 (www.myway.tw、sales@myway.tw)。 此外,您也可以透過 West-Mark 購買最新的 ITS 包裝盒 (www.west-mark.com、 dgoodman@west-mark.com)。

最佳做法

充分利用多鏡頭提供的功能,同時保持 應用程式相容性,請按照這些最佳做法實作邏輯 多鏡頭裝置:

  • (Android 10 以上版本) 隱藏下列位置的實體子相機: getCameraIdList。 這會減少可直接開啟的相機數量 應用程式也不需要設定複雜的相機選取邏輯。
  • (Android 11 以上版本) 適用於多鏡頭邏輯 裝置支援光學變焦,請實作 ANDROID_CONTROL_ZOOM_RATIO API,以及使用 ANDROID_SCALER_CROP_REGIONANDROID_CONTROL_ZOOM_RATIO敬上 可讓裝置縮小畫面,同時維持更精確的準確度。在本例中 HAL 必須調整 ANDROID_SCALER_CROP_REGION 的座標系統, ANDROID_CONTROL_AE_REGIONS, ANDROID_CONTROL_AWB_REGIONS, ANDROID_CONTROL_AF_REGIONSANDROID_STATISTICS_FACE_RECTANGLES、 和 ANDROID_STATISTICS_FACE_LANDMARKS 以處理縮放後 做為感應器使用陣列的視野。如要進一步瞭解 ANDROID_SCALER_CROP_REGION敬上 可與 ANDROID_CONTROL_ZOOM_RATIO 搭配運作 請參閱「camera3_crop_reprocess#cropping」。
  • 適用於配備不同實體攝影機的多鏡頭裝置 以及宣傳支援的特定值 或控制項的範圍,只有在整個縮放範圍支援 值時 或是範圍舉例來說,如果邏輯相機是由超廣角鏡頭組成 廣角和望遠鏡頭:
    • 如果實體攝影機使用中的陣列大小不同, 相機 HAL 必須負責將實體攝影機的主動陣列 ANDROID_SCALER_CROP_REGION 的邏輯相機動態陣列, ANDROID_CONTROL_AE_REGIONS, ANDROID_CONTROL_AWB_REGIONS, ANDROID_CONTROL_AF_REGIONSANDROID_STATISTICS_FACE_RECTANGLES、 和 ANDROID_STATISTICS_FACE_LANDMARKS 因此,從應用程式的角度來看 座標系統是邏輯相機的有效陣列大小。
    • 如果廣角和望遠鏡頭支援自動對焦功能,但支援超廣角鏡頭, 相機為定焦,請確認邏輯相機具有自動對焦功能 聯絡。HAL 必須模擬超廣角鏡頭的自動對焦狀態機器 所以當應用程式縮小到超廣角鏡頭時 底層實體相機是應用程式透明的 以及支援自動對焦模式的自動對焦狀態機器 。
    • 如果廣角和望遠鏡頭支援 4K @ 60 fps, 超廣角鏡頭僅支援 4K @ 30 fps 或 1080p @ 60 fps,但 不是 4K @ 60 fps,請確認邏輯相機未公告 4K @ 採用 60 fps 支援的串流格式。這麼做可保證 邏輯相機功能的完整性,確保應用程式不會 若是每秒 4K @ 60 FPS, ANDROID_CONTROL_ZOOM_RATIO敬上 小於 1 的值。
  • 搭載 Android 10 的多鏡頭邏輯 則不一定要支援含有實體串流的串流組合。 如果 HAL 支援與實體串流搭配使用:
    • (Android 11 以上版本) 為了更妥善地運用 例如立體聲和動作追蹤的深度等 實體串流輸出內容的規模。 但是,如果實體串流和邏輯串流來自相同的 硬體上的限制可能會導致視野 實體串流和邏輯串流相同
    • 如要解決多個實體串流造成的記憶體壓力, 確認應用程式使用 discardFreeBuffers 釋出免費緩衝區 (取用端釋出的緩衝區, 但尚未由生產端從佇列中移除) 閒置一段時間。
    • 萬一出現實體攝影機畫面時 在同一個要求中附加,請確保應用程式使用 surface group 以便一個緩衝區佇列 回到兩個應用程式面向的介面 減少記憶體用量