V4L2中出现的问题

Posted yangjiquan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了V4L2中出现的问题相关的知识,希望对你有一定的参考价值。

在取出一帧数据的时候,我使用的是以下的代码:

struct v4l2_buffer buf;
memset(&buf, 0, sizeof(buf));
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;

if(ioctl(fd, VIDIOC_DQBUF, &buf) == -1)

printf("VIDIOC_DQBUF failed\n");
return -10;

printf("VIDIOC_DQBUF success\n");

 

运行的结果是ioctl一直返回-1,一直无法解决这个问题

但当我在这一步之前加上select进行检测,就解决了这个问题

fd_set fds;
struct timeval tv;
FD_ZERO(&fds);
FD_SET(fd, &fds);
tv.tv_sec = 2;
tv.tv_usec = 0;
int ret;
ret = select(fd+1, &fds, NULL, NULL, &tv);

 

这以上代码中设置时延来检测fd是否有数据,当fd有数据的时候,select才会返回,不然select会阻塞在那里等待;

这样子就解决了之前的问题,之前的问题是当开始启动摄像头获取数据的时候,马上使用ioctl获取一帧的数据,但这个时候队列中还没有消息,所以ioctl返回-1,发出命令失败

在使用select的时候,当fd有数据的时候才返回,这样子我们取出一帧才有数据给我们取,就不会发生错误

以上是关于V4L2中出现的问题的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu Opencv Camera settings V4L2 error 不支持曝光控制

使用 v4l2 捕获相机图像非常慢

V4L2测试时出现Segmentation fault

V4L2学习笔记

V4L2 采用多线程采集视频 , 保存的视频播放卡顿的问题

二十四V4L2框架分析和虚拟摄像头驱动编写