Android 平台支援使用隨插即用 USB 攝影機 (即 網路攝影機) Android Camera2 API 和相機 HAL 存取 API一般支援的網路攝影機 USB 視訊類別 (UVC) 而在 Linux 上 Video4Linux (V4L) 驅動程式是用於控制 UVC 攝影機。
裝置支援網路攝影機,因此能用於簡易用途,例如 影片即時通訊和照片資訊站。這項功能無法取代一般內部 Android 手機的相機 HALs 支援耗用大量效能的複雜工作,包括高解析度和 以及高速串流、AR 和手動 ISP/感應器/鏡頭。
USB 攝影機 HAL 程序屬於外部相機供應商的一部分, 監聽 USB 裝置可用性,並列舉外部相機裝置 。這項程序的權限和 SE 政策類似 內建相機 HAL 程序可進行通訊的第三方網路攝影機應用程式 透過 USB 裝置直接使用 UVC 需要相同的相機權限才能存取 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
緩衝區- 其他
IMPLEMENTATION_DEFINED
緩衝區的YUV12
如要提升效能,您可以將輸出格式替換為裝置專屬格式 有效格式。您也可以使用自訂的 模式
驗證
支援外接攝影機的裝置必須通過 相機 CTS。外接 USB 在整個測試期間,網路攝影機必須持續插上特定裝置。 否則部分測試案例將會失敗。