外接 USB 攝影機

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 在整個測試期間,網路攝影機必須持續插上特定裝置。 否則部分測試案例將會失敗。