Uruchomienie więcej niż jednej kamery internetowej USB w systemie Debian / Linux powoduje następujący błąd:
libv4l2: error turning on stream: No space left on device
VIDIOC_STREAMON: No space left on device
To, co początkowo wydawało się problemem programistycznym w OpenCV, przerodziło się w poszukiwanie tajemniczego problemu ze sprzętem / oprogramowaniem po tym, jak te same błędy powstały podczas uruchamiania sera i xawtv.
Najwyraźniej jest to spowodowane tym, że kamery internetowe żądają całej dostępnej przepustowości na kontrolerze hosta USB. Mając to na uwadze, postanowiłem uruchomić wireshark i capinfos, aby zobaczyć, ile pasma wykorzystuje pojedyncza kamera.
4 megabits per second at 320x240
14 megabits per second at 640x480
32 megabits per second at 1280x720
Ciekawy! To może wyjaśniać, dlaczego działają dwie kamery o rozdzielczości 320 x 240, ale zawodzi każda wyższa rozdzielczość. To tak, jakby mój kontroler USB działał tylko z szybkościami USB 1, ale lsusb pokazuje obie kamery należące do urządzenia, które podobno obsługuje 480 megabitów na sekundę.
W jednym z rozwiązań zaproponowano wymuszenie na kamerach internetowych obliczania zużycia przepustowości zamiast żądania maksymalnej wartości, uruchamiając następujące polecenia:
sudo rmmod uvcvideo
sudo modprobe uvcvideo quirks=128
Niestety nie miało to znaczenia, więc postanowiłem spróbować innego rozwiązania. Post na StackOverflow zasugerował moim kamerom internetowym użycie niższego FPS lub skompresowanego formatu wideo, takiego jak MJPEG, ale po uruchomieniu listy v4lctl żadna z moich kamer nie obsługuje zmiany trybu wideo.
I właśnie tam utknąłem. Dlaczego dwie kamery działające znacznie poniżej maksymalnej prędkości USB 2 powodują ten błąd?
ps: To nie jest problem z miejscem na dysku, df nie wyświetla żadnych zmian po uruchomieniu kamer internetowych.
pps: Jeśli to robi różnicę, oto wynik działania lsusb
v4l2-ctl
jest rzeczywiście doskonałym narzędziem do debugowania. Dowiedziałem się dużo o moim aparacie i udało mi się rozwiązać problem. W każdym razie udało mi się to naprawić, wymuszając rozdzielczość mojej kamery320x240
i używającYUYV
jako trybu wyjściowego kamery.guvcview
również bardzo pomogło.Odpowiedzią jest użycie modyfikacji uvcvideo napisanych przez SwDevRefugee i opisanych powyżej. Wspólnie z nim pracowaliśmy, aby z powodzeniem skompilować zmodyfikowany kod dla OpenWrt. Wersja, na której go uruchamiam, to OpenWRT DESIGNATED DRIVER (Bleeding Edge, r48130), na routerze wdplink wd3600:
WYNIK: Mogę mieć 3 * c270 (logitech) działający jednocześnie przy 1280x960 i 15 klatkach na sekundę w formacie MJPG, przez hub USB 2.0. Przepraszam, nie mam czwartego C270.
Mogę też mieć 2 * c270 i 1 * GEMBIRD 640 * 480 * 15 kl./sw formacie YUV, ale dodanie drugiego GEMBIRD prowadzi do przerażającego „Nie można rozpocząć przechwytywania: Brak miejsca na urządzeniu” (spacja == przepustowość tutaj, jak ty dobrze wiedzieć:)). Zauważ, że GEMBIRD (1908: 2311) == http://www.penguin.cz/~utx/hardware/USB_Camera_AX2311/ .
Wykorzystanie procesora z 3 * c270 jest dość rozsądne na wdr3600:
Jeśli społeczność zapewni trochę reputacji i wsparcia, myślę, że SwDevRefugee jest skłonny wprowadzić kod do wersji uvc-linux.
źródło
Spojrzałem na sterownik uvcvideo i parametr modułu quirks = 128 jest ignorowany, jeśli strumień jest skompresowany w formacie mjpeg.
Moje wybrane kamery to Logitech C500 i Logitech C270, i stwierdziłem, że obraz wytworzony przez C500 w rozdzielczości 1280x1024 ma rozmiar 100 kB, a obraz wytworzony przez C270 w rozdzielczości 1280 x 960 ma rozmiar 200 kB.
Jeśli uruchomię C270 przy 10 klatkach na sekundę, wówczas wymagana szybkość transmisji wynosi 10 x 200 000 x 8 = 16 Mb / s. W Ubuntu 14.04 moduł uvcdriver zawsze przydziela 196 Mb / s, niezależnie od częstotliwości klatek. W przypadku C500 jest to nieco lepsze zachowanie, ale nadal jest świnią przepustowości.
Zmodyfikowałem sterownik uvcvideo, dzięki czemu mogę zapewnić współczynnik „kompresji” dla sterownika poprzez interfejs V4L2. Jest to „trochę hacky”, ponieważ użyłem atrybutu priv w struct v4l2_pix_format do określenia wartości. W sterowniku oblicza rozmiar nieskompresowanego obrazu, a następnie dzieli przez współczynnik kompresji, aby ustalić, jakiej przepustowości USB należy użyć.
Domyślnie używam współczynnika kompresji 10, który pozwala na duży margines, jeśli aparat napotka szczególnie trudny do skompresowania obraz. C270 działający w rozdzielczości 1280x960 i 10 klatkach na sekundę wykorzystuje teraz 41 Mb / s i mogę z łatwością obsługiwać 4 kamery na jednej magistrali.
Jeśli ktoś jest zainteresowany tą funkcją, postaram się zachęcić opiekunów uvcvideo do rozważenia koncepcji współczynnika „kompresji”.
źródło
Wystąpił również błąd braku miejsca. Udało się odłączyć jedną z kamer i podłączyć ją do innego portu USB na moim stacjonarnym komputerze - jest tam około 6 lub 7 portów USB. Uruchomienie „show_webcams 0 1”, a następnie nagle wywołało dwa obrazy.
źródło