在取出一帧数据的时候,我使用的是以下的代码:
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有数据的时候才返回,这样子我们取出一帧才有数据给我们取,就不会发生错误