UVC(USB Video Class)摄像头支持的视频格式取决于设备的具体实现,但通常遵循UVC标准规范。UVC标准规范支持的摄像头格式可以主要分为压缩过的和未压缩的两种,未压缩格式有YUY2 / YUYV和NV12 / NV21等,压缩过的格式有MJPEG(Motion JPEG)H.264(UVC 1.5及以上支持)和H.265等格式,在这里着重讲解一下MJPEG和YUYV两种格式
一. USB摄像头常采用的MJPG(Motion-JPEG) 和 YUYV(YUV 4:2:2) 格式的对比分析
1.1 核心区别对比表
特性 | MJPG | YUYV |
---|---|---|
编码方式 | 每帧独立JPEG压缩 | 未压缩,YUV 4:2:2 色彩空间 |
带宽占用 | 低(压缩率10:1 ~ 20:1) | 高(原始数据) |
图像质量 | 有损(可能出现块效应) | 无损(保留原始细节) |
延迟 | 较高(需压缩/解压) | 低(直接传输) |
硬件要求 | 需摄像头内置JPEG编码器 | 无需专用硬件 |
典型分辨率支持 | 更高(如4K@30fps) | 较低(受USB带宽限制) |
1.2 技术细节解析
1.2.1 MJPG (Motion-JPEG)
-
数据流结构:
- 每帧图像独立压缩为JPEG,形成视频流。
- 示例帧头:FF D8 FF E0 … (JPEG Start Of Image)。
-
带宽计算:
1920×1080 × 1.5字节(YUV420) × 压缩率(1/15) ≈ 2.5 MB/帧 2.5 MB/帧 × 30 fps = 75 MB/s → 实际USB传输约 600 Mbps(包含协议开销)
-
优点:
- 适合高分辨率(如1080p/4K)实时传输
- 节省USB带宽,兼容USB 2.0环境
-
缺点:
- 动态场景可能产生压缩伪影
- 处理时需要CPU/GPU解码(增加延迟)
1.2.2. YUYV (YUV 4:2:2)
-
像素排列:
- 每两个像素共享一组UV分量,格式为:
Y0 U0 Y1 V0 Y2 U1 Y3 V1...
- 每两个像素共享一组UV分量,格式为:
-
带宽计算:
640×480 × 2字节/像素 × 30 fps = 18.4 MB/s → 147.2 Mbps USB 2.0极限带宽约480 Mbps,实际可用约400 Mbps → 仅支持到720p@15fps。
-
优点:
- 无压缩,适合图像处理(如边缘检测、OCR)
- 低延迟,适合实时控制(机器人视觉)
-
缺点:
- 高分辨率下易超出USB带宽
- 存储需求大(1分钟1080p视频约3.5GB)
1.3 查看摄像头支持的格式的常用命令
1.3.1 查看摄像头列表&摄像头支持的格式
- Linux:使用
v4l2-ctl --list-devices
命令查看当前的摄像头列表,使用v4l2-ctl -d /dev/video1 --list-formats
命令查看这个摄像头支持的格式,使用v4l2-ctl -d /dev/video1 --list-formats-ext
命令可以进一步查看这个摄像头支持的格式的包括分辨率信息的细节。# 查看当前的摄像头列表 v4l2-ctl --list-devices # 查看这个摄像头支持的格式 v4l2-ctl -d /dev/video1 --list-formats # 查看这个摄像头支持的格式的包括分辨率信息的细节 v4l2-ctl -d /dev/video1 --list-formats-ext
1.3.2. 查看&更改指定id摄像头的详细参数信息
-
linux查看指定Id摄像头详细参数信息
v4l2-ctl -d /dev/video1 --get-fmt-video
-
输出关键字段:
Format Video Capture: Width/Height : 1920/1080 Pixel Format : 'MJPG' (Motion-JPEG) Field : None Bytes per Line : 0 Size Image : 4147200 Colorspace : sRGB Transfer Function : Rec. 709 YCbCr/HSV Encoding: ITU-R 601 Quantization : Default (maps to Full Range) Flags :
-
linux更改指定id摄像头详细参数信息
v4l2-ctl -d /dev/video1 --set-fmt-video=width=1920,height=1080,pixelformat=MJPG
-
Windows:通过工具如 AMCap查看或者更改设备属性。
- 这个更改参数信息根据我的测试是更改了电脑端对该摄像头的一个配置文件,在其他电脑上不会生效,然后重启之后这个文件仍然保存之前更改的参数。
1.3.3. linux捕获视频流
- 使用ffplay命令
ffplay -v4l2 /dev/video1 #更改为自己的video号
- 指定分辨率&输出格式使用ffplay命令
ffplay -f v4l2 -input_format mjpeg -video_size 1920x1080 /dev/video1