Android 允許裝置同時支援相機裝置並行串流。適用對象 因此,無論使用前置鏡頭或後置鏡頭, 相同的軟體。從 Android 11 中,Camera2 API 包含下列方法 應用程式可以透過呼叫的方式,判斷攝影機是否支援並行串流與 支援的串流設定
getConcurrentCameraIds
: 取得目前連線相機裝置的組合組合 支援並行設定相機裝置工作階段的 IDisConcurrentSessionConfigurationSupported
: 檢查所提供的相機裝置組合,以及這些裝置的對應組件 都能同時調整工作階段設定
並行期間必須支援的一組必要串流組合
串流播放時,是以攝影機裝置的相機特性在 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.6
HAL 介面的參考實作,請參閱
模擬相機 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 0
和 1
,再為相機 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
同時執行所有攝影機