[Android8.0/9.0/10]Camera:外接 USB 摄像头

概述

Android 平台支持使用即插即用的 USB 摄像头(即网络摄像头),但前提是这些摄像头采用标准的 Android Camera2 API 和摄像头 HIDL 接口。网络摄像头通常支持 USB 视频类 (UVC) 驱动程序,并且在 Linux 上,系统采用标准的 Video4Linux (V4L) 驱动程序控制 UVC 摄像头。

USB 相机 HAL 进程是外接摄像头提供程序的一部分,该提供程序会监听 USB 设备可用性,并相应地枚举外接摄像头设备。该进程具有与内置相机 HAL 进程类似的权限和 SE 策略。直接与 USB 设备通信的第三方网络相机应用访问 UVC 设备时所需的相机权限与所有常规相机应用所需的权限相同。

实现

系统必须支持 android.hardware.usb.host

/system/etc/permissions下需要添加host的声明
<feature name=“android.hardware.usb.host” />

此外,还必须启用Kernel的 UVC 设备内核。

+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="8388608"/>  <!-- 8MB (> 2594x1944 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="30.0" />
           <Limit  width="1920" height="1080" fpsBound="30.0" />
           <!-- image size larger than the last entry will not be supported-->
       </FpsList>
   </Device>
</ExternalCamera>

您可以通过修改 external_camera_config.xml 文件来自定义外接摄像头提供程序。具体而言,客户可以自定义以下参数:

  • 内部摄像头的排除视频节点
  • 支持的图片大小和帧速率上限
  • Inflight 缓冲区数量(在卡顿与内存之间进行权衡)

除了这些参数之外,您还可以添加自己的参数或开发自己的配置。

上一篇:C#读写修改设置调整UVC摄像头画面-滚动


下一篇:LoRa传感器在生物医学实验室中应用