了解网络摄像头的Linux设备驱动程序


11

据我所知,设备驱动程序是SW的一部分,能够与连接到计算机的特定类型的设备进行通信。

对于USB网络摄像头,负责的驱动程序是UVC,它支持任何兼容UVC的设备。这意味着可以使OS或其他计算机程序访问硬件功能,而无需知道所使用硬件的确切细节。

因此,我通过运行以下命令安装了UVC Linux设备驱动程序:

opkg install kernel-module-uvcvideo

网络摄像头已被Linux内核识别:dev/video0。但是,由于缺少V4L2 API,我仍然无法使用FFmpeg执行视频流。我通过配置内核安装了V4L2。

我的查询是:

  • UVC驱动程序和V4L2如何链接在一起?
  • V4L2 API的目的是什么?
  • 如果我没有首先安装UVC,它将与V4L2一起安装吗?

LinuxTV是指:uvcvideo驱动程序实现仅遵守V4L2 API。这意味着UVC是V4L2 API的一部分吗?

Answers:


7

USB视频类别(UVC)是USB网络摄像头等应符合的规范。这样,它们可以在实现对符合UVC的设备的支持的任何系统上使用。

V4L2是linux UVC实现所依赖的linux内核视频子系统。换句话说,在内核中, UVC支持需要V4L2,但反之则不需要。

该V4L2 API是指一个用户空间 程序编程接口,记录在这里


据我了解,即使安装了uvc驱动程序,没有V4L2的内核也不能支持符合UVC的设备。
dempap 2014年

2
是。驱动程序是内核的一部分。尽管它们可以作为独立的模块进行编译,但是它们是使用内核源代码进行编译的。如果源代码与您正在运行的内核的源版本不同,则它们将无法工作,并且如果不是从相同的配置进行编译,则可能存在重大的不一致之处。例如,如果您没有在内核中内置声音核心(ALSA)(或作为模块使用),则用于声卡的模块化硬件驱动程序将无用。
goldilocks

13

您可以找到Video4Linux2的大量文档,这令人惊讶,而实际上却没有任何内容解释Video4Linux2 什么

首先,Video4Linux2是Linux驱动程序框架。框架驱动程序实际上并不直接控制设备。相反,它们提供了某种设备类别的抽象模型,在这种情况下,视频设备供应用程序使用。驱动程序框架具有三个主要优点:

  1. 为应用程序提供统一的API,以与各种物理设备一起使用,无论是通过USB,PCIe,MIPI,以太网还是其他类型的数据传输总线进行连接
  2. 在内核中,框架包含特定类的几乎所有设备驱动程序中所需的代码类型,从而大大减少了不同代码的数量
  3. 在内核中,框架为编写新的底层驱动程序提供了蓝图,这些驱动程序实际上控制着硬件,从而简化了驱动程序的开发。

因此,V4L2驱动程序是驱动UVC驱动程序的高级驱动程序,该驱动程序驱动可能正在驱动甚至更低级别的硬件驱动程序的USB驱动程序。

这个Matryoshka模型在Linux内核驱动程序树中非常常见。V4L2是更复杂的示例之一,因为某些摄像头设备需要访问多层子设备组,这些子设备可以控制摄像头并在各种组件(例如图像处理器)之间路由摄像头的输出。

您仍然可以使用设备文件和“ ioctl”系统调用直接从用户空间访问UVC驱动程序,而无需通过V4L2驱动程序,并且仍可以使用它的设备文件和“ ioctl”直接从用户空间访问底层USB驱动程序。

作为提供各种设备通用功能的通用框架,V4L2无法为您提供UVC驱动程序可以提供的所有功能(假设您的设备实际上提供了比支持V4L2更多的UVC功能) 。

因此,如果要拥有确实提供UVC规范中指定的所有功能的UVC设备,则为了实际使用其中的某些功能,您需要直接通过设备文件和“ ioctl”系统访问UVC驱动程序假设Linux内核UVC驱动程序实际上支持所有UVC规范。

但是,

uvcvideo驱动程序实现仅遵守V4L2 API

是,在当前的Linux内核中,UVC驱动程序实际上不提供比V4L2所需的更多UVC功能支持。

内核中的V4L2支持本身并不提供UVC或USB支持或较低级别的USB硬件支持。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.