Использование нескольких веб-камер USB в Linux


30

Запуск более одной веб-камеры 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

Ответы:


25

Дин Дин! Удалось выяснить это с помощью хороших людей из # v4l на freenode.

Короче говоря: 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
Привет, если возможно, можете ли вы сказать мне, как я должен установить формат пикселя для 2 камер, чтобы я мог снимать обе на 640x480? Я использую OpenCV и в настоящее время испытываю ту же ситуацию, что и у вас, когда обе камеры будут работать только с
разрешением

Ага! v4l2-ctlдействительно отличный инструмент для отладки. Многое узнал о моей камере и смог решить проблему. В любом случае, я смог исправить это, принудительно установив разрешение моей камеры 320x240и используя YUYVрежим вывода камеры. guvcviewтоже очень помог.
Шехарьяр

При использовании разрешений 320x240 или ниже я получаю смешанные результаты. Я купил 4 дешевые USB-камеры, все той же марки / модели. При попытке запустить 2 при 160x120, некоторые из них будут нормально работать вместе, а некоторые выдавали ошибку памяти. Я не вижу ни рифмы, ни причины для этого. Конечно, эти веб-камеры стоят 3 доллара за штуку, так что, думаю, я получил то, за что заплатил.
Cerin

Подключение двух или более из этих камер к USB3.0 работает нормально, даже через концентратор USB2.0. Проверено с YUYV.
Михал Леон

7

Ответ заключается в использовании модификаций 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:

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 и параметр модуля 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 рассмотреть концепцию фактора "сжатия"


Я и, возможно, другие участники сообщества OpenROV хотели бы увидеть ваш мод для драйвера uvc @SwDevRefugee. Я работаю над попыткой интеграции двух веб-камер в OpenROV (одна для визуальной одометрии, направленной вниз, другая для обычного пилотирования / просмотра), но сталкиваюсь с той же проблемой BW. Задумывались ли вы о публикации вашего мода / или о подаче запроса на изменение?

Официальный способ запроса изменений в драйвере uvc - через этот список рассылки: linux-uvc-devel@lists.sourceforge.net. Я разместил свой запрос на изменение 30 декабря 2015 года вместе с некоторыми другими последующими публикациями с дополнительной информацией. У меня не было ответа от сопровождающего. Два других человека выразили заинтересованность в изменении. Я не знаю, сколько нужно, чтобы получить какое-либо действие. Возможно, @laughlinb также может публиковать сообщения в списке рассылки.
SwDevAlien

@SwDevRefugee: Я хотел бы получить ваш совет unix.stackexchange.com/q/287279/52764
Рагав,

@Ragav: Я думаю, что вам нужно изолировать проблему, открывая все камеры одновременно с соответствующим разрешением, используя хорошо управляемое приложение, такое как luvcview, которое должно давать вам информативные сообщения об ошибках в случае сбоя.
SwDevAlien

1
Проблема Рагава в том, что его камеры поддерживают только YUYV, и когда он использует флаг quirks = 0x80, драйвер заставляет его использовать по крайней мере 1024 байта / микрофрейм (65,5 Мбит / с) на камеру. Это усугубляется тем фактом, что самая низкая большая пропускная способность, которую поддерживают камеры, составляет 2040 байт / микрофрейм, поэтому, хотя он хочет только 320x240 при 6 кадров в секунду, он может иметь только две камеры на одной шине USB. Минимальное ограничение в 1024 байта / микрокадра было добавлено в драйвер uvcvideo где-то между версиями ядра 2.6.32 и 3.16.
SwDevAlien

-1

Я получил это из-за ошибки космоса тоже. То, что работало, состояло в том, чтобы отсоединить одну из камер и подключить ее к другому USB-порту на моем стационарном ПК - вокруг нее разбросано 6 или 7 USB-портов. Запуск 'show_webcams 0 1', а затем внезапно поднял два изображения.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.