我遇到网络摄像头问题。它可以是硬件,但我确信它不是。 使用所有应用程序,我可以看到流但突然冻结。 由于发生问题时使用的应用程序的以下输出:
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设备。
答案 0 :(得分:1)
您使用的是什么(usb)网络摄像头和内核版本?
vidin-> fd上的VIDIOCSYNC ioctl暂停执行,直到vidin-&gt; buf被填满。您可以通过选择或轮询
等待填充的缓冲区变为可用