UVC(USB Video Class)是 USB 设备类规范的一种,用来让摄像头、采集卡等视频设备通过标准 USB 描述符、控制接口和视频流接口向主机输出图像。
它的核心价值是“类驱动通用”:操作系统可以用通用 UVC 驱动识别设备并采集视频,而不必为每个摄像头安装完全不同的内核驱动。
核心问题
没有 UVC 这类标准时,每个 USB 摄像头都可能用私有协议传输视频。应用需要知道厂商命令、图像格式、端点布局和控制寄存器,跨平台成本很高。
UVC 把摄像头抽象为几个通用对象:
| 对象 | 作用 |
|---|---|
| VideoControl interface | 暴露设备拓扑和控制能力,例如曝光、焦距、亮度等 |
| VideoStreaming interface | 暴露视频格式、分辨率、帧率和实际图像数据通道 |
| Input Terminal | 代表相机传感器或输入源 |
| Processing Unit | 代表亮度、对比度、白平衡等处理控制 |
| Extension Unit | 厂商自定义控制单元,含义由厂商定义 |
| endpoint | USB 上传图像数据的传输端点,常见为 isochronous 或 bulk |
核心机制
一次典型 UVC 启动流程是:
- USB 枚举:主机读取设备、配置、接口和类特定描述符。
- 能力发现:驱动从描述符中知道支持的像素格式、分辨率、帧间隔和控制位。
- 流参数协商:应用选择模式,驱动用 probe/commit 一类控制请求与设备确认。
- 开始传输:相机把帧切成 USB payload,主机驱动重组成图像帧。
- 控制调整:应用通过标准控制或厂商扩展控制曝光、增益、对焦等参数。
UVC 标准描述的是“视频设备如何被发现、配置、控制和传输数据”。它不自动等价于实时性、低延迟、确定性曝光或 硬件同步。这些能力可能存在,但要看传感器、固件、USB 控制器、驱动和厂商扩展。
工程用途
- 普通 USB 摄像头免驱采集,例如 OpenCV、V4L2、DirectShow、Media Foundation。
- USB HDMI 采集卡把外部视频源转成 UVC 摄像头。
- 嵌入式相机模块用 UVC 降低上位机驱动维护成本。
- 机器人和数据采集中快速接入图像源,但需要额外评估延迟、同步和带宽。
边界与常见坑
- UVC 是接口协议,不是图像质量保证;传感器、镜头、ISP 和压缩链路仍决定画质。
- UVC 免驱不等于“无需厂商 SDK”;厂商扩展功能仍可能需要专用工具或 Extension Unit 命令。
- UVC 不保证 UVC 相机硬件同步;外部触发、GPIO、sync out 通常是设备特性。
- 同一设备可能暴露多个
/dev/video*节点,分别对应视频流、metadata 或不同接口,不应只按编号硬编码。 - MJPEG/H.264 等压缩格式节省 USB 带宽,但会引入编码延迟和解码成本。