host_uvc 快速入门
1. 概述与作用
本样例隶属 V4L2/USB 媒体采集域,定位为 UVC Host 模式采集工具:Hi3516CV610 开发板作为 USB 主机,接收 USB UVC 摄像头数据,并保存为文件(可选)。主要解决"Hi3516CV610 作为 USB Host 直接对接 UVC 摄像头并按指定格式/分辨率采集码流或 YUV"的问题。本样例不涉及MPP媒体接口调用。
专业名词与缩写:
- UVC — USB Video Class,USB 视频类标准;UVC Host 即开发板作为 USB 主机
- V4L2 — Video4Linux2,Linux 视频设备框架
- MPLANE / single-plane — V4L2 多平面/单平面缓冲格式
- YUYV / MJPEG / H264 / H265 / NV21 / NV12 — 视频像素/编码格式
- DQBUF / QBUF / REQBUFS / STREAMON — V4L2 buffer ioctl
- USB host mode — 通过
/proc/wing-usb/10300000.usb20drd/mode切换 USB 为 Host
2. 执行准备
在编译本样例之前,请参照Hi3516CV610环境搭建指南和快速上手指南完成编译环境的搭建。
2.1 编译
进入样例目录执行 make 即可完成编译:
编译成功之后,在当前目录下会生成一个sample_host_uvc的可执行文件,可以放社区支持的开发板上运行。
请参考
samples/mpp/host_uvc/readme.txt说明查看更多注意事项。
2.2 加载 KO
UVC host 走内核驱动(uvcvideo.ko 通常内置),标准 MPP KO 非必需。
确认执行模式:执行 sample 前,需将设备设置为 host 模式(默认为 device 模式)。
注意:路径为
/proc/wing-usb/10300000.usb20drd/mode,含wing-usb段,缺失会导致命令失败。
2.3 运行时依赖
在运行样例前,需要提前准备:
-
硬件依赖:USB UVC 摄像头 +
/dev/videoX设备节点。缺设备时open(/dev/videoX)失败,打印Cannot open device并退出。 -
指定运行时依赖的so库路径
MPP样例依赖的so库位于soc/libs/musl下,需要将该目录下的so库拷贝到开发板上(或将这些so库所在的目录挂载到开发板上),并指定运行时依赖库的环境变量,假设这些so库位于/mnt/libs/,执行如下命令:
```shell
export LD_LIBRARY_PATH=/mnt/libs/:$LD_LIBRARY_PATH
```
如果是使用社区默认提供的镜像,这些so库已经打包到文件系统中,烧录到单板上后位于
/usr/lib目录下,该目录是系统默认搜索目录,不需要执行export LD_LIBRARY_PATH命令去指定。
- 样例运行时候需要的资源文件
无输入文件依赖。
3. 支持的 Case 列表
命令调用
调用语法为选项式,非数字 case,因此介绍参数的含义。命令的调用语法如下:
选项说明:
| 选项 | 说明 |
|---|---|
-f, --format <format> |
设置视频格式:H264 / H265 / MJPEG / YUYV / NV21 / NV12 |
-F, --file[=name] |
写入文件名 |
-s, --size WxH |
设置分辨率(如 1920x1080) |
--enum-formats |
枚举设备支持的格式 |
-h, --help |
显示帮助信息 |
执行 ./sample_host_uvc 不带参数可查看完整帮助:
sample_uvc_usage: ./sample_host_uvc device [options]
supported options:
-f, --format format set the video format
-F, --file[=name] write file
-h, --help show help info
-s, --size WxH set the frame size (eg. 1920x1080)
inquire USB device format: ./sample_host_uvc /dev/video0 --enum-formats
example of setting USB device format:
./sample_host_uvc /dev/video0 -fH264 -s1920x1080 -Ftest.h264
./sample_host_uvc /dev/video0 -fH265 -s1920x1080 -Ftest.h265
./sample_host_uvc /dev/video0 -fMJPEG -s1920x1080 -Ftest.mjpg
./sample_host_uvc /dev/video0 -fYUYV -s1920x1080 -Ftest.yuv
./sample_host_uvc /dev/video0 -fNV21 -s640x360 -Ftest.yuv
| 序号 | 调用示例 | 简述 | 备注 |
|---|---|---|---|
| 1 | ./sample_host_uvc /dev/video0 --enum-formats |
列出 USB 设备支持的格式 | 接入摄像头后第一步 |
| 2 | ./sample_host_uvc /dev/video0 -fH264 -s1920x1080 -Ftest.h264 |
采集 H264 1080p 到 test.h264 | 需设备支持 H264 |
| 3 | ./sample_host_uvc /dev/video0 -fH265 -s1920x1080 -Ftest.h265 |
采集 H265 1080p | 需设备支持 H265 |
| 4 | ./sample_host_uvc /dev/video0 -fMJPEG -s1920x1080 -Ftest.mjpg |
采集 MJPEG 1080p | 多数 UVC 摄像头支持 |
| 5 | ./sample_host_uvc /dev/video0 -fYUYV -s1920x1080 -Ftest.yuv |
采集 YUYV 1080p | 带宽要求高 |
| 6 | ./sample_host_uvc /dev/video0 -fNV21 -s640x360 -Ftest.yuv |
采集 NV21 360p | 需 NV21 内核补丁 |
默认 640x480 YUYV 25fps 不输出文件,保存文件需要保证当前目录的可用空间足够大,持续采集(nframes=-1)直到 SIGINT/SIGTERM 触发退出。
nframes 为采集帧数,-1 表示不限
查看摄像头支持的格式
执行 ./sample_host_uvc /dev/video0 --enum-formats 可查看设备支持的视频格式、分辨率与帧率。
示例输出(以 HT-UC400 摄像头为例):
/home/uvc # ./sample_host_uvc /dev/video0 --enum-formats
Device /dev/video0 opened.
Device `HT-UC400: HT-UC400' on `usb-xhci-hcd.0.auto-1' (driver 'uvcvideo') supports video, capture, without mplanes.
- Available formats:
Format 0: MJPEG (47504a4d)
Type: Video capture (1)
Name: Motion-JPEG
Frame size: 320x240 (1/30, 1/25, 1/20, 1/15, 1/10, 1/5)
Frame size: 640x480 (1/30, 1/25, 1/20, 1/15, 1/10, 1/5)
Frame size: 1280x720 (1/30, 1/25, 1/20, 1/15, 1/10, 1/5)
Frame size: 1920x1080 (1/30, 1/25, 1/20, 1/15, 1/10, 1/5)
Format 1: YUYV (56595559)
Type: Video capture (1)
Name: YUYV 4:2:2
Frame size: 320x240 (1/30, 1/25, 1/20, 1/15, 1/10, 1/5)
Frame size: 640x480 (1/30, 1/25, 1/20, 1/15, 1/10, 1/5)
Frame size: 1280x720 (1/10, 1/5)
Frame size: 1920x1080 (1/5)
Format 2: H264 (34363248)
Type: Video capture (1)
Name: H.264
Frame size: 320x240 (1/30, 1/25, 1/20, 1/15, 1/10, 1/5)
Frame size: 640x480 (1/30, 1/25, 1/20, 1/15, 1/10, 1/5)
Frame size: 1280x720 (1/30, 1/25, 1/20, 1/15, 1/10, 1/5)
Frame size: 1920x1080 (1/30, 1/25, 1/20, 1/15, 1/10, 1/5)
Format 3: H265 (35363248)
Type: Video capture (1)
Name: H.265
Frame size: 320x240 (1/30, 1/25, 1/20, 1/15, 1/10, 1/5)
Frame size: 640x480 (1/30, 1/25, 1/20, 1/15, 1/10, 1/5)
Frame size: 1280x720 (1/30, 1/25, 1/20, 1/15, 1/10, 1/5)
Frame size: 1920x1080 (1/30, 1/25, 1/20, 1/15, 1/10, 1/5)
执行结果验证
执行用例
选择一个设备支持的视频格式执行采集,例如:
正常输出示例(MJPEG 1080p):
Device /dev/video0 opened.
Device `HT-UC400: HT-UC400' on `usb-xhci-hcd.0.auto-1' (driver 'uvcvideo') supports video, capture, without mplanes.
video format set: MJPEG (47504a4d) 1920x1080 (stride 0) field filed_none buffer size 2073600
video format: MJPEG (47504a4d) 1920x1080 (stride 0) field filed_none buffer size 2073600
1 buffers requested.
length: 2073600 offset: 0 timestamp type/source: monotonic/soe
Buffer 0/0 mapped
^C^Cmedia exit...
正常输出示例(YUYV 1080p):
/home/uvc # ./sample_host_uvc /dev/video0 -fYUYV -s1920x1080 -Ftest.yuv
Device /dev/video0 opened.
Device `HT-UC400: HT-UC400' on `usb-xhci-hcd.0.auto-1' (driver 'uvcvideo') supports video, capture, without mplanes.
video format set: YUYV (56595559) 1920x1080 (stride 3840) field filed_none buffer size 4147200
video format: YUYV (56595559) 1920x1080 (stride 3840) field filed_none buffer size 4147200
1 buffers requested.
length: 4147200 offset: 0 timestamp type/source: monotonic/soe
Buffer 0/0 mapped
^C^C^C^Cmedia exit...
输出文件
仅当指定 -F 时,通过 fopen(file_name, "w+") 与 fwrite 写入落盘文件;无 -F 时不写文件。
控制台日志
启动时:Device ... opened.、video format set: ...、Buffer N/N mapped。
停止时:media exit...。
持续采集至 Ctrl+C(SIGINT)触发 g_uvc_exit 退出。
正确性判断
ls -l test.h264文件大小 ≈ frame_size × fps × duration。ffplay/vlc能正常播放 H264/H265 文件。- YUV 文件分辨率匹配 WxH(YUYV 一帧 = W×H×2 字节,如 1920x1080 = 4147200 字节)。
- Ctrl+C 停止后正常打印
media exit...。 - 错误情形:
Unable to start streaming、media_send_data failed!、No frames captured.、Cannot open device。
4. 其他
常见问题说明
-
sample可能会因系统内存不足被杀掉,可以通过增大OS内存和减小MMZ内存来解决,参考
docs/04参考案例/调试调优/BSP/内存布局调整指南对内存大小进行调整。 -
内核默认不支持NV21,参考
samples/mpp/host_uvc/readme.txt修改,并重新编译烧写内核; -
拉取YUV数据流时,如果CPU占用率较高,可以在
third_party/linux/linux-5.10.y/drivers/media/usb/uvc/uvc_video.c文件的前面添加如下一行,确保USB驱动分配使用的内存带Cache属性,然后编译烧写内核。