下面具体说明开发流程(网上找的)
打开视频设备
在V4L2中,视频设备被看做一个文件。使用open函数打开这个设备:
//用非阻塞模式打开摄像头设备
intcameraFd;
cameraFd= open(“/dev/video0″, O_RDWR| O_NONBLOCK, 0);
//如果用阻塞模式打开摄像头设备,上述代码变为:
cameraFd = open(”/dev/video0″, O_RDWR, 0);
关于阻塞模式和非阻塞模式
应用程序能够使用阻塞模式或非阻塞模式打开视频设备,如果使用非阻塞模式调用视频设备,
即使尚未捕获到信息,驱动依旧会把缓存(DQBUFF)里的东西返回给应用程序。
设定属性及采集方式
打开视频设备后,可以设置该视频设备的属性,例如裁剪、缩放等。这一步是可选的。
在Linux编程中,一般使用ioctl函数来对设备的I/O通道进行管理:
extern intioctl(int__fd, unsigned long int__request, …) __THROW;
__fd: 设备的ID,例如刚才用open函数打开视频通道后返回的cameraFd;
__request: 具体的命令标志符。
常用的结构体(参见/usr/include/linux/videodev2.h):
struct v4l2_requestbuffers reqbufs; //向驱动申请帧缓冲的请求,里面包含申请的个数
struct v4l2_capability cap; //这个设备的功能,比如是否是视频输入设备
struct v4l2_standard std; //视频的制式,比如PAL,NTSC
struct v4l2_format fmt; //帧的格式,比如宽度,高度等
struct v4l2_buffer buf; //代表驱动中的一帧
v4l2_std_id stdid; //视频制式,例如:V4L2_STD_PAL_B
struct v4l2_queryctrl query; //查询的控制
struct v4l2_control control; //具体控制的值
在进行V4L2开发中,一般会用到以下的命令标志符:
1 VIDIOC_REQBUFS: 分配内存
2 VIDIOC_QUERYBUF: 把VIDIOC_REQBUFS中分配的数据缓存转换成物理地址
3 VIDIOC_QUERYCAP: 查询驱动功能
4 VIDIOC_ENUM_FMT: 获取当前驱动支持的视频格式
5 VIDIOC_S_FMT: 设置当前驱动的频捕获格式
6 VIDIOC_G_FMT: 读取当前驱动的频捕获格式
7 VIDIOC_TRY_FMT: 验证当前驱动的显示格式
8 VIDIOC_CROPCAP: 查询驱动的修剪能力
9 VIDIOC_S_CROP: 设置视频信号的边框
10 VIDIOC_G_CROP: 读取视频信号的边框
11 VIDIOC_QBUF: 把数据从缓存中读取出来
12 VIDIOC_DQBUF: 把数据放回缓存队列
13 VIDIOC_STREAMON: 开始视频显示函数
14 VIDIOC_STREAMOFF:结束视频显示函数
15 VIDIOC_QUERYSTD:检查当前视频设备支持的标准,例如PAL或NTSC。
这些IO调用,有些是必须的,有些是可选择的。
V4L2总结(2)_数据及命令简介__zzhere2007
最新推荐文章于 2022-12-16 13:09:18 发布