zoukankan      html  css  js  c++  java
  • 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
    ");
    return -10;
    }
    printf("VIDIOC_DQBUF success
    ");

    运行的结果是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有数据的时候才返回,这样子我们取出一帧才有数据给我们取,就不会发生错误

  • 相关阅读:
    POJ2983Is the Information Reliable
    POJ2706Connect
    POJ1716Integer Intervals
    js Number 转为 百分比
    c# Unicode编码
    json datatable
    分割js 数组
    IQueryable定义一个扩展方法。分页
    sql 计算岁数
    sql 获取一个周的周一和周日
  • 原文地址:https://www.cnblogs.com/yangjiquan/p/11369472.html
Copyright © 2011-2022 走看看