2014-12-16 25 views
0

웹캠에 문제가 있습니다. 그것은 하드웨어 일 수 있지만 나는 그것이 아니오라고 확신합니다. 모든 앱에서 스트림을 볼 수 있지만 갑자기 멈 춥니 다. 내가 코드와 흥미로운 부분을 체크 아웃 한프레임 및 알람 신호를 기다리는 방법

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 장치는이 매우 잘 작동합니다.

답변

1

어떤 종류의 (usb) 웹캠과 커널 버전을 사용하고 있습니까?

  1. 업데이트 드라이버/커널
  2. 그것이 USB-캠의 경우,이 버피 USB 허브

vidin-까지 vidin-> FD의 중단 실행에 VIDIOCSYNC ioctl을>없이 연결 시도 가득 찼다. 선택 또는 폴링을 통해 채워진 버퍼를 사용할 수있게 될 때까지 기다릴 수 있습니다