1.V4L2框架提供的功能:

   1. video capturing and overlay(/dev/video)

   2. raw VBI capturing(/dev/vbi)

   3.FM radio reception(/dev/ratio)

    4.辅助以上三种设备启作用的子设备(/dev/v4l-subdev)    

    5.swradio (/dev/swradio)

2.设备节点支持打开多次,例如可以在一个进程中打开设备获取stream,而另一个进程绘制GUI控制面板,打开设备进行控制。

多次打开功能为可选功能,如果设备返回EBUSY,并非说明设计不合理。

3.数据流共享

  V4L2驱动程序不支持多个应用程序通过复制缓冲区、时间多路复用或类似的方式在一个设备上读写相同的数据流。这最好由用户空间中的代理应用程序来处理。当驱动以任何方式支持流共享时,它必须透明地实现。V4L2 API没有指定如何解决冲突。

4.要打开和关闭V4L2设备,应用程序分别使用open()和close()函数。设备使用ioctl()函数进行编程.

5.由于V4L2涵盖了各种各样的设备,因此API的所有方面并非都同样适用于所有类型的设备。此外,相同类型的设备具有不同的功能,该规范允许省略API中一些复杂和不太重要的部分。

VIDIOC_QUERYCAP ioctl可用于检查内核设备是否与此规范兼容,并查询设备支持的函数和I/O方法。还可以通过调用相应的ioctl来查询其他特性,例如VIDIOC_ENUMINPUT,以了解设备上视频连接器的数量、类型和名称。虽然抽象是这个API的主要目标,但ioctl也允许特定于驱动程序的应用程序可靠地识别驱动程序。

所有V4L2驱动程序必须支持VIDIOC_QUERYCAP。应用程序应该总是在打开设备后调用这个ioctl。

6.当多个应用程序共享一个设备时,可能需要为它们分配不同的优先级。与传统的“rm -rf /”学派相反,例如,视频录制应用程序可以阻止其他应用程序改变视频控制或切换当前的电视频道。另一个目标是允许低优先级的应用程序在后台工作,这可以被用户控制的应用程序抢占,并在以后的时间自动重新获得对设备的控制。

由于这些特性不能完全在用户空间中实现,所以V4L2定义了VIDIOC_G_PRIORITY和VIDIOC_S_PRIORITY ioctls来请求和查询与文件描述符关联的访问优先级。打开一个设备分配一个中等优先级,与早期版本的V4L2和驱动程序不支持这些ioctls兼容。需要不同优先级的应用程序通常会在使用VIDIOC_QUERYCAP ioctl验证设备后调用VIDIOC_S_PRIORITY。

改变驱动程序属性的ioctl(例如VIDIOC_S_INPUT)在另一个应用程序获得更高优先级后返回一个EBUSY错误代码。已经提出了通知应用程序异步属性更改的事件机制,但还没有添加。

7.视频输入和输出是设备的物理连接器。这些可以是例如RF连接器(天线/电缆),CVBS即复合视频,s -视频或RGB连接器。只有视频和VBI捕获设备有输入,输出设备有输出,每个至少有一个。无线电设备没有视频输入或输出。

要了解可用输入和输出的数量和属性,应用程序可以分别用VIDIOC_ENUMINPUT和VIDIOC_ENUMOUTPUT ioctl枚举它们。VIDIOC_ENUMINPUT ioctl返回的结构v4l2_input还包含在查询当前视频输入时适用的信号状态信息。

VIDIOC_G_INPUT和VIDIOC_G_OUTPUT ioctl返回当前视频输入或输出的索引。要选择不同的输入或输出应用程序,调用VIDIOC_S_INPUT和VIDIOC_S_OUTPUT ioctl。当设备有一个或多个输入时,驱动程序必须实现所有的输入ioctl,当设备有一个或多个输出时,所有的输出ioctl。

例1.1。当前视频输入的信息

struct v4l2_input输入;

int指数;

if (-1 == ioctl (fd, VIDIOC_G_INPUT, &index)) {

perror(“VIDIOC_G_INPUT”);

退出(EXIT_FAILURE);

Memset (&input, 0, sizeof (input));

输入。指数=指数;

if (-1 == ioctl (fd, VIDIOC_ENUMINPUT, &input)) {

perror(“VIDIOC_ENUMINPUT”);

退出(EXIT_FAILURE);

printf("当前输入:%s\n", input.name);

Example 1.2. Switching to the first video input


int index; index = 0; if (-1 == ioctl (fd, ​​VIDIOC_S_INPUT​​, &index)) { perror ("VIDIOC_S_INPUT"); exit (EXIT_FAILURE); }


8:音频输入和输出是设备的物理连接器。视频捕获设备有输入,输出设备有输出,每个0或多个。无线电设备没有音频输入或输出。它们有一个调谐器,实际上是一个音频源,但这个API只将调谐器与视频输入或输出关联起来,而无线电设备没有这些将接收到的音频信号回送到声卡上的电视卡上的连接器不视为音频输出。

音频和视频输入和输出是相关联的。选择视频源也就是选择音频源。当视频和音频源是一个调谐器时,这是最明显的。进一步的音频连接器可以结合多个视频输入或输出。假设存在两个复合视频输入和两个音频输入,可能最多有四个有效的组合。视频和音频连接器的关系在各自结构体v4l2_input或结构体v4l2_output的audioset字段中定义,其中每个位表示一个音频输入或输出从0开始的索引号。

要了解可用输入和输出的数量和属性,应用程序可以分别用vidioc_enumadio和VIDIOC_ENUMAUDOUT ioctl枚举它们。vidioc_enudio ioctl返回的结构v4l2_audio还包含在查询当前音频输入时适用的信号状态信息。

VIDIOC_G_AUDIO和VIDIOC_G_AUDOUT ioctl分别报告当前的音频输入和输出。注意,与VIDIOC_G_INPUT和VIDIOC_G_OUTPUT不同,这些ioctls返回的结构与vidioc_enumadio和VIDIOC_ENUMAUDOUT一样,而不仅仅是一个索引。

为了选择一个音频输入并改变它的属性,应用程序调用VIDIOC_S_AUDIO ioctl。要选择音频输出(目前没有可更改的属性),应用程序调用VIDIOC_S_AUDOUT ioctl。

当设备有一个或多个输入时,驱动程序必须实现所有的输入ioctl,当设备有一个或多个输出时,所有的输出ioctl。当设备有任何音频输入或输出时,驱动程序必须在VIDIOC_QUERYCAP ioctl返回的v4l2_capability结构中设置V4L2_CAP_AUDIO标志。

例1.3。关于当前音频输入的信息

struct v4l2_audio音频;

Memset (&audio, 0, sizeof (audio));

if (-1 == ioctl (fd, VIDIOC_G_AUDIO, &audio)) {

perror(“VIDIOC_G_AUDIO”);

exit(EXIT_FAILURE);

printf("当前输入:%s\n", audio.name);

例1.4。切换到第一个音频输入

struct v4l2_audio音频;

Memset (&audio, 0, sizeof (audio));/ *清晰的音频。模式,音频。保留* /

音频。指数= 0;

if (-1 == ioctl (fd, VIDIOC_S_AUDIO, &audio)) {

perror(“VIDIOC_S_AUDIO”);

exit(EXIT_FAILURE);


结束!