Linux에서 여러 USB 웹캠 사용

Linux에서 여러 USB 웹캠 사용

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

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

처음에는 OpenCV의 프로그래밍 문제로 보였던 것이 Cheese 및 xawtv를 실행하여 동일한 오류가 발생한 후 알 수 없는 하드웨어/소프트웨어 문제에 대한 탐구로 바뀌었습니다.

분명히 USB 호스트 컨트롤러에서 사용 가능한 모든 대역폭을 요청하는 웹캠으로 인해 발생하는 것 같습니다. 그런 마음으로 나는 달리기로 결심했다.와이어샤크그리고카인포스단일 카메라가 얼마나 많은 대역폭을 사용했는지 확인합니다.

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

불행하게도 별 차이가 없었기 때문에 다른 해결 방법을 시도해 보기로 결정했습니다. 게시물스택오버플로우에서내 웹캠에 더 낮은 FPS나 MJPEG와 같은 압축된 비디오 형식을 사용하라고 제안했지만 실행한 후에는v4lctl 목록내 웹캠 중 어느 쪽도 비디오 모드 변경을 지원하지 않는 것 같습니다.

그리고 그것이 내가 붙어있는 곳입니다. USB 2의 최대 속도보다 훨씬 낮은 속도로 작동하는 두 개의 웹캠에서 이 오류가 발생하는 이유는 무엇입니까?

ps: 디스크 공간 문제가 아닙니다. df는 웹캠이 시작될 때 변경 사항을 표시하지 않습니다.

pps: 변화가 있다면 다음과 같습니다.lsusb의 출력

답변1

딩딩! freenode의 #v4l에 있는 좋은 사람들의 도움을 받아 이 문제를 해결했습니다.

간단히 말하면:v4l2-ctlUSB 카메라 문제를 디버깅하는 데 가장 적합한 도구입니다. 사용 가능한 모든 명령과 매뉴얼 페이지를 읽으면 재미있을 것이라고 약속합니다. 사용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 이하의 해상도에 만족하지 않는 한.*

답변2

대답은 SwDevRefugee가 작성하고 위에서 설명한 uvcvideo 수정 사항을 사용하는 것입니다. 그와 나는 함께 작업하여 OpenWrt용으로 컴파일된 모드 코드를 성공적으로 얻었습니다. 내가 실행 중인 버전은 tplink wdr3600 라우터의 OpenWRT DESIGNATED DRIVER(Bleeding Edge, r48130)입니다.

결과: USB 2.0 허브를 통해 1280x960 및 MJPG 형식의 15fps에서 3*c270(logitech)을 동시에 실행할 수 있습니다. 연결할 네 번째 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에 가져올 것이라고 생각합니다.

답변3

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

제가 선택한 웹캠은 Logitech C500과 Logitech C270이었고, C500에서 1280x1024로 생성한 이미지는 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 관리자가 "압축" 요소 개념을 고려하도록 노력하겠습니다.

답변4

저도 공간 부족 오류가 발생했습니다. 카메라 중 하나를 분리하고 고정 PC에 있는 다른 USB 포트에 연결하면 효과가 있었습니다. 카메라 주위에 6~7개의 USB 포트가 흩어져 있습니다. 'show_webcams 0 1'을 실행하면 갑자기 두 이미지가 나타납니다.

관련 정보