Я экспериментирую с захватом и сохранением двух видеопотоков с помощью 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
lsusb -t
, чтобы увидеть распределение скорости. - person Mark Setchell   schedule 18.03.2021pastebin
? Вывод относится к вашему вопросу. Нажмитеedit
под своим вопросом и добавьте его. Похоже, вы подключили обе камеры к более медленным портам USB 2 с частотой 480 МГц, а не к более быстрым портам USB 3 с частотой 5 ГГц. - person Mark Setchell   schedule 20.03.2021lsusb -t
и вставить вывод в свой вопрос и проверить еще раз. Если все еще медленно, попробуйте отключить более быструю камеру, оставив другую как есть, чтобы убедиться, что дело не в кабеле. - person Mark Setchell   schedule 20.03.2021