外接 USB 攝影機

Android 平台支援使用標準 Android Camera2 API 和相機 HAL 介面,使用即插即用 USB 相機 (也就是網路攝影機)。網路攝影機通常支援 USB 視訊類別 (UVC) 驅動程式,在 Linux 上,系統會使用標準 Video4Linux (V4L) 驅動程式控制 UVC 攝影機。

有了網路攝影機的支援,裝置就能用於輕量用途,例如視訊通話和相片資訊站。這項功能不會取代 Android 手機上的一般內部相機 HAL,也不會支援需要高解析度和高速串流、擴增實境,以及手動 ISP/感應器/鏡頭控制的耗效高、複雜工作。

USB 相機 HAL 程序是外部相機供應器的一部分,可監聽 USB 裝置的可用性,並據此列舉外部相機裝置。這個程序具有權限和 SE 政策,類似於內建相機 HAL 程序。直接與 USB 裝置通訊的第三方網路攝影機應用程式,需要與任何一般相機應用程式相同的相機權限,才能存取 UVC 裝置。

範例和來源

如要進一步瞭解如何實作 USB 相機,請參閱 ExternalCameraProvider 中的外部相機供應器參考實作項目。外部相機裝置和工作階段實作項目包含在 ExternalCameraDeviceExternalCameraDeviceSession 中。從 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 網路攝影機必須插在特定裝置上,否則某些測試案例會失敗。