웹캠에 문제가 있습니다. 그것은 하드웨어 일 수 있지만 나는 그것이 아니오라고 확신합니다. 모든 앱에서 스트림을 볼 수 있지만 갑자기 멈 춥니 다. 내가 코드와 흥미로운 부분을 체크 아웃 한프레임 및 알람 신호를 기다리는 방법
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 자체를 업데이트 할 수있는 기회를 제공 :
내 요구 나 프레임을 기다리는 무기한 차단하지 않는 코드를 CHAGE 수 있도록하는 것입니다. 모든 기기가 휠을 자유롭게 사용할 수있는 것은 아니므로 앱은 GUI를 차단하지 않고 이러한 기기를 지원해야합니다.
어떻게하면 좋을까요 잠깐 기다리고 계십니까?
/* 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 장치가 :
V4L2 장치는이 매우 잘 작동합니다.