多相機支持

Android 9 通過由兩個或多個指向同一方向的物理攝像頭設備組成的新邏輯攝像頭設備引入了對多攝像頭設備的 API 支持。邏輯攝像頭設備作為單個 CameraDevice/CaptureSession 暴露給應用程序,允許與 HAL 集成的多攝像頭功能進行交互。應用程序可以選擇訪問和控制底層物理相機流、元數據和控件。

多攝像頭支持

圖 1 。多攝像頭支持

在此圖中,不同的攝像機 ID 採用顏色編碼。該應用程序可以同時從每個物理相機流式傳輸原始緩衝區。還可以設置單獨的控件並從不同的物理相機接收單獨的元數據。

示例和來源

多攝像頭設備必須通過邏輯多攝像頭功能進行廣告宣傳。

攝像頭客戶端可以通過調用getPhysicalCameraIds()來查詢構成特定邏輯攝像頭的物理設備的攝像頭 ID。作為結果的一部分返回的 ID 然後用於通過setPhysicalCameraId()單獨控制物理設備。可以通過調用getPhysicalCameraResults()從完整結果中查詢此類單個請求的結果。

單個物理相機請求可能僅支持有限的參數子集。要接收支持的參數列表,開發人員可以調用getAvailablePhysicalCameraRequestKeys()

物理相機流僅支持非再處理請求,並且僅適用於單色和拜耳傳感器。

執行

支持清單

在 HAL 端添加邏輯多攝像頭設備:

對於運行 Android 9 的設備,攝像頭設備必須支持將一個邏輯 YUV/RAW 流替換為來自兩個物理攝像頭的相同大小(不適用於 RAW 流)和相同格式的物理流。這不適用於運行 Android 10 的設備。

對於運行 Android 10 且攝像頭 HAL 設備版本為3.5或更高版本的設備,攝像頭設備必須支持isStreamCombinationSupported ,應用才能查詢是否支持包含物理流的特定流組合。

流配置圖

對於邏輯相機,特定硬件級別的相機設備的強制流組合與CameraDevice.createCaptureSession中的要求相同。流配置映射中的所有流都必須是邏輯流。

對於支持 RAW 能力的邏輯攝像頭設備和不同尺寸的物理子攝像頭,如果應用配置了邏輯 RAW 流,則邏輯攝像頭設備不得切換到具有不同傳感器尺寸的物理子攝像頭。這可確保現有的 RAW 捕獲應用程序不會中斷。

要通過在 RAW 捕獲期間在物理子攝像頭之間切換來利用 HAL 實現的光學變焦,應用程序必須配置物理子攝像頭流而不是邏輯 RAW 流。

保證流組合

邏輯攝像頭及其底層物理攝像頭都必須保證其設備級別所需的強制流組合

基於其硬件級別和功能,邏輯相機設備應該以與物理相機設備相同的方式運行。建議其功能集是單個物理相機的超集。

在運行 Android 9 的設備上,對於每個保證的流組合,邏輯攝像頭必須支持:

  • 假設物理相機支持大小和格式,則用兩個相同大小和格式的物理流替換一個邏輯 YUV_420_888 或原始流,每個物理流來自一個單獨的物理相機。

  • 添加兩個原始流,一個來自每個物理相機,如果邏輯相機不宣傳 RAW 功能,但底層物理相機有。當物理相機具有不同的傳感器尺寸時,通常會發生這種情況。

  • 使用物理流代替相同大小和格式的邏輯流。當物理流和邏輯流的最小幀持續時間相同時,這不能減慢捕獲的幀速率。

性能和功耗注意事項

  • 表現:

    • 由於資源限制,配置和流式傳輸物理流可能會減慢邏輯攝像機的捕獲速率。
    • 如果將底層相機設置為不同的幀速率,則應用物理相機設置可能會降低捕獲速率。
  • 力量:

    • HAL 的電源優化在默認情況下繼續工作。
    • 配置或請求物理流可能會覆蓋 HAL 的內部功耗優化並導致更多功耗。

定制

您可以通過以下方式自定義您的設備實現。

  • 邏輯相機設備的融合輸出完全取決於 HAL 實現。關於如何從物理相機派生融合邏輯流的決定對於應用程序和 Android 相機框架是透明的。
  • 可以選擇支持單獨的物理請求和結果。此類請求中的可用參數集也完全取決於特定的 HAL 實現。
  • 從 Android 10 開始,HAL 可以通過選擇不在getCameraIdList中公佈部分或全部 PHYSICAL_ID 來減少應用可以直接打開的攝像頭數量。然後調用getPhysicalCameraCharacteristics必須返回物理相機的特徵。

驗證

邏輯多攝像頭設備必須像任何其他常規攝像頭一樣通過攝像頭 CTS。針對此類設備的測試用例可以在LogicalCameraDeviceTest模塊中找到。

這三個 ITS 測試針對多攝像頭系統,以促進圖像的正確融合:

場景 1 和場景 4 測試使用ITS-in-a-box測試台運行。 test_multi_camera_match測試斷言,當兩個攝像頭都啟用時,圖像中心的亮度匹配。 test_multi_camera_alignment測試斷言相機間距、方向和失真參數已正確加載。如果多攝像頭系統包括寬視場攝像頭 (>90o),則需要 ITS 盒的 rev2 版本。

Sensor_fusion是第二個測試平台,它可以實現重複的、規定的手機運動,並斷言陀螺儀和圖像傳感器時間戳匹配並且多攝像頭幀同步。

所有盒子都可以通過 AcuSpec, Inc. ( www.acuspecinc.com , fred@acuspecinc.com) 和 MYWAY Manufacturing ( www.myway.tw , sales@myway.tw) 獲得。此外,可以通過 West-Mark ( www.west-mark.com , dgoodman@west-mark.com) 購買 rev1 ITS 盒子。

最佳實踐

要在保持應用兼容性的同時充分利用多攝像頭啟用的功能,請在實施邏輯多攝像頭設備時遵循以下最佳實踐:

  • (Android 10 或更高版本)從getCameraIdList隱藏物理子攝像頭。這減少了應用程序可以直接打開的攝像頭數量,無需應用程序具有復雜的攝像頭選擇邏輯。
  • (Android 11 或更高版本)對於支持光學變焦的邏輯多攝像頭設備,實現ANDROID_CONTROL_ZOOM_RATIO API,並使用ANDROID_SCALER_CROP_REGION僅進行縱橫比裁剪。 ANDROID_CONTROL_ZOOM_RATIO使設備能夠縮小並保持更好的精度。在這種情況下,HAL 必須調整ANDROID_SCALER_CROP_REGIONANDROID_CONTROL_AE_REGIONSANDROID_CONTROL_AWB_REGIONSANDROID_CONTROL_AF_REGIONSANDROID_STATISTICS_FACE_RECTANGLESANDROID_STATISTICS_FACE_LANDMARKS和 ANDROID_STATISTICS_FACE_LANDMARKS 的坐標系,以將縮放後的視野視為傳感器活動陣列。有關ANDROID_CONTROL_ZOOM_RATIO ANDROID_SCALER_CROP_REGION使用的更多信息,請參閱camera3_crop_reprocess#cropping
  • 對於具有不同功能的物理攝像頭的多攝像頭設備,請確保僅當整個變焦範圍都支持某個值或範圍時,該設備才會宣傳支持某個控件的值或範圍。例如,如果邏輯相機由超廣角、廣角和長焦相機組成,請執行以下操作:
    • 如果物理相機的活動陣列大小不同,則相機 HAL 必須為ANDROID_SCALER_CROP_REGIONANDROID_CONTROL_AE_REGIONSANDROID_CONTROL_AWB_REGIONSANDROID_CONTROL_AF_REGIONSANDROID_STATISTICS_FACE_RECTANGLESANDROID_STATISTICS_FACE_LANDMARKS執行從物理相機的活動陣列到邏輯相機活動陣列的映射,以便從應用程序透視,坐標係是邏輯相機的活動陣列大小。
    • 如果廣角和長焦相機支持自動對焦,但超廣角相機是定焦,請確保邏輯相機宣傳自動對焦支持。 HAL 必須模擬超廣角相機的自動對焦狀態機,以便當應用程序縮小到超廣角鏡頭時,底層物理相機是固定焦點的事實對應用程序是透明的,並且支持的 AF 模式的自動對焦狀態機按預期工作。
    • 如果廣角和長焦相機支持 4K @ 60 fps,而超廣角相機僅支持 4K @ 30 fps 或 1080p @ 60 fps,但不支持 4K @ 60 fps,請確保邏輯相機不宣傳 4k @ 60 fps其支持的流配置。這保證了邏輯相機功能的完整性,確保應用程序不會在ANDROID_CONTROL_ZOOM_RATIO值小於 1 時遇到無法達到 4k @ 60 fps 的問題。
  • 從 Android 10 開始,邏輯多攝像頭不需要支持包含物理流的流組合。如果 HAL 支持與物理流的組合:
    • (Android 11 或更高版本)為了更好地處理立體深度和運動跟踪等用例,請將物理流輸出的視場設置為硬件可以實現的最大視野。但是,如果物理流和邏輯流源自同一物理攝像機,則硬件限制可能會強制物理流的視野與邏輯流相同。
    • 為了解決多個物理流造成的內存壓力,如果一個物理流預計會空閒一段時間,請確保應用程序使用discardFreeBuffers來釋放空閒緩衝區(由消費者釋放但尚未由生產者出列的緩衝區)的時間。
    • 如果來自不同物理相機的物理流通常不附加到同一個請求,請確保應用程序使用surface group ,以便使用一個緩衝區隊列來支持兩個面向應用程序的表面,從而減少內存消耗。