如何等待帧和报警信号

时间:2014-12-16 11:49:13

标签: c alarm v4l video4linux

我遇到网络摄像头问题。它可以是硬件,但我确信它不是。 使用所有应用程序,我可以看到流但突然冻结。 由于发生问题时使用的应用程序的以下输出:

v4l: timeout (got SIGALRM), hardware/driver problems?

我已经检查了代码和有趣的部分:

/* How many seconds to wait before deciding it's a driver problem. */
#define SYNC_TIMEOUT 3

int alarms;

void sigalarm(int signal)
{
    alarms++;
}

.................................................................................

void wait_for_frame_v4l1( input_t *vidin, int frameid )
{
    alarms = 0;
    alarm(SYNC_TIMEOUT);
    if (ioctl(vidin->fd, VIDIOCSYNC, vidin->buf + frameid) < 0 )
        fprintf(stderr, "input: Can't wait for frame %d: %s\n", frameid, strerror(errno));
    if (alarms)
        fprintf(stderr, "v4l: timeout (got SIGALRM), hardware/driver problems?");
    alarm(0);
}

我从中得出结论SYNC_TIMEOUT可能有问题。价值是3秒,这似乎已经足够了。

我的要求是帮助我查找代码,以便无限期地阻止等待框架:

如果没有帧在100毫秒内到达,那么超时并让GUI有机会自行更新。 并非所有设备都可以自由转动,因此应该支持此类设备而不会阻止GUI。

如何亚秒等待?

v4l2设备非常适用于此:

/* How many milliseconds to wait before deciding it's a driver problem. */
#define SYNC_TIMEOUT_MSECS 100

int wait_for_frame_v4l2(input_t * vidin)
{
        struct timeval timeout;
        fd_set rdset;
        int n;

        FD_ZERO(&rdset);
        FD_SET(vidin->fd, &rdset);

        timeout.tv_sec = 0;
        timeout.tv_usec = SYNC_TIMEOUT_MSECS * 1000;

        n = select(vidin->fd + 1, &rdset, 0, 0, &timeout);
        if(n == -1) {
            fprintf(stderr, "input: Can't wait for frame: %s\n", strerror(errno));
        } else if(n == 0) {
            sigalarm(0);
            return 1;
        }
        return 0;
}

但我有v4l1设备。

1 个答案:

答案 0 :(得分:1)

您使用的是什么(usb)网络摄像头和内核版本?

  1. 更新您的驱动程序/内核
  2. 如果是USB-Cam,请尝试在没有USB-hub的情况下进行连接
  3. vidin-> fd上的VIDIOCSYNC ioctl暂停执行,直到vidin-&gt; buf被填满。您可以通过选择或轮询

    等待填充的缓冲区变为可用