外接 USB 攝像頭

Android 平台支持使用標準的Android Camera2 API和攝像頭HIDL接口使用即插即用 USB 攝像頭(即網絡攝像頭)。網絡攝像頭通常支持USB 視頻類 (UVC)驅動程序,在 Linux 上,標準Video4Linux (V4L)驅動程序用於控制 UVC 攝像頭。

借助對網絡攝像頭的支持,設備可用於視頻聊天和照片亭等輕量級用例。此功能不會取代 Android 手機上的典型內置攝像頭 HAL,並且並非旨在支持性能密集型複雜任務,包括高分辨率和高速流、AR 和手動 ISP/傳感器/鏡頭控制。

USB 攝像頭 HAL 進程是外部攝像頭提供程序的一部分,它偵聽 USB 設備的可用性並相應地枚舉外部攝像頭設備。該進程具有類似於內置相機 HAL 進程的權限和 SE 策略。與 USB 設備直接通信的第三方網絡攝像頭應用程序需要與任何常規攝像頭應用程序相同的攝像頭權限才能訪問 UVC 設備。

示例和來源

有關如何實現 USB 攝像頭的更多信息,請參閱ExternalCameraProviderImpl_2_4中的外部攝像頭提供程序參考實現。外部攝像頭設備和會話實現包含在ExternalCameraDeviceExternalCameraDeviceSession中。從 API 級別 28 開始,Java 客戶端 API 包括EXTERNAL硬件級別。

執行

實現必須支持android.hardware.usb.host系統功能。

還必須啟用對 UVC 設備的內核支持。您可以通過將以下內容添加到相應的內核deconfig文件來啟用此功能。

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

要在相應的設備構建中啟用外部攝像頭提供程序,這會添加必要的 SELinux 權限、外部攝像頭配置和外部攝像頭提供程序依賴項,請完成以下步驟:

  • 將外置攝像頭配置文件和外置攝像頭庫添加到device.mk

    +PRODUCT_PACKAGES += android.hardware.camera.provider@2.4-impl
    +PRODUCT_PACKAGES += android.hardware.camera.provider@2.4-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="hidl">
       <name>android.hardware.camera.provider</name>
       <transport arch="32+64">passthrough</transport>
       <impl level="generic"></impl>
       <version>2.4</version>
       <interface>
           <name>ICameraProvider</name>
           <instance>legacy/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文件來自定義外部攝像頭提供程序。具體來說,客戶端可以自定義以下參數:

  • 排除內部攝像頭的視頻節點
  • 支持的圖像大小和幀率上限
  • 飛行緩衝區的數量(jank 與內存權衡)

除了這些參數之外,您還可以添加自己的參數或開發自己的配置。

特定於設備的優化

您還可以通過添加特定於設備的優化來提高性能。

緩衝區復制/縮放和 JPEG 解碼/編碼

通用實現使用 CPU (libyuv/libjpeg),但您可以將其替換為特定於設備的優化。

HAL 輸出格式

通用實現使用以下輸出格式:

  • YUV_420_888用於視頻IMPLEMENTATION_DEFINED緩衝區
  • 所有其他IMPLEMENTATION_DEFINED緩衝區的YUV12

為了提高性能,您可以使用特定於設備的高效格式替換輸出格式。您還可以在自定義實現中支持其他格式

驗證

支持外接攝像頭的設備必須通過攝像頭 CTS 。在整個測試運行期間,外部 USB 網絡攝像頭必須始終插入特定設備,否則某些測試用例將失敗。