外接 USB 摄像头(UVC Camera)

1 篇文章 0 订阅
1 篇文章 0 订阅

转载地址:https://source.android.google.cn/devices/camera/external-usb-cameras?hl=zh_cn

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

如果系统支持网络摄像头,设备便可用于视频聊天和照片冲印机等轻量级用例。此功能不能替代 Android 手机上典型的内部相机 HAL,也不是为了协助执行涉及高分辨率和高速流式传输、AR 以及手动 ISP/传感器/摄像头控制且对性能要求很高的复杂任务。

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

示例和来源

如需详细了解如何实现 USB 摄像头,请参阅 ExternalCameraProvider 中的外接摄像头提供程序参考实现。外接摄像头设备和会话实现包含在 ExternalCameraDevice 和 ExternalCameraDeviceSession 中。从 API 级别 28 开始,Java 客户端 API 包含 EXTERNAL 硬件级别。

实现

实现必须支持 android.hardware.usb.host 系统功能。

此外,还必须启用对 UVC 设备的内核支持。您可以通过将以下内容添加到相应的内核 deconfig 文件来启用该支持。

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

 

注意:请确保您还针对 UVC 视频安装了此补丁程序

要在相应的设备细分版本中启用外接摄像头提供程序,以便添加必要的 SELinux 权限、外接摄像头配置以及外接摄像头提供程序依赖项,请完成以下步骤:

 

下面的示例展示了 external_camera_config.xml(省略了版权行)。

<ExternalCamera>
    <Provider>
         <!-- Internal video devices to be ignored by external camera HAL -->
            <id>0</id> <!-- No leading/trailing spaces -->
            <id>1</id>

    </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 输出格式

通用实现采用以下输出格式:

 

支持外接摄像头的设备必须通过摄像头 CTS 测试。在整个测试运行期间,外接 USB 网络摄像头必须始终插入到特定设备,否则某些测试用例会失败。

注意media_profiles 条目不适用于外接 USB 网络摄像头,因此没有 camcorder 配置文件

此页内容对您有帮助吗?

Content and code samples on this page are subject to the licenses described in the Content License. Java is a registered trademark of Oracle and/or its affiliates.

Last updated 2019-10-10 UTC.

为了提升性能,您可以将输出格式替换为设备专用的高效格式。此外,您还可以在自定义的实现中支持其他格式

验证

 

  • 将外接摄像头配置文件和外接摄像头库添加到 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;
    

     

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

支持外接摄像头的设备必须通过摄像头 CTS 测试。在整个测试运行期间,外接 USB 网络摄像头必须始终插入到特定设备,否则某些测试用例会失败。

注意media_profiles 条目不适用于外接 USB 网络摄像头,因此没有 camcorder 配置文件.

 

验证测试:高通平台(sm8250 android 10,kernel 4.19)验证无效,RK平台有童鞋反馈是可以的。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值