Android 平台支援使用標準 Android Camera2 API 和相機 HAL 介面,使用即插即用 USB 相機 (也就是網路攝影機)。網路攝影機通常支援 USB 視訊類別 (UVC) 驅動程式,在 Linux 上,系統會使用標準 Video4Linux (V4L) 驅動程式控制 UVC 攝影機。
有了網路攝影機的支援,裝置就能用於輕量用途,例如視訊通話和相片資訊站。這項功能不會取代 Android 手機上的一般內部相機 HAL,也不會支援需要高解析度和高速串流、擴增實境,以及手動 ISP/感應器/鏡頭控制的耗效高、複雜工作。
USB 相機 HAL 程序是外部相機供應器的一部分,可監聽 USB 裝置的可用性,並據此列舉外部相機裝置。這個程序具有權限和 SE 政策,類似於內建相機 HAL 程序。直接與 USB 裝置通訊的第三方網路攝影機應用程式,需要與任何一般相機應用程式相同的相機權限,才能存取 UVC 裝置。
範例和來源
如要進一步瞭解如何實作 USB 相機,請參閱 ExternalCameraProvider
中的外部相機供應器參考實作項目。外部相機裝置和工作階段實作項目包含在 ExternalCameraDevice
和 ExternalCameraDeviceSession
中。從 API 級別 28 開始,Java 用戶端 API 會包含 EXTERNAL
硬體層級。
實作
實作項目必須支援 android.hardware.usb.host
系統功能。
您也必須啟用 UVC 裝置的核心支援功能。您可以將下列內容新增至相應的核心 defconfig
檔案,即可啟用此功能。
+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y
如要在相應的裝置版本中啟用外部相機供應器,新增必要的 SELinux 權限、外部相機設定和外部相機供應器依附元件,請完成下列步驟:
將外部相機設定檔和外部相機程式庫新增至
device.mk
。+PRODUCT_PACKAGES += android.hardware.camera.provider-V1-external-service +PRODUCT_COPY_FILES += \ +device/manufacturerX/productY/external_camera_config.xml:$(TARGET_COPY_OUT_VENDOR)/etc/external_camera_config.xml
將外部相機供應器名稱新增至裝置 Treble HAL 資訊清單。
<hal format="aidl"> <name>android.hardware.camera.provider</name> <version>1</version> <interface> <name>ICameraProvider</name> <instance>internal/0</instance> + <instance>external/0</instance> </interface> </hal>
(選用) 如果裝置在 Treble 直通模式下執行,請更新
sepolicy
,讓cameraserver
能夠存取 UVC 攝影機。+# for external camera +allow cameraserver device:dir r_dir_perms; +allow cameraserver video_device:dir r_dir_perms; +allow cameraserver video_device:chr_file rw_file_perms;
以下是 external_camera_config.xml
的範例 (省略版權聲明行)。
<ExternalCamera> <Provider> <ignore> <!-- Internal video devices to be ignored by external camera HAL --> <id>0</id> <!-- No leading/trailing spaces --> <id>1</id> </ignore> </Provider> <!-- See ExternalCameraUtils.cpp for default values of Device configurations below --> <Device> <!-- Max JPEG buffer size in bytes--> <MaxJpegBufferSize bytes="3145728"/> <!-- 3MB (~= 1080p YUV420) --> <!-- Size of v4l2 buffer queue when streaming >= 30fps --> <!-- Larger value: more request can be cached pipeline (less janky) --> <!-- Smaller value: use less memory --> <NumVideoBuffers count="4"/> <!-- Size of v4l2 buffer queue when streaming < 30fps --> <NumStillBuffers count="2"/> <!-- List of maximum fps for various output sizes --> <!-- Any image size smaller than the size listed in Limit row will report fps (as minimum frame duration) up to the fpsBound value. --> <FpsList> <!-- width/height must be increasing, fpsBound must be decreasing--> <Limit width="640" height="480" fpsBound="30.0"/> <Limit width="1280" height="720" fpsBound="15.0"/> <Limit width="1920" height="1080" fpsBound="10.0"/> <!-- image size larger than the last entry will not be supported--> </FpsList> </Device> </ExternalCamera>
自訂
您可以透過一般自訂選項或裝置專屬最佳化方式,提升 Android 相機的效能。
一般自訂
您可以修改 external_camera_config.xml
檔案,自訂外部相機供應器。具體來說,用戶端可以自訂下列參數:
- 排除內部攝影機的影片節點
- 支援的圖片大小和畫面更新率上限
- 飛行中緩衝區數量 (卡頓與記憶體的取捨)
除了這些參數外,您也可以自行新增參數或開發設定。
裝置專屬最佳化
您也可以新增裝置專屬最佳化功能來改善效能。
緩衝區複製/縮放和 JPEG 解碼/編碼
一般實作會使用 CPU (libyuv/libjpeg),但您可以改用裝置專屬的最佳化方式。
HAL 輸出格式
泛型實作項目會使用下列輸出格式:
YUV_420_888
用於影片IMPLEMENTATION_DEFINED
緩衝YUV12
適用於所有其他IMPLEMENTATION_DEFINED
緩衝區
為提升效能,您可以將輸出格式替換為裝置專用的高效格式。您也可以在自訂導入作業中支援其他格式
驗證
支援外接相機的裝置必須通過相機 CTS 測試。在整個測試期間,外接 USB 網路攝影機必須插在特定裝置上,否則某些測試案例會失敗。