libuvc

关注
义项:USB视频设备访问库
libuvc

libuvc 是一个面向 USB 视频设备的跨平台库,构建在 libusb 之上,用于访问导出标准 USB 视频类(UVC)接口的摄像头。它为开发者提供对这类设备的细粒度控制,使其能够为原本缺少驱动支持的设备编写驱动程序,或以通用方式读写 UVC 设备。该库以 BSD 许可证发布,被 Debian、Ubuntu、Fedora、Homebrew 等主流发行版和软件包管理器收录,并被 Flutter 等平台的 UVC 摄像头插件用作底层实现[1][2]。

百科 图文
目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

libuvc 是一个面向 USB 视频设备的跨平台 C 语言库,建立在 libusb 之上,向应用程序提供对 UVC(USB Video Class,USB 视频类)设备的统一访问接口。它的作用对象是那些遵循标准 UVC 接口的摄像头,即插上电脑后无需厂商专用驱动即可被识别的一类设备[3]。

该库并不提供图形界面或应用程序,只提供编程接口。开发者调用它来完成设备枚举、模式协商、视频流接收和摄像头参数控制等操作,再自行构建上层应用[2]。在常见的软件包体系中,它被拆分为运行库、开发文件与文档三个部分,运行库提供应用程序运行所需的共享对象,开发包提供编译时所需的头文件与链接信息。

原理

libuvc 的底层是 libusb,后者负责在用户空间完成 USB 通信,因此 libuvc 无需内核驱动即可直接与设备交互[2]。UVC 设备通过等时传输(Isochronous Transfer)向主机发送视频数据,等时传输的特点是保证带宽与时序、但不保证重传,适合音视频这类对时延敏感而对丢包容忍的数据流[4]。

视频数据以帧为单位组织,每一帧被切成若干载荷包,每个包带有 12 字节的载荷头,其中包含表示帧起始的标志位、呈现时间戳等字段,接收端据此把包重新拼装成完整帧[5]。帧的格式可以是未压缩的 YUY2 等,也可以是 MJPEG 压缩格式,后者按 JPEG 逐帧压缩,典型压缩比约为 10∶1[4]。

带宽是设计中的关键约束。等时传输需要在开始推流时向总线申请带宽,全速 USB 大约只有 1 MB/s 的等时带宽,高速 USB 则约为 24 MB/s,因此高分辨率未压缩视频在低速总线上难以达到高帧率,MJPEG 压缩才使大尺寸画面具备实用性[6]。按 UVC 规范,所需带宽应从设备的 USB 描述符读取,而描述符中的估计值通常偏保守,这也是常规驱动下同一 USB 总线上很难并行运行多个高分辨率摄像头的原因之一[7]。

发展历程

libuvc 早期版本 0.0.5 已出现在 2014 年前后的机器人操作系统 ROS 软件索引中,当时的代码仓库位于 ktossell 名下,该索引记录其开发状态为不再维护[8]。0.0.6 版本的源码归档时间约为 2017 年,0.0.7 版本的源码归档时间为 2024 年 1 月。

发行版收录情况随版本推进而变化。Ubuntu 在 2020 年的 20.04 LTS 中提供的是 0.0.6-1,到 2024 年的 24.04 LTS 已更新为 0.0.7 系列[9][10]。Fedora 方面,0.0.7 的打包版本从 2024 年 9 月起陆续构建,后续在 Fedora 42 至 Rawhide 等分支中继续维护[11][1]。Debian 的 0.0.7 打包修订版本号在 2025 年至 2026 年间推进到 -4 及 -4+b1。

应用

libuvc 的主要用途是为 UVC 摄像头提供统一的访问层,使应用程序不必针对每个厂商的驱动差异做适配。在上层框架中,它常与 libusb 分层配合:以 Flutter 的 UVC 摄像头插件为例,底层由 Android USB Host API 完成设备发现与权限获取,libusb 接管实际 USB 通信,libuvc 则负责 UVC 协议层面的模式协商、帧流传输与摄像头控制[2]。

在机器视觉与眼动追踪等领域,也有项目基于 libuvc 构建自有采集后端。相关项目记录显示,通过自行估算等时带宽而非直接采用设备描述符中的保守值,可以在一条高速 USB 总线上同时运行多个摄像头,例如同时采集 720p@60fps 与两路 480p@120fps 的画面[7]。

该库同时在桌面与嵌入式环境分发。除 Linux 各大发行版外,macOS 与 Linux 平台可通过 Homebrew 安装,其依赖项为 libusb[3]。构建源码时需要 libusb 与 CMake,并可选开启示例程序与测试程序的编译选项[8]。

局限

libuvc 本身不包含图像编解码能力。获取到的 MJPEG 帧需要上层自行解码,未压缩的 YUY2 等格式也需要上层完成向 RGB 的色彩空间转换,库只负责把帧数据交付给调用者[2]。

等时带宽构成硬性上限。全速 USB 的等时带宽约 1 MB/s,未压缩数据在 320×240 分辨率下仅能达到约 6 fps 量级;若要提高分辨率或帧率,往往只能改用 MJPEG 压缩格式,且实际帧率还受摄像头自身能力、CPU 与内存等系统瓶颈制约[6][4]。

该项目的维护状态并不活跃。ROS 软件索引将对应仓库的开发状态标注为不再维护,上游文档站点也由其自行托管,同步发版节奏受上游进度制约[8]。此外,设备描述符中申报的带宽需求通常偏保守,若严格照此分配,单条总线上可并行运行的高分辨率摄像头数量会受到限制[7]。

参见

  • libusb —— libuvc 所依赖的用户空间 USB 通信库,承担底层的设备读写。

  • USB Video Class —— libuvc 所实现访问支持的标准设备类别规范。

  • MJPEG —— UVC 摄像头常用的逐帧 JPEG 压缩视频格式,用于降低等时带宽占用。

  • 等时传输 —— UVC 视频数据在 USB 上采用的传输方式,保证带宽与时序但不重传。

  • 机器人操作系统 —— 其软件索引收录并记录了 libuvc 的仓库与维护状态。

  • Homebrew —— 在 macOS 与 Linux 上提供 libuvc 安装的软件包管理器。

参考资料

  1. libuvc [引用日期2026-10-14]
  2. flutter_ffi_uvc | Flutter package [引用日期2026-10-14]
  3. libuvc [引用日期2026-10-14]
  4. EAN-USB-Video-Class-UVC-Output(PDF) [引用日期2026-10-14]
  5. xmos.com 上的 PDF 文件 [引用日期2026-10-14]
  6. VideoCamera [引用日期2026-10-14]
  7. usb-bandwidth-sync [引用日期2026-10-14]
  8. libuvc - ROS Repository Overview [引用日期2026-10-14]
  9. Ubuntu – Package Search Results -- libuvc0 [引用日期2026-10-14]
  10. Source Package: libuvc (0.0.7-1) [universe] [引用日期2026-10-14]
  11. libuvc-0.0.7-4.fc41.src.rpm [引用日期2026-10-14]
词条评价
词条统计

浏览次数:2 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-13T20:03:02Z

历史版本

本条目引用的词条
libusb USB Video Class MJPEG 等时传输 机器人操作系统 Homebrew