Запуск более одной веб-камеры USB в Debian / Linux приводит к следующей ошибке:
libv4l2: error turning on stream: No space left on device
VIDIOC_STREAMON: No space left on device
То, что изначально казалось проблемой программирования в OpenCV, превратилось в поиск загадочной проблемы с аппаратным и программным обеспечением после того, как те же ошибки возникли при запуске cheese и xawtv.
Очевидно, это вызвано тем, что веб-камеры запрашивают всю доступную полосу пропускания на хост-контроллере USB. Имея это в виду, я решил запустить wireshark и capinfos, чтобы увидеть, какую пропускную способность использует одна камера.
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 предлагалось указать моим веб-камерам использовать более низкий FPS или сжатый видеоформат, такой как MJPEG, но после запуска списка v4lctl ни одна из моих веб-камер не поддерживает изменение режима видео.
И вот где я застрял. Почему две веб-камеры, работающие значительно ниже максимальной скорости USB 2, могут вызвать такую ошибку?
ps: это не проблема дискового пространства, df не отображает изменений при запуске веб-камер.
pps: если это имеет значение, вот вывод команды lsusb
v4l2-ctl
действительно отличный инструмент для отладки. Многое узнал о моей камере и смог решить проблему. В любом случае, я смог исправить это, принудительно установив разрешение моей камеры320x240
и используяYUYV
режим вывода камеры.guvcview
тоже очень помог.Ответ заключается в использовании модификаций uvcvideo, написанных SwDevRefugee и описанных выше. Он и я работали вместе, чтобы успешно скомпилировать модифицированный код для OpenWrt. Версия, на которой я его запускаю, - это ДРАЙВЕР, ОПИСАННЫЙ OpenWRT (Bleeding Edge, r48130), на маршрутизаторе tplink wdr3600:
РЕЗУЛЬТАТ: у меня может быть 3 * c270 (logitech), работающий одновременно с разрешением 1280x960 и 15 кадров в секунду в формате MJPG, через концентратор USB 2.0. У меня нет четвертого с270, чтобы подключить, извините.
Я также могу иметь 2 * c270 и 1 * GEMBIRD 640 * 480 * 15 кадров в секунду в формате YUV, но добавление 2-го GEMBIRD приводит к ужасному «Невозможно начать захват: на устройстве не осталось места» (пробел == пропускная способность здесь, так как вы хорошо знать:)). Обратите внимание, что GEMBIRD (1908: 2311) == http://www.penguin.cz/~utx/hardware/USB_Camera_AX2311/ .
Использование процессора с 3 * c270 вполне разумно на wdr3600:
Если сообщество предоставит некоторую репутацию и поддержку, я думаю, что SwDevRefugee желает получить код в uvc-linux.
источник
Я посмотрел на драйвер uvcvideo и параметр модуля quirks = 128 игнорируется, если поток сжат в формате mjpeg.
Моими веб-камерами были Logitech C500 и Logitech C270, и я обнаружил, что изображение, создаваемое C500 в разрешении 1280x1024, имеет размер 100 Кбайт, а изображение, создаваемое C270 при разрешении 1280x960, составляет 200 Кбайт.
Если я запускаю C270 со скоростью 10 кадров в секунду, то требуемая скорость передачи данных составляет 10x200000x8 = 16 Мбит / с. В Ubuntu 14.04 модуль uvcdriver всегда выделяет 196 Мбит / с независимо от частоты кадров. Для C500 он немного лучше себя ведет, но все еще является проблемой пропускной способности.
Я изменил драйвер uvcvideo, так что я могу обеспечить коэффициент «сжатия» для драйвера через интерфейс V4L2. Это немного "хакерство", потому что я использовал атрибут priv в struct v4l2_pix_format, чтобы указать значение. В драйвере он вычисляет размер несжатого изображения, а затем делит на коэффициент сжатия, чтобы определить, какую полосу пропускания USB использовать.
По умолчанию я использую коэффициент сжатия 10, который позволяет с большим запасом, если камера сталкивается с особенно жестким изображением для сжатия. C270, работающий со скоростью 1280x960 и 10 кадров в секунду, теперь использует 41 Мбит / с, и я легко могу запустить 4 камеры на одной шине.
Если кому-то будет интересна эта функция, я постараюсь убедить сопровождающих uvcvideo рассмотреть концепцию фактора "сжатия"
источник
Я получил это из-за ошибки космоса тоже. То, что работало, состояло в том, чтобы отсоединить одну из камер и подключить ее к другому USB-порту на моем стационарном ПК - вокруг нее разбросано 6 или 7 USB-портов. Запуск 'show_webcams 0 1', а затем внезапно поднял два изображения.
источник