gpt4 book ai didi

c - 如何等待帧和报警信号

转载 作者:行者123 更新时间:2023-11-30 15:26:06 25 4
gpt4 key购买 nike

我的网络摄像头有问题。它可能是硬件问题,但我确信不是。使用所有应用程序,我都可以看到流,但突然卡住了。因为出现问题时使用的应用程序输出如下:

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 设备。

最佳答案

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

  1. 更新您的驱动程序/内核
  2. 如果是 USB 摄像头,请尝试在不使用 USB 集线器的情况下进行连接

vidin->fd 上的 VIDIOCSYNC ioctl 会暂停执行,直到 vidin->buf 被填满。您可以通过 select 或 poll 等待填充的缓冲区变得可用

关于c - 如何等待帧和报警信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27503975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com