V4L2
video for linux 2 有更好的扩展性和灵活性,支持的硬件设备更多。
V4L与V4L2
支持多种设备
1、视频采集接口
高频头、摄像头
2、视频输出接口
驱动计算机的外围视频图像设备(电视信号格式的设备)
3、直接传输视频接口
不经过系统CPU 直接把视频采集设备采集的信号直接输出到输出设备上
4、视频间隔消隐信号接口
使应用可以访问传输消隐期的视频信号
5、收音机接口
可处理高频头收来的音频流
基本流程
打开V4L设备节点
一般设备节点名 /dev/videoN
intfd=open("/dev/video0", O_RDWR|O_NONBLOCK);
配置设备/查询设备属性
通过ioctl操作
intioctl (int__fd, unsignedlongint__request, /*args*/);
//__request是V4L2一些ioctl命令
处理V4L视频数据
设备有些从硬件取出,送到应用程序处理。
通过V4L接口把视频数据发送给应用程序(显示屏幕或保存成为文件)。
mmap方式,驱动将内部数据空间映射到应用程序空间上,双方直接在这个空间进行数据交换,效果最高
直接读取设备文件方式 直接调用 read()、write() 函数进行数据的读入和输出,配合 select( ) 使用
用户指针方式 由应用程序申请缓冲区,缓冲区传给驱动,驱动将其作为缓冲区。内存共享。
关闭设备
调用close() ;如果是内存映射方式 在关闭前需要调用munmap接触映射
区别
V4L | V4L2 | |
头文件 | #include<linux/videodevice.h> | #include<linux/videodevice2.h> |
IOCTL编号 | VIDIOCXXXX | VIDIOC_XXXX 或者 VIDIOC_G_XXXX |
设备版本-属性 | VIDIOCGCAP | VIDIOC_QUERYCAP |
数据结构-前缀 | Video_ | v4l2_ |
V4L2框架
IC模块(实体:USB摄像头包含的ISP、Sensor,抽象:USB设备里面的抽象拓扑结构),在 /dev 目录下生成多个设备节点,IC模块还创建非V4L设备(DVB、ALSA、FB、I2C)
V4L2驱动要支持IC模块来进行音/视频的混合/编解码操作
sub-devices:有些IC模块通过一个或多个 I2C 总线连接到主桥驱动上,其他主线仍可使用。(摄像头Sensor传感器,用I2C命令 同时使用MIPI或LVDS等接口进行图像数据传输)
[MIPI] 移动行业处理器接口(Mobile Industry Processor Interface)
[LVDS] 小振幅差分信号技术(Low Voltage Differential Signaling)
[ISP] 图像信号处理(Image Signal Process)
[Sensor] 传感器
[DVB]
[ALSA]
[FB]
[I2C]