用V4L2采集图像经常卡死在VIDIOC_DQBUF

来源:互联网 发布:视频后期配音软件 编辑:程序博客网 时间:2024/05/02 06:45
最初写了一个小程序,循环采集10次图像,在PC机ubuntu12.4(在虚拟机里)中运行,没有发现问题,后来把采集次数改成100次后,发现经常会卡死在ioctl(fd, VIDIOC_DQBUF, &queue_buf)这里。
一开始怀疑采集间隔太短了,设备没有准备好,就把采集间隔调到1s,但是仍然会卡死,而卡在第几次采集中则不是固定的。
百度了一下,发现这个问题不算罕见,有几个论坛中有过讨论,不过最后没有一个明确的结论。稍稍整理一下,有以下几种可能:
1. UVC的驱动问题,有的驱动的分辨率默认是320*240,使用640*480资源不够用。
2. USB同步传输驱动的问题,当数据量过大时来不及传送。当应用层使用640*480时,每秒传输数据接近17M了(假设每秒20帧)。
3. 同样的程序,640*480分辨率,在有的板子上正常,有的板子上就不正常。
 
曾经试过把分辨率由640*480改成320*240,仍然会出现卡死现象。
后来程序放到ARM开发板上运行,还是同一款摄像头(曾经一度怀疑摄像头质量不过关),运气不错,运行时没出现问题。所以应该就是驱动的问题,USB驱动的问题应该不大,因为USB口接U盘之类的设备,传输没有出现问题。最大的可能性还是UVC的驱动问题。
 
总结一下论坛中提到的,加上我自己测试过的,连续采集图像
正常的,有
PC的ubuntu10.04
25帧的A9(应该是某个开发板吧)
Cubieboard2(亲测,内核版本3.4.61+)
不正常的,有
TI AM335X STARTER KIT套件(linuxkernel 3.2),
PC的ubuntu12.04(亲测,内核版本3.11.0,但是不排除虚拟机造成卡死的可能性,而且可能性很大)
 
 
http://bbs.21ic.com/icview-582975-1-1.html
http://zhidao.baidu.com/link?url=YkCzhvlGNL-rQ8NaIIAsAfexJ2IEnDst78xWUlvDj4N7niZQn0LSLorFIp8Jr0iLQ23afKC7QMVhPjp3I75QXbeLzQSG3B_9_65cYbWw8W3
 
不过既然遇到了卡死问题,至少应该通知一下别的进程吧,否则程序死了什么也做不了了。所以有必要了解一下非阻塞模式,以下是在打开摄像头的时候就设置为非阻塞模式,不过读取数据时不能保证每次都读成功:
http://www.eefocus.com/bbs/article_1156_586794.html
另外还可以通过select函数来设置超时:
http://blog.chinaunix.net/uid-21275705-id-224351.html
 
0 1
原创粉丝点击