UVC协议
时间: 2025-07-14 12:18:02 AIGC 浏览: 29
<think>我们正在讨论的是UVC协议(USB Video Class),而不是之前提到的USV(无人水面艇)。根据提供的引用,UVC协议是USB协议下的一个子类,专门用于视频设备。用户要求详解UVC协议,因此我们需要围绕UVC协议展开。
根据引用[1]和[2]:
- UVC协议是USB视频捕获设备的协议标准。
- 它允许USB摄像头等设备在不同的操作系统和平台上兼容,无需额外驱动。
- 一个设备可能同时具备多种功能(如音频和视频),因此可能同时使用UVC(视频)和UAC(音频)协议。
根据引用[3]:
- UVC协议包含描述符(Descriptors)和请求(Requests)两大部分。
- 描述符包括设备描述符、配置描述符、接口关联描述符、视频控制接口描述符、视频流接口描述符等。
- 请求包括标准请求和类特定请求(Class-specific Requests),其中类特定请求又分为视频控制(VideoControl)和视频流(VideoStreaming)的请求。
接下来,我们将详细解释UVC协议的关键部分:
### 1. UVC协议概述
UVC协议是USB Implementers Forum制定的标准,用于规范USB视频设备(如摄像头、视频采集卡)与主机之间的通信。它属于USB设备类协议(Class Specification)中的一种,其目的是实现设备即插即用,无需厂商提供特定驱动。
### 2. UVC设备描述符结构
UVC设备使用一系列描述符来定义其功能和特性。这些描述符按照层次结构组织:
- **设备描述符(Device Descriptor)**:描述整个设备的基本信息,如厂商ID、产品ID、设备类等。对于UVC设备,设备类(bDeviceClass)通常设置为0xEF(表示Miscellaneous Device Class),而设备子类(bDeviceSubClass)为0x02(表示Common Class),协议(bDeviceProtocol)为0x01(表示Interface Association Descriptor)[^3]。
- **配置描述符(Configuration Descriptor)**:描述设备的配置信息,包括该配置下的接口数量、供电配置等。
- **接口关联描述符(Interface Association Descriptor, IAD)**:用于关联多个接口(例如视频控制接口和视频流接口)为一个功能单元。
- **视频控制接口描述符(Video Control Interface Descriptor)**:描述视频控制功能,包括支持的控件(如亮度、对比度)和终端(Terminal)单元。
- **视频流接口描述符(Video Streaming Interface Descriptor)**:描述视频流传输的格式(如未压缩的YUV、MJPEG、H.264等)和帧设置(分辨率、帧率等)。视频流接口可以有多个备用设置(Alternate Setting),每个备用设置对应不同的带宽需求(如不同的分辨率或帧率)[^3]。
### 3. 请求(Requests)
UVC设备通过控制传输(Control Transfer)与主机通信,包括两种类型的请求:
- **标准请求(Standard Requests)**:所有USB设备都必须支持的请求,如获取描述符(GET_DESCRIPTOR)、设置配置(SET_CONFIGURATION)等。
- **类特定请求(Class-specific Requests)**:UVC设备特有的请求,分为视频控制和视频流两类:
- **视频控制请求**:用于控制视频设备的属性,如设置/获取亮度、对比度等。
- **视频流请求**:用于控制视频流传输,如设置视频流格式、帧率等。
### 4. 数据传输
UVC设备通过两种端点(Endpoint)传输数据:
- **控制端点(Endpoint 0)**:用于传输控制请求(如设置参数)。
- **流端点(Isochronous Endpoint 或 Bulk Endpoint)**:用于传输视频流数据。等时传输(Isochronous)常用于实时视频,因为它保证带宽但可能丢包;批量传输(Bulk)则保证数据不丢失但实时性较差。
### 5. 工作流程
1. **枚举过程**:设备插入主机后,主机通过控制端点获取描述符,识别为UVC设备并加载通用驱动。
2. **配置设备**:主机发送类特定请求配置视频控制参数(如选择视频格式、分辨率)。
3. **视频流传输**:主机选择视频流接口的备用设置(Alternate Setting)并启动传输,设备开始通过流端点发送视频数据。
### 示例:描述符结构片段
以下是一个简化的UVC设备描述符结构示例(以文本描述):
```
设备描述符
└─配置描述符
├─接口关联描述符(IAD)
├─视频控制接口
│ ├─视频控制接口描述符
│ ├─输入终端描述符(如摄像头传感器)
│ ├─处理单元描述符(如处理图像效果)
│ └─输出终端描述符(连接至视频流接口)
└─视频流接口
├─接口描述符(备用设置0:未激活)
└─接口描述符(备用设置1:激活,包含格式和帧描述符)
└─等时端点描述符(用于传输视频流)
```
### 6. UVC协议版本
UVC协议有多个版本,如UVC 1.0、1.1、1.5等。较新的版本支持更多特性,例如更高的分辨率、H.264编码等[^1]。
### 7. 应用
由于UVC协议标准化,现代操作系统(Windows、macOS、Linux)都内置了UVC驱动,因此大多数USB摄像头可以直接使用。在嵌入式设备中,也可以实现UVC设备功能(如树莓派作为USB摄像头)。
### 8. 开发资源
开发UVC设备需要参考官方文档《USB Device Class Definition for Video Devices》。同时,Linux内核中有UVC驱动(`uvcvideo`模块)和Gadget驱动(用于实现UVC设备功能)的源码参考。
---
§§相关问题§§
1. UVC协议支持哪些视频编码格式?
2. 如何实现一个UVC设备?
3. UVC协议中的视频控制请求具体包含哪些控制项?
4. UVC协议与UAC协议有什么区别和联系?
5. UVC协议在Linux系统中是如何被支持的?</think>以下是关于 **UVC协议(USB Video Class)** 的详细解析,结合引用内容与协议核心机制:
---
### 一、UVC协议基础
1. **定义与目的**
UVC(USB Video Class)是 **USB协议的子类标准**,专为USB视频设备(如摄像头、视频采集卡)设计。其核心目标是:
- 提供统一的设备驱动规范,实现 **跨平台即插即用**(Windows/macOS/Linux无需额外驱动)[^2]
- 标准化视频数据传输与控制逻辑,简化设备开发
2. **协议架构**
UVC协议基于USB协议栈构建,分为两层:
- **控制层**:管理设备参数(分辨率、帧率、亮度等)
- **流层**:传输实际视频流数据
```plaintext
USB协议栈
├── UVC控制层 (Control Interface)
│ ├── 亮度/对比度调节
│ ├── 分辨率设置
│ └── 格式协商
└── UVC流层 (Streaming Interface)
├── 视频流传输 (Isochronous/Bulk模式)
└── 实时数据包管理
```
---
### 二、关键组件详解
#### 1. **描述符(Descriptors)**
描述符定义设备的功能特性,层级结构如下:
- **设备描述符**:设备类型、厂商ID、产品ID
- **配置描述符**:供电模式、接口数量
- **接口关联描述符 (IAD)**:关联视频控制与视频流接口[^3]
- **视频控制接口描述符**:
- 包含输入终端(如摄像头传感器)
- 处理单元(图像处理模块)
- 输出终端(连接主机)
- **视频流接口描述符**:
- 支持多个备用设置(Alternate Settings),如:
- `Alternate setting 0`:空闲模式(不传输数据)
- `Alternate setting 1`:激活传输(指定分辨率/帧率)
- **字符串描述符**:自定义参数名称(如厂商名称)[^3]
#### 2. **请求(Requests)**
主机通过控制传输发送指令:
- **标准请求 (Standard Requests)**
- `GET_DESCRIPTOR`:获取设备描述符
- `SET_INTERFACE`:切换备用设置(如启动视频流)
- **类特定请求 (Class-specific Requests)**
- **视频控制请求**:
- `SET_CUR`:设置参数(如调整亮度)
- `GET_CUR`:读取当前参数值
- **视频流请求**:
- `PROBE`:协商视频格式
- `COMMIT`:确认格式并启动传输[^3]
#### 3. **视频流传输模式**
- **等时传输 (Isochronous)**:
- 实时性高,容忍少量数据丢失(适用于视频会议)
- 固定带宽分配
- **批量传输 (Bulk)**:
- 高可靠性,无带宽保证(适用于录像存储)
---
### 三、工作流程示例
1. **设备枚举**
主机获取描述符 → 识别为UVC设备 → 加载通用驱动[^2]
2. **格式协商**
```mermaid
sequenceDiagram
主机->>设备: PROBE请求 (建议格式: YUV 640x480@30fps)
设备-->>主机: 返回支持参数
主机->>设备: COMMIT请求 (确认格式)
设备-->>主机: 确认响应
```
3. **视频流传输**
- 主机发送 `SET_INTERFACE` 激活 `Alternate setting 1`
- 设备通过指定端点发送视频数据包
---
### 四、协议优势与兼容性
| **特性** | **说明** |
|-------------------|--------------------------------------------------------------------------|
| **免驱兼容** | Windows XP SP1+、macOS 10.5+、Linux 2.6.26+ 原生支持[^2] |
| **多功能复合** | 可与UAC(音频类)复合,实现音视频同步传输(如网络摄像头)[^1] |
| **格式支持** | 未压缩(YUV)、压缩(MJPEG/H.264)及自定义格式 |
| **扩展性** | 通过类特定描述符支持新功能(如HDR、3D景深) |
---
### 五、开发参考
- **官方文档**:USB-IF发布的《USB Device Class Definition for Video Devices》
- **Linux驱动**:`linux/drivers/media/usb/uvc/uvc_driver.c`
- **调试工具**:Wireshark的USB抓包插件(过滤`UVC`协议)
---
阅读全文
相关推荐



















