外接 USB 攝像頭

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

透過對網路攝影機的支持,設備可以用於視訊聊天和照相亭等輕量級用例。此功能不會取代 Android 手機上典型的內建相機 HAL,也不是為支援涉及高解析度和高速串流媒體、AR 和手動 ISP/感測器/鏡頭控制的性能密集型複雜任務而設計的。

USB 攝影機 HAL 流程是外部攝影機提供者的一部分,用於偵聽 USB 裝置可用性並相應地列舉外部攝影機裝置。該進程具有類似於內建相機 HAL 進程的權限和 SE 策略。直接與 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 網路攝影機必須保持插入特定設備,否則某些測試案例將失敗。