Linux에서 여러 USB 웹캠 사용


30

Debian / Linux에서 둘 이상의 USB 웹캠을 실행하면 다음 오류가 발생합니다.

libv4l2: error turning on stream: No space left on device
VIDIOC_STREAMON: No space left on device

OpenCV에서 처음 프로그래밍 문제로 보였던 것은 치즈와 xawtv를 실행하여 동일한 오류가 발생한 후 신비한 하드웨어 / 소프트웨어 문제를 찾는 것으로 바뀌 었습니다.

USB 호스트 컨트롤러에서 사용 가능한 모든 대역폭을 요청하는 웹캠으로 인한 것 같습니다. 이를 염두에두고 단일 카메라가 얼마나 많은 대역폭을 사용하는지보기 위해 wiresharkcapinfos 를 실행하기로 결정했습니다 .

4 megabits per second at 320x240
14 megabits per second at 640x480
32 megabits per second at 1280x720

흥미 롭습니다! 320x240의 두 대의 카메라가 작동하지만 더 높은 해상도가 실패하는 이유를 설명 할 수 있습니다. 마치 USB 컨트롤러가 USB 1 속도로만 작동하는 것처럼 보이지만 lsusb 는 초당 480 메가 비트를 지원하는 장치에 속하는 두 웹캠을 모두 보여줍니다.

한 솔루션은 다음 명령을 실행하여 웹캠이 최대 사용량을 요청하는 대신 대역폭 사용량을 계산하도록 제안했습니다.

sudo rmmod uvcvideo
sudo modprobe uvcvideo quirks=128

불행히도 아무런 차이가 없었으므로 다른 솔루션을 시도하기로 결정했습니다. StackOverflow 의 게시물 웹캠에 MJPEG와 같은 낮은 FPS 또는 압축 비디오 형식을 사용하도록 제안했지만 v4lctl 목록 을 실행 한 후에 는 웹캠 중 하나가 비디오 모드 변경을 지원하지 않는 것으로 보입니다.

그리고 그것이 내가 붙어있는 곳입니다. 두 개의 웹캠이 USB 2의 최대 속도보다 느리게 작동하는 이유는 무엇입니까?

추신 : 디스크 공간 문제가 아니며 웹캠을 시작할 때 df에 아무런 변화가 없습니다.

pps : 차이 가 나면 lsusb의 결과는 다음과 같습니다.

답변:


25

딩딩! freenode에서 # v4l의 멋진 사람들의 도움으로 이것을 알아낼 수있었습니다.

간단히 말해 : v4l2-ctl 은 USB 카메라 문제를 디버깅하는 데 가장 적합한 도구입니다. 사용 가능한 모든 명령과 매뉴얼 페이지를 읽으면 약속 할 것입니다. v4l2-ctl을 사용하여 카메라 중 하나가 압축 비디오 모드를 지원하지 않음을 발견했습니다. 다음 명령을 실행하여 카메라가 지원하는 모드를 확인할 수 있습니다.

v4l2-ctl -d /dev/video0 --list-formats

다음과 같이 출력해야합니다.

 ioctl: VIDIOC_ENUM_FMT
 Index       : 0
 Type        : Video Capture
 Pixel Format: 'MJPG' (compressed)
 Name        : MJPEG

 Index       : 1
 Type        : Video Capture
 Pixel Format: 'YUYV'
 Name        : YUV 4:2:2 (YUYV)

반환 된 유일한 픽셀 형식이 "YUYV", "IUYV", "I420"또는 "GBRG"인 경우 USB 컨트롤러 * 당 하나의 카메라 만 실행할 수 있습니다. 해당 형식은 압축되지 않기 때문입니다. MJPEG 또는 다른 형식의 압축을 지원하는 여러 웹캠을 사용하면 정상적으로 작동합니다.

나와 같은 OpenCV를 사용하는 경우 OpenCV 기본값이 압축을 사용하는 것처럼 기본 픽셀 형식이 압축되지 않아도 걱정하지 마십시오.

** 320x240 해상도 이하로 만족하지 않는 한. *


1
안녕하세요, 가능한 경우 640x480에서 두 카메라를 모두 캡처 할 수 있도록 2 대의 카메라 형식을 어떻게 설정해야하는지 말씀해 주시겠습니까? 저는 OpenCV를 사용하고 있으며 현재 두 카메라가 320x240 이하에서만 작동하는 것과 같은 상황에 처해 있습니다.
lexma

아하! v4l2-ctl실제로 디버깅을위한 훌륭한 도구입니다. 내 카메라에 대해 많은 정보를 얻었고 문제를 해결할 수있었습니다. 어쨌든 카메라 해상도를 카메라 출력 모드로 320x240사용 YUYV하고 카메라 출력 모드로 사용하여 문제를 해결할 수있었습니다 . guvcview또한 많은 도움이되었습니다.
Sheharyar

320x240 이하의 해상도를 사용하면 여러 가지 결과가 나타납니다. 나는 4 개의 저렴한 USB 웹캠을 샀다. 160x120에서 2를 실행하려고하면 일부가 잘 작동하고 일부는 메모리 오류를 일으켰습니다. 운율이나 이유가 없습니다. 물론,이 웹캠은 1 달러당 3 달러이므로, 내가 지불 한 것을 얻었을 것입니다.
Cerin

두 대 이상의 카메라를 USB3.0 허브에 연결하면 USB2.0 허브를 통해서도 제대로 작동합니다. YUYV로 확인되었습니다.
Michał Leon

7

정답은 SwDevRefugee가 작성하고 위에서 설명한 uvcvideo 수정을 사용하는 것입니다. 그와 저는 OpenWrt 용으로 컴파일 된 mod'ed 코드를 성공적으로 컴파일하기 위해 협력했습니다. 내가 실행중인 버전은 tplink wdr3600 라우터의 OpenWRT DESIGNATED DRIVER (Bleeding Edge, r48130)입니다.

결과 : USB 2.0 허브를 통해 3 * c270 (logitech)을 1280x960 및 MJPG 형식의 15fps에서 동시에 실행할 수 있습니다. 나는 네 번째 c270이 없습니다. 죄송합니다.

또한 YUV 형식으로 2 * c270 및 1 * GEMBIRD 640 * 480 * 15fps를 사용할 수 있지만 두 번째 GEMBIRD를 추가하면 "캡처를 시작할 수 없습니다 : 장치에 남은 공간이 없습니다"(공백 = 대역폭)가 나타납니다. 잘 알아:)). GEMBIRD (1908 : 2311) == http://www.penguin.cz/~utx/hardware/USB_Camera_AX2311/ 입니다.

3 * c270의 CPU 사용량은 wdr3600에서 상당히 합리적입니다.

Mem: 50600K used, 75444K free, 320K shrd, 3436K buff, 8800K cached

CPU:  16% usr  27% sys   0% nic  45% idle   0% io   0% irq  10% sirq

Load average: 1.20 0.85 0.44 4/60 2546

  PID  PPID USER     STAT   VSZ %VSZ %CPU COMMAND

 2240  1679 root     S    15348  12%  17% mjpg_streamer --input input_uvc.so --

 2505  1679 root     S    15368  12%  11% mjpg_streamer --input input_uvc.so --

 2239  1679 root     S    15532  12%  11% mjpg_streamer --input input_uvc.so --

커뮤니티가 평판과 지원을 제공한다면 SwDevRefugee가 코드를 uvc-linux로 가져갈 수 있다고 생각합니다.


4

uvcvideo 드라이버를 살펴본 결과 스트림이 mjpeg 압축 된 경우 quirks = 128 모듈 매개 변수는 무시됩니다.

내가 선택한 웹캠은 Logitech C500과 Logitech C270이었습니다. 1280x1024에서 C500으로 생성 된 이미지는 100kbyte이고 C270에서 1280x960으로 생성 한 이미지는 200kbyte입니다.

C270을 10fps로 실행하면 필요한 비트 전송률은 10x200000x8 = 16Mbit / s입니다. Ubuntu 14.04에서 uvcdriver 모듈은 프레임 속도에 관계없이 항상 196Mbits / s를 할당합니다. C500의 경우 약간 더 잘 동작하지만 여전히 대역폭 호그입니다.

V4L2 인터페이스를 통해 드라이버에 "압축"요소를 제공 할 수 있도록 uvcvideo 드라이버를 수정했습니다. struct v4l2_pix_format의 priv 속성을 사용하여 값을 지정했다는 점에서 "작은 해키"입니다. 드라이버에서 압축되지 않은 이미지의 크기를 계산 한 다음 압축 계수로 나누어 사용할 USB 대역폭을 계산합니다.

기본적으로 압축률 10을 사용하면 카메라에서 압축하기 어려운 이미지가 발생할 경우 큰 마진을 얻을 수 있습니다. 1280x960 및 10fps에서 실행되는 C270은 이제 41Mbit / s를 사용하며 하나의 버스에서 4 대의 카메라를 쉽게 실행할 수 있습니다.

누구든지이 기능에 관심이 있다면 uvcvideo 관리자가 "압축"요소 개념을 고려하도록 할 것입니다.


나 그리고 잠재적으로 OpenROV 커뮤니티의 다른 사람들 은 귀하의 모드를 uvc 드라이버 @SwDevRefugee로 보길 원합니다. 나는 두 개의 웹캠을 OpenROV에 통합하려고 노력하고 있는데 (하나는 하향식 시각 측정법, 다른 하나는 일반적인 파일럿 /보기), 동일한 BW 문제가 발생합니다. 모드를 게시하거나 변경을위한 풀 요청을 제출하는 것에 대해 생각해 보셨습니까?

uvc 드라이버의 변경을 요청하는 공식적인 방법은 다음 메일 링리스트를 통해 이루어집니다 : linux-uvc-devel@lists.sourceforge.net. 추가 정보가 담긴 다른 후속 게시물과 함께 2015 년 12 월 30 일에 변경 요청을 게시했습니다. 관리자로부터 응답이 없습니다. 다른 두 사람이 변화에 관심을 표명했습니다. 나는 어떤 행동을 취해야하는지 얼마나 많은지 모른다. @laughlinb도 메일 링리스트에 게시 할 수 있습니다.
SwDevAlien

@SwDevRefugee : 나는 당신의 조언을 원합니다 unix.stackexchange.com/q/287279/52764
Ragav

@ Ragav : luvcview와 같은 잘 작동하는 응용 프로그램을 사용하여 모든 카메라를 적절한 해상도로 동시에 열어서 문제를 격리해야한다고 생각합니다. 실패하면 정보 오류 메시지가 표시됩니다.
SwDevAlien 2016 년

1
Ragav의 문제는 그의 카메라가 YUYV 만 지원하고 quirks = 0x80 플래그를 사용할 때 드라이버가 카메라 당 최소 1024 바이트 / 마이크로 프레임 (65.5Mbit / s)을 사용하도록한다는 것입니다. 이는 카메라가 지원하는 가장 낮은 대역폭이 2040 바이트 / 마이크로 프레임이므로 6fps에서 320x240 만 원하더라도 하나의 USB 버스에 2 대의 카메라 만 가질 수 있다는 사실로 인해 더욱 복잡해집니다. 커널의 2.6.32와 3.16 릴리스 사이에 uvcvideo 드라이버에 최소 1024 바이트 / 마이크로 프레임 제한이 추가되었습니다.
SwDevAlien

-1

나도 공간 부족 오류가 발생했습니다. 카메라 한 대의 플러그를 뽑고 고정 PC의 다른 USB 포트에 꽂는 것이 효과가있었습니다. 여기에는 약 6 개 또는 7 개의 USB 포트가 흩어져 있습니다. 'show_webcams 0 1'을 실행하면 갑자기 두 이미지가 나타납니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.