Використання декількох веб-камер USB в Linux


30

Запуск декількох веб-камер USB в Debian / Linux призводить до наступної помилки:

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

Те, що спочатку здавалося проблемою програмування в OpenCV, перетворилося на пошуки загадкової проблеми апаратного / програмного забезпечення після того, як були створені ті самі помилки за допомогою сиру та 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-камерою. Прочитайте всі доступні команди та сторінку man, я обіцяю весело. Використовуючи 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 і зараз переживаю таку саму ситуацію, як у вас, коли обидві камери працюватимуть лише в 320x240 або нижче
lexma

Ага! v4l2-ctlсправді є прекрасним інструментом для налагодження. Дізнався багато про мою камеру і зміг виправити проблему. У будь-якому разі, мені вдалося це виправити, примусивши роздільну здатність моєї камери до 320x240та використавши YUYVяк вихідний режим камери. guvcviewтакож дуже допомогло.
Шехаряр

Використовуючи роздільну здатність 320x240 або нижче, я отримую неоднозначні результати. Я купив 4 дешевих USB-камери, все тієї ж марки / моделі. При спробі запустити 2 на 160x120, деякі з них спрацювали б добре разом, а деякі дали помилку в пам'яті. Я не бачу жодної рими або причини для цього. Зрозуміло, ці веб-камери коштували 3 долари на кожну, так що, мабуть, я отримав те, за що заплатив.
Серін

Підключення двох або більше цих камер до USB3.0 працює добре, навіть через концентратор USB2.0. Перевірився з YUYV.
Міхал Леон

7

Відповідь полягає у використанні модифікацій uvcvideo, написаних SwDevRefugee, та описаних вище. Він і я працювали разом, щоб успішно скласти модний код, складений для OpenWrt. Версія, на якій я її запускаю, - це розроблений драйвер OpenWRT (Bleeding Edge, r48130) на маршрутизаторі tplink wdr3600:

РЕЗУЛЬТАТ: Я можу мати 3 * c270 (logitech), що працює одночасно у форматі MJPG 1280x960 та 15 кадрів в секунду, через концентратор usb 2.0. У мене немає четвертого c270, щоб підключити, вибачте.

Я також можу мати 2 * c270 та 1 * GEMBIRD 640 * 480 * 15 кадрів в секунду з форматом YUV, але додавання другого 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 у 1280х1024, становить 100 кбайт, а зображення, яке виробляється C270 у 1280х960, становить 200 кбайт.

Якщо я запускаю C270 зі швидкістю 10 кадрів в секунду, то необхідний бітрейт становить 10x200000x8 = 16 Мбіт / с. У Ubuntu 14.04 модуль uvcdriver завжди виділяє 196 Мбіт / с незалежно від частоти кадрів. Для C500 він трохи краще поводиться, але все ще є шириною пропускної здатності.

Я змінив драйвер uvcvideo, щоб я міг забезпечити драйвер фактором "стиснення" через інтерфейс V4L2. Це "маленький хакі" в тому, що я використовував атрибут priv в struct v4l2_pix_format, щоб вказати значення. У драйвері він обчислює розмір нестисненого зображення, а потім ділиться на коефіцієнт стиснення, щоб визначити, яку пропускну здатність USB використовувати.

За замовчуванням я використовую коефіцієнт стиснення 10, який дозволяє отримати великий запас, якщо на камеру стикається особливо жорстке зображення. С270, що працює в 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

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

1
Проблема Рагава полягає в тому, що його камери підтримують лише YUYV, і коли він використовує прапор quirks = 0x80, водій змушує його використовувати щонайменше 1024 байт / мікрокадр (65,5 Мбіт / с) на камеру. Це посилюється тим, що найменша більша пропускна здатність, яку підтримують камери, становить 2040 байт / мікрокадр, тому, хоча він хоче лише 320x240 при 6 кадрів в секунду, у нього може бути лише 2 камери на одній шині 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.