Как ограничить пропускную способность, которую может выделить USB-устройство в Linux?
У меня есть пара дешевых USB-веб-камер, которые я пытаюсь запустить одновременно. Запуск v4l2-ctl --list-formats-ext --device=/dev/videoN
показывает, что они обе поддерживают несколько несжатых разрешений как на 30, так и на 15 FPS.
Однако даже если я настрою одну на захват 15 FPS при разрешении 160x120, она все равно выделяет 480 Мбит/с полосы пропускания, что обычно не позволяет мне использовать какие-либо другие USB-устройства, не говоря уже о второй веб-камере. Попытка захвата со второй веб-камеры с тем же FPS/разрешением приводит к ошибке:
libv4l2: error turning on stream: No space left on device
VIDIOC_STREAMON: No space left on device
Поиск этой ошибки в Google обычно приводит к ответам вроде: «Вы SOL, может быть, купить камеру, которая поддерживает MJPG?».
Но это совершенно бессмысленно.
Захват несжатого 160x120 RGB равен 160*120*3 = 57600 байт на кадр. При 15 FPS это требует не менее 864000 байт в секунду пропускной способности (т.е. колоссальный0,864 Мбит/сили6.912 Мбит)! У меня есть USB2-концентратор, который поддерживает480 Мбит/с. У меня должно быть достаточно пропускной способности для одновременной работы десятков таких веб-камер, однако работа одной из них потребляет почти все 480 Мбит моего USB-концентратора!
Поскольку камере не требуется 480 Мбит/с для потоковой передачи 160x120, но она сообщает драйверу о необходимости выделения именно такого объема, есть ли способ на уровне ОС заставить драйвер выделить определенный объем?
решение1
Этот парень обеспечиваетрешениеЭто, кажется, работает для некоторых людей. В моем случае я попробовал это, и это ничего не изменило, но это очень зависит от оборудования.
Модуль ядра uvcvideo можно настроить так, чтобы он игнорировал запрошенную полосу пропускания и рассчитывал правильную полосу пропускания. Попробуйте:
sudo rmmod uvcvideo sudo modprobe uvcvideo quirks=128
Это будет сбрасываться при каждой перезагрузке. Если это работает, создайте следующий файл:
sudo vi /etc/modprobe.d/uvcvideo.conf
содержащий строку:
options uvcvideo quirks=128
Действительно, вэта страницаони говорят, что это не всегда может работать, и даже дают возможность изменить код в функции uvc_init_video() драйвера:
/* Isochronous endpoint, select the alternate setting. */ bandwidth = stream->ctrl.dwMaxPayloadTransferSize;