
清空记录
历史记录
取消
清空记录
历史记录

1.科普概述
UVC(USB Video Class)是USB标准化组织定义的视频设备类协议。简单来说,只要摄像头支持UVC协议,插入PC、Android、Linux设备后就能直接使用,无需安装厂商专用驱动。
在Android平台上,UVC摄像头走的是External Camera Provider这条路径,通过标准的Camera2 API暴露给上层应用。这意味着:
•第三方App无需特殊适配,直接调用标准Camera2 API即可打开UVC摄像头;
•系统将UVC摄像头识别为一个EXTERNAL类型
(android.info.hardwareLevel=EXTERNAL)的摄像头设备;
•支持同时连接多路UVC摄像头;
UVC摄像头的局限性:
•不支持复杂的ISP调优(3A算法依赖摄像头自带);
•不支持高分辨率高帧率流(依赖USB带宽);
•不支持手动控制sensor/镜头参数;
2.整体架构一览
Google external camera provider的架构如下:
引用来源:Google Android USB/UVC Integrated Cameras 文档 |
关键源码路径:
•ExternalCameraProvider—外部Camera Provider实现
•ExternalCameraDevice/ExternalCameraDeviceSession—设备与会话管理
•底层V4L2驱动—drivers/media/usb/uvc/uvc_driver.c
3.Rockchip平台上的三步集成法
UVC摄像头依赖于内核的V4L2框架和UVC驱动。在瑞芯微Rockchip各SoC平台上,需要确保以下内核配置打开:
CONFIG_USB_VIDEO_CLASS=yCONFIG_MEDIA_USB_SUPPORT=y
对于RK3576,还需要确保USB Host模式正常工作(dr_mode="host"或支持OTG切换)。如果使用rockchip_linux_defconfig,通常已经包含这些配置。可以用以下方式验证:
# 确认内核已加载 UVC 驱动ls /lib/modules/$(uname -r)/kernel/drivers/media/usb/uvc/uvcvideo.ko# 或检查当前内核配置zcat /proc/config.gz | grep CONFIG_USB_VIDEO_CLASS
⚠️注意:某些Rockchip内核可能缺少以下补丁,如果遇到UVC设备枚举但无法获取流的问题,请确认是否有uvcvideo的最新补丁:
media: uvcvideo: Fix race condition in stream handling
Rockchip 平台(以 RK3576 Android 14 为例)需要完成以下配置:
添加external camera包,在device/rockchip/rk3576/device.mk中添加:
PRODUCT_PACKAGES += [email protected]_PACKAGES += [email protected]
对于Android 14的AIDL版本,瑞芯微Rockchip原厂已经为我们准备好了独立的service配置文件:
hardware/rockchip/camera_aidl/provider/├── android.hardware.camera.provider-V1-service.xml # 主摄像头├── android.hardware.camera.provider-V1-external-service.xml # 外部摄像头├── android.hardware.camera.provider-V1-internal-service-rk.xml├── android.hardware.camera.provider-V1-virtual-service.xml└── android.hardware.camera.provider-V1-hdmi-service.xml
External service的manifest内容:
android.hardware.camera.provider 2 ICameraProvider external/0
拷贝external_camera_config.xml:
PRODUCT_COPY_FILES += \ device/rockchip/common/external_camera_config.xml:$(TARGET_COPY_OUT_VENDOR)/etc/external_camera_config.xml
SELinux策略配置:
# 在 device/rockchip/common/sepolicy 中添加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的核心配置在external_camera_config.xml中。Rockchip公版配置如下:
配置项 | 默认值 | 说明 |
MaxJpegBufferSize | 3MB | 最大 JPEG buffer,建议按最大分辨率计算 |
NumVideoBuffers | 4 | 视频流 buffer 数量,越大越流畅但更耗内存 |
NumStillBuffers | 2 | 拍照流 buffer 数量 |
Orientation | 90° | 画面旋转角度,根据摄像头物理安装方向调整 |
FpsList详解:
FpsList的匹配规则是:任意小于等于width x height的分辨率,都应用该fpsBound值。因此配置必须按width/height递增、fpsBound递减的方式排列。
Rockchip平台调优建议:
1.1080pUSB摄像头→fpsBound建议设30fps
2.4K USB摄像头→建议设15fps,并调大MaxJpegBufferSize 到6MB
3.多路UVC同时工作→NumVideoBuffers适当减小到2~3,避免内存不足
4.调试方法全攻略
# 确认 USB 设备被识别lsusb# 确认 UVC 设备节点生成ls -la /dev/video*# 查看摄像头cat /sys/class/video4linux/video*/name
# 查看 camera HAL 启动日志logcat -b all | grep -i "external\|CameraProvider\|UVC"# 检查 provider 服务adb shell dumpsys media.camera | grep -A 10 "External Camera"
正常启动日志:
# 列出所有摄像头adb shell dumpsys media.camera
Q1:UVC摄像头插上后没有任何反应
Q2:画面卡顿/帧率低
可能原因 | 解决方案 |
USB2.0带宽不足(480Mbps) | 改用USB3.0接口或调低分辨率 |
NumVideoBuffers 过小 | 调大到6~8 |
CPU 软件编解码瓶颈 | 在RK平台可启用RGA 硬件加速 |
FpsList配置过严 | 适当提高对应分辨率的 fpsBound |
Q3:画面方向不对
修改external_camera_config.xml中的Orientation值:
5.瑞芯微Rockchip平台的差异化调优
Generic(通用)实现使用CPU完成以下操作:
•Buffer copy(内存拷贝)
•Scaling(尺寸缩放)
•JPEG编解码
这些操作通过libyuv和libjpeg完成,CPU开销大。在RK3576/RK3588平台上,可以利用:
RK SoC模块 | 能加速什么 | 性能提升 |
RGA(2D图形加速器) | Buffer copy、Scale、Format convert | 5-10x |
MJPEG decoder | JPEG解码 | 硬件级加速 |
RKVENC | 视频编码(录像时) | 10x+ |
Google通用实现中,IMPLEMENTATION_DEFINED格式默认输出:
•视频流→YUV_420_888
•其他流→YV12
但在Rockchip平台上,RKISP/RGA 对NV12格式有更好的硬件加速支持。如果HAL输出格式不匹配,会导致额外的格式转换开销。可以考虑在自定义实现中覆盖默认输出格式。
RK3576支持多路UVC摄像头同时工作(通过USB HUB扩展)。需要配置:
0 1
多路同时工作时的buffer策略:
•总buffer内存=∑(NumVideoBuffers×resolution_size×fps);
•如果2路1080p同时工作,建议NumVideoBuffers设为3,NumStillBuffers设为1;
6.总结
UVC摄像头虽然性能上限不如MIPI摄像头(受限于USB带宽和CPU编解码),但胜在即插即用、标准通用。在瑞芯微Rockchip平台的实际项目中,它是快速验证视觉功能的最佳搭档——插上就能出图,无需调试ISP、无需烧录固件!
步骤 | 关键动作 | 验证方法 |
内核配置 | CONFIG_USB_VIDEO_CLASS=y | /dev/video*节点出现 |
Android集成 | 添加 external service、sepolicy | logcat看到provider启动 |
XML调优 | 配置FpsList、buffer数、方向 | Camera2 API可打开预览 |
性能优化 | 调整buffer、考虑RGA加速 | dumpsys media.camera查看帧率 |
7.参考资料
1.Google USB/UVC Integrated Cameras — AOSP 官方文档
2.Rockchip_Developer_Guide_Android_Camera_Driver_CN.pdf — RK Camera驱动开发指南
3.external_camera_config.xml — device/rockchip/common/external_camera_config.xml
4.Android Camera2 API—developer.android.com/reference/android/hardware/camera2
