4

Как ограничить количество пропускной способности, которое USB-устройство может выделить в Linux?

У меня есть пара дешевых веб-камер USB, которые я пытаюсь запустить одновременно. Запуск v4l2-ctl --list-formats-ext --device=/dev/videoN показывает, что они оба поддерживают несколько несжатых разрешений при 30 и 15 FPS.

Однако, даже если я настрою один для захвата со скоростью 15 кадров в секунду и разрешением 160x120, он все равно выделяет 480 Мбит / с полосы пропускания, что обычно не позволяет мне использовать любые другие USB-устройства, а тем более вторую веб-камеру. Попытка захвата со второй веб-камеры с тем же FPS / разрешением приводит к ошибке:

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

Поиск этой ошибки обычно приводит к ответам типа: «Вы SOL, может, купите камеру, которая поддерживает MJPG?».

Но это абсолютно бессмысленно.

Захват несжатого RGB 160x120 равен 160 * 120 * 3 = 57600 байт на кадр. При 15 FPS для этого требуется как минимум 864000 байт в секунду полосы пропускания (то есть колоссальные 0,864 Мбит / с или 6,912 Мбит)! У меня USB2 концентратор, который поддерживает 480 Мбит / с. У меня должно быть достаточно пропускной способности для одновременной работы десятков этих веб-камер, но при работе с одной из них требуется почти все 480 Мбит моего USB-концентратора!

Поскольку камере не требуется 480 Мбит / с для потоковой передачи 160x120, но она сообщает драйверу, что нужно выделять столько, есть ли способ на уровне ОС заставить драйвер выделить определенное количество?

1 ответ1

2

Этот парень предлагает решение, которое, кажется, работает для некоторых людей. В моем случае я попробовал это, и это ничего не изменило, но это очень зависит от оборудования.

Модуль ядра uvcvideo можно настроить так, чтобы он игнорировал запрошенную пропускную способность и вычислял правильную пропускную способность. Пытаться:

sudo rmmod uvcvideo
sudo modprobe uvcvideo quirks=128

Это будет сбрасываться при каждой перезагрузке. Если это работает, создайте следующий файл:

sudo vi /etc/modprobe.d/uvcvideo.conf 

содержащий строку:

options uvcvideo quirks=128

Действительно, на этой странице они говорят, что это не всегда может работать, и даже дают возможность изменить код в функции драйвера vvc_init_video():

/* Isochronous endpoint, select the alternate setting. */
bandwidth = stream->ctrl.dwMaxPayloadTransferSize;

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .