Ограничения пропускной способности для захвата видео на Raspberry Pi и способы их преодоления

Я экспериментирую с захватом и сохранением двух видеопотоков с помощью USB-камер непосредственно на Raspberry Pi 4. Камеры отображаются в /dev как /dev/video0 и /dev/video2, и обе тестируются независимо для работы с частотой кадров 30 кадров в секунду.

Я запустил оба потока одновременно командой

sh -c 'ffmpeg -f v4l2 -r 25 -s 640x480 -i /dev/video2 left.avi & ffmpeg -f v4l2 -r 25 -s 640x48
0 -i /dev/video0 right.avi & wait'

Я столкнулся с тем, что частота кадров одной камеры составляет ~ 25 кадров в секунду, а другая показывает следующий вывод.

frame=1 fps=0.2 q=2.9 size=6kB time=00:00:00.04 bitrate=1135.6kbits/s speed=0.00983x

Одно из видео воспроизводилось как положено, в другом сохранилось всего несколько кадров. Та же проблема возникла, когда я попытался захватить видео, используя класс VideoCapture() OpenCV.

Я видел этот вопрос и уменьшил частоту кадров до 15 в ffmpeg вот так

sh -c 'ffmpeg -f v4l2 -r 15 -s 640x480 -i /dev/video2 left.avi & ffmpeg -f v4l2 -r 15 -s 640x480 -i /dev/video0 right.avi & wait'

что не изменило проблему, просто взглянув на размеры двух захваченных файлов, мы видим, что они сильно различаются

ubuntu@ubuntu:~/code-py$ ls -l
total 520
-rw-rw-r-- 1 ubuntu ubuntu 490368 Mar 18 14:05 left.avi
-rw-rw-r-- 1 ubuntu ubuntu   5686 Mar 18 14:05 right.avi

и, по сути, то же самое происходит с использованием OpenCV capture.set(cv2.CAP_PROP_FPS, 15).

На третьем шаге я уменьшил размер видео вдвое, вот так

sh -c 'ffmpeg -f v4l2 -r 30 -s 320x240 -i /dev/video2 left.avi & ffmpeg -f v4l2 -r 30 -s 320x240 -i /dev/video0 right.avi & wait'

и это сработало! Очевидно, что-то в Raspberry перегружено количеством входящих байтов, но как мне понять, что это такое? В целом 320x240 - довольно плохое разрешение, и мне интересно, можно ли найти ограничивающий фактор и увеличить его.

Изменить:

Вот вывод lsusb -t с камерами, подключенными к порту USB 3:

/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 1: Dev 3, If 0, Class=Video, Driver=uvcvideo, 480M
        |__ Port 1: Dev 3, If 1, Class=Video, Driver=uvcvideo, 480M
        |__ Port 1: Dev 3, If 2, Class=Audio, Driver=snd-usb-audio, 480M
        |__ Port 1: Dev 3, If 3, Class=Audio, Driver=snd-usb-audio, 480M
        |__ Port 2: Dev 4, If 0, Class=Video, Driver=uvcvideo, 480M
        |__ Port 2: Dev 4, If 3, Class=Audio, Driver=snd-usb-audio, 480M
        |__ Port 2: Dev 4, If 1, Class=Video, Driver=uvcvideo, 480M
        |__ Port 2: Dev 4, If 2, Class=Audio, Driver=snd-usb-audio, 480M

person Christian Vorhemus    schedule 18.03.2021    source источник
comment
То, как вы подключили их к портам USB, может иметь значение. Попробуйте lsusb -t, чтобы увидеть распределение скорости.   -  person Mark Setchell    schedule 18.03.2021
comment
@MarkSetchell вот результат, который я получаю: pastebin.com/Yk1hKpRf   -  person Christian Vorhemus    schedule 20.03.2021
comment
Почему pastebin? Вывод относится к вашему вопросу. Нажмите edit под своим вопросом и добавьте его. Похоже, вы подключили обе камеры к более медленным портам USB 2 с частотой 480 МГц, а не к более быстрым портам USB 3 с частотой 5 ГГц.   -  person Mark Setchell    schedule 20.03.2021
comment
Pastebin, потому что текст превышает лимит комментариев. Я пробовал оба, я также подключил камеры к портам USB 3, но описанная проблема остается прежней.   -  person Christian Vorhemus    schedule 20.03.2021
comment
Может быть, вы можете подключить их к портам USB 3, повторно запустить lsusb -t и вставить вывод в свой вопрос и проверить еще раз. Если все еще медленно, попробуйте отключить более быструю камеру, оставив другую как есть, чтобы убедиться, что дело не в кабеле.   -  person Mark Setchell    schedule 20.03.2021
comment
Я сделал, выход кажется идентичным (сами камеры используют USB 2). Обе камеры сами по себе могут записывать видео со скоростью 30 кадров в секунду и разрешением 640x480.   -  person Christian Vorhemus    schedule 20.03.2021
comment
Ваш список показывает, что вы подключили их к более медленным портам USB 2. Подключите их к синим портам рядом с Ethernet, и они появятся вверху списка со скоростью 5000M.   -  person Mark Setchell    schedule 20.03.2021
comment
Я вам гарантирую, они подключены к синим портам USB 3. В целях тестирования я просто подключил USB-накопитель (с синим портом USB 3), и он показывает 5000M при запуске lsusb -t.   -  person Christian Vorhemus    schedule 20.03.2021


Ответы (1)


Поток RGB888 данных 640x480 со скоростью 30 кадров в секунду использует следующую полосу пропускания:

640 * 480 * 3 * 30 * 8    i.e. about 220 Mbits/s

И это почти половина пропускной способности 480 Мбит / с USB 2, поэтому вы не сможете плавно запустить 2 таких потока.

Вы можете проверить пропускную способность USB с помощью команды lsusb -t. Вот флешка воткнута в порт USB 2 - видно выделено 480 Мбит/с:

lsusb -t
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 3: Dev 3, If 0, Class=Mass Storage, Driver=usb-storage, 480M   <--- HERE

А вот устройство, подключенное к синему порту USB 3, расположенному ближе к Ethernet — выделено 5 Гбит/с:

lsusb -t
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M
    |__ Port 1: Dev 2, If 0, Class=Mass Storage, Driver=usb-storage, 5000M  <--- HERE
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M

Ключевые слова: USB 2, USB 3, пропускная способность, распределение скорости.

person Mark Setchell    schedule 20.03.2021
comment
Если я правильно понимаю, если я подключаю камеры USB 2 к портам USB 3, скорость передачи данных каждой камеры составляет не более 480 Мбит / с. Я ожидаю, что Raspberry Pi по-прежнему сможет принимать эти потоки данных со скоростью 220 Мбит/с с каждого порта USB 3 и обрабатывать их, но, видимо, это не так. - person Christian Vorhemus; 20.03.2021
comment
Извините, я до сих пор не знаю, как/почему ваши камеры, подключенные к портам USB 3, отображаются как подключенные к портам USB 2. Что произойдет, если вы просто подключите одну камеру и запустите lsusb -t, последовательно подключив ее к каждому из 4 портов? Он когда-нибудь попадал в начало списка на автобусе 02 на высоте 5000 м, как мой? - person Mark Setchell; 20.03.2021
comment
Нет, также показана только одна камера с 480M, я получаю 5000M с другим устройством (флешкой) с синим портом USB 3. - person Christian Vorhemus; 20.03.2021
comment
Итак, независимо от того, к какому USB-порту вы подключаете камеру, она НИКОГДА не отображается как Bus 02? - person Mark Setchell; 20.03.2021
comment
Правильно, независимо от того, в какие порты я ставлю камеры, они всегда появляются под шиной 01.Порт. Однако USB-накопитель отображается в Bus 02.Port при подключении к порту USB 3 на Raspberry Pi. - person Christian Vorhemus; 20.03.2021
comment
Вы используете Raspbian (ОС Raspberry Pi)? - person Mark Setchell; 20.03.2021
comment
Я использую Ubuntu 20.04.1 LTS на Pi. - person Christian Vorhemus; 20.03.2021
comment
Ага! Может быть, в этом разница. Извините, у меня нет других идей. - person Mark Setchell; 20.03.2021
comment
Хорошо, это моя последняя идея. Попробуйте подключить одну камеру к синему порту USB 3, а другую — к несинему порту USB 2. Возможно, наличие двух отдельных контроллеров даст каждой камере достаточную пропускную способность! - person Mark Setchell; 21.03.2021
comment
Только что попробовал, тот же результат. Событие, если я просто подключу одну камеру к порту USB 3, она появится в порту Bus 01 с 480M. Я начинаю задаваться вопросом, есть ли ограничение на стороне USB-камеры. - person Christian Vorhemus; 24.03.2021
comment
Мои деньги заключаются в том, что Ubuntu менее хорошо протестирован, чем Raspbian ... Я был бы склонен записать образ Raspbian и попробовать его. Пожалуйста, обновите, если / когда вы получите решение. Удачи! - person Mark Setchell; 24.03.2021