对于linux下的一个v4l2设备编程一般包括以下步骤:
1) 打开设备
2)改变设备属性,选择一个视频和声音输入(有时候一个物理设备可能包括多个视频和声音输入)、视频标准、图像亮度等。
3)和驱动协商一个数据格式
4)和驱动协商输入输出方法(read,write,mmap,User Pointers,DMA buffer importing,等)
5)数据的输入输出循环(获取数据)
6)关闭设备
注:实际编程的步骤是依赖具体的属于那种设备,例如,Video Capture,Video Overlay ,Video Output,Video Output Overlay,Codec,Effect Devices,Raw VBI Data,
Sliced VBI Data,Teletext ,Radio,RDS,Event,Sub-device
本文主要翻译有关caputure device 部分。
视频捕捉设备对视频模拟信号采样,将采样得到的数字信号存储在内存中。现在几乎所有的视频捕捉设备能够在每秒捕捉25到30帧。
按照惯例,v4l2视频捕捉设备能够通过名为/dev/video0--/dev/video63(其主设备号为81,此设备号从0到63)的特殊字符设备文件来访问。通常,、/dev/video一般符号链接到优先选用的视频设备。注意,相同的设备文件被视频输出设备使用。(不懂?)
1)打开和关闭设备分别用open(),和close()函数
2)因为v4l2覆盖很多中设备,不是所有的API可以应用到所有设备上的,此外,相同种类的设备可能有不同的能力。querying capabilities可以让我们忽略一些复杂难懂而且不是太重要的API。所有的v4l2驱动都支持VIDIOC_QUERYCAP命令,应用程序也应该在打开设备后,用ioctl()函数调用此命令。检查是否支持想用的设备功能如caputure功能,I/O方法(read/write,mmap等)。
3)为了知道可用的视频输入输出的数量和属性,应用程序能列举每个输入输出,分别用VIDIOC_ENUMINPUT
and VIDIOC_ENUMOUTPUT
ioctl。
VIDIOC_G_INPUT
and VIDIOC_G_OUTPUT
ioctl返回当前视频的输入输出。应用程序可以使用VIDIOC_S_INPUT
and VIDIOC_S_OUTPUT
ioctl选择视频的输入输出通道。
4)其他补充的功能。
视频捕捉设备可能会支持audio input, tuner, controls, cropping and scalingand streaming parameterioctl
5)图像格式协商
视频捕捉的结果由cropping(裁剪)和图像格式参数决定。cropping选择设备捕捉视频图像的区域,图像格式,决定图像以什么格式存储的在内存中,例如以RGB还是YUV颜色空间、图像的宽和高(以像素为单位),两者一起决定了图像怎样被裁剪。
照例,以上这些参数不在open()函数时重新设定,对一个设备编程就好像对一个普通的文件进行读,适当的书面v4l2应用程序确保设备得到他们想要的,包括cropping和scaling。(Well written V4L2 applications ensure they really get what they want, including cropping and scaling.)
裁剪初始化最小的要求是重新设定裁剪参数到默认值,为了去查询现在图像的格式,应用程序需要用call the VIDIOC_G_FMT
ioctl,为了要求不同的图像格式参数,应用程序call the VIDIOC_S_FMT
ioctl.
6)读取图像数
据视频捕捉设备可能支持read(),也可能之处l流I/O(即mmap和user pointer io)