v4l2初探

来源:互联网 发布:曲靖市罗平县经济数据 编辑:程序博客网 时间:2024/04/28 04:43

video for linux2 之前做的那个v4l版本的保存视频,没有发现究竟是什么原因(其实我心里认为是硬件),导致的是VIDIOCSYNC的缓慢,网上查了资料,说是USB驱动,和视频驱动的原因,对实时的支持比较差,所以修改为双urb,等一些修改http://embed.chinaitlab.com/linux/777629.html 这里有详细的介绍。

 

我对于驱动的修改还不是很娴熟,索性用v4l2重写吧,看看有没有什么收获,实在没有进步的话就去改驱动。毕竟实习的时间不多了。

下面是网上找到的一些关于v4l2的编写流程

1.打开设备文件。 int fd=open(”/dev/video0″,O_RDWR);2.取得设备的capability,看看设备具有什么功能,比如是否具有视频输入,或者音频输入输出等。VIDIOC_QUERYCAP,struct v4l2_capability3.设置视频的制式和帧格式,制式包括PAL,NTSC,帧的格式个包括宽度和高度等。VIDIOC_S_STD,VIDIOC_S_FMT,struct v4l2_std_id,struct v4l2_format4.向驱动申请帧缓冲,一般不超过5个。struct v4l2_requestbuffers5.将申请到的帧缓冲映射到用户空间,这样就可以直接操作采集到的帧了,而不必去复制。mmap6.将申请到的帧缓冲全部入队列,以便存放采集到的数据.VIDIOC_QBUF,struct v4l2_buffer7.开始视频的采集。VIDIOC_STREAMON8.出队列以取得已采集数据的帧缓冲,取得原始采集数据。VIDIOC_DQBUF9.将缓冲重新入队列尾,这样可以循环采集。VIDIOC_QBUF10.停止视频的采集。VIDIOC_STREAMOFF11.关闭视频设备。close(fd);

 虽然网上资料不少,比如我最后给大家列出的,但是这些在最后都需要自己去研究,否则根本写不出一个像样的程序,估计连最基本的编译都不能通过。

开心的完成了,上述的基本步骤,有点弯路哦。

不过未经压缩的视频的采集速度是快了不少相对于v4l,不过其体积仍然是个不小的问题,20秒能达到70M以上,捕捉500多帧,这个倒是不错的。

心里有了方向就是感觉不一样,踏实,说真的这个要是做不出来我还真的没脸回去了。

压缩编码的事情,看看后续需不需要吧。

参考:

http://wangshh03.blog.163.com/blog/static/4910341520108104264775/
http://blog.ednchina.com/exbob/305022/message.aspx

http://blog.csdn.net/crazyman2010/article/details/6055022

http://blog.csdn.net/shaolyh/article/details/6583226