Android 9 推出了 API,可透過新的邏輯相機裝置支援多相機裝置,該裝置由兩個或更多指向同一方向的實體相機裝置組成。邏輯相機裝置會以單一 CameraDevice/CaptureSession 的形式公開給應用程式,讓應用程式能夠與整合 HAL 的多鏡頭功能互動。應用程式可以選擇存取及控管基礎實體相機串流、中繼資料和控制項。
圖 1. 支援多相機拍攝
在這個圖表中,不同的相機 ID 會以不同顏色標示。應用程式可同時從每個實體相機串流原始緩衝區。您也可以設定個別控制項,並從不同的實體攝影機接收個別中繼資料。
範例和來源
多鏡頭裝置必須宣傳邏輯多鏡頭功能。
相機用戶端可以呼叫 getPhysicalCameraIds()
,查詢特定邏輯相機所使用的實體裝置的相機 ID。系統會將結果中傳回的 ID 用於透過 setPhysicalCameraId()
個別控制實體裝置。您可以叫用 getPhysicalCameraResults()
,從完整結果中查詢這些個別要求的結果。
個別實體攝影機要求可能只支援部分參數。如要接收支援的參數清單,開發人員可以呼叫 getAvailablePhysicalCameraRequestKeys()
。
實體相機串流僅支援非重新處理要求,且僅限於單色和 Bayer 感應器。
實作
支援檢查清單
如要在 HAL 端新增邏輯多鏡頭裝置,請按照下列步驟操作:
- 為任何邏輯相機裝置新增
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
功能,該裝置由兩個或更多實體相機支援,且這些相機也向應用程式公開。 - 將實體相機 ID 清單填入靜態
ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS
中繼資料欄位。 - 填入深度相關靜態中繼資料,以便與實體相機串流的像素建立關聯:
ANDROID_LENS_POSE_ROTATION
、ANDROID_LENS_POSE_TRANSLATION
、ANDROID_LENS_INTRINSIC_CALIBRATION
、ANDROID_LENS_DISTORTION
、ANDROID_LENS_POSE_REFERENCE
。 將靜態
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE
中繼資料欄位設為:ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE
:如果感應器處於主-主模式,則不會進行硬體快門/曝光同步處理。ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED
:如果感應器處於主要次要模式,則硬體快門/曝光同步功能。
請為
ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS
填入個別實體攝影機支援的參數清單。如果邏輯裝置不支援個別要求,清單可能會為空白。如果支援個別要求,請處理並套用個別
physicalCameraSettings
,該要求可透過擷取要求傳送,並據此附加個別physicalCameraMetadata
。如果是 Camera HAL 裝置版本 3.5 (在 Android 10 中推出) 以上版本,請使用支援邏輯相機的目前有效實體相機 ID,填入
ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID
結果鍵。
對於執行 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 測試針對多鏡頭系統,以便正確融合圖像:
scene1/test_multi_camera_match.py
scene4/test_multi_camera_alignment.py
sensor_fusion/test_multi_camera_frame_sync.py
場景 1 和場景 4 的測試會使用 ITS-in-a-box 測試裝置執行。test_multi_camera_match
測試會斷言,在兩個相機都已啟用時,圖片中心的亮度會一致。test_multi_camera_alignment
測試會斷言相機間距、方向和變形參數是否正確載入。如果多鏡頭系統包含廣角鏡頭 (>90°),就必須使用 rev2 版的 ITS 盒。
Sensor_fusion
是第二個測試嚴謹,可讓您執行重複的預先闢謠手機動作,並斷言陀螺儀和影像感應器的時間戳記相符,以及多鏡頭影格保持同步。
所有盒子皆可透過 AcuSpec, Inc. (www.acuspecinc.com、fred@acuspecinc.com) 和 MYWAY 製造 (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_REGION
、ANDROID_CONTROL_AE_REGIONS
、ANDROID_CONTROL_AWB_REGIONS
、ANDROID_CONTROL_AF_REGIONS
、ANDROID_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_REGIONS
、ANDROID_STATISTICS_FACE_RECTANGLES
和ANDROID_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 的速度。
- 如果實體相機的使用陣列大小不同,則相機 HAL 必須從實體攝影機的主動陣列,對應到
- 從 Android 10 開始,邏輯多相機不必支援包含實體串流的串流組合。如果 HAL 支援與實體串流的組合:
- (Android 11 以上版本) 為更妥善地處理使用情境 (例如從立體聲和動作追蹤取得深度),請將實體串流輸出的視野範圍設為硬體可達到的最大值。不過,如果實體串流和邏輯串流來自相同的實體攝影機,硬體限制可能會強制實體串流的視野與邏輯串流相同。
- 如要解決多個實體串流造成的記憶體壓力,請確保應用程式在預期實體串流會閒置一段時間時,使用
discardFreeBuffers
釋出空閒緩衝區 (由消費者釋出,但尚未由生產者排除的緩衝區)。 - 如果來自不同實體相機的實體串流通常不會附加至同一個要求,請確保應用程式使用
surface group
,以便將一個緩衝區佇列用於返回兩個應用程式面向的介面,進而減少記憶體用量。