树莓PI上视频采集的带宽限制及其克服方法 [英] Bandwidth limitations for video capturing on a Raspberry Pi and how to overcome them
本文介绍了树莓PI上视频采集的带宽限制及其克服方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试使用USB摄像头直接在Raspberry PI 4上捕获并保存两个视频流。这两个摄像头在/dev
中显示为/dev/video0
和/dev/video2
,并且这两个摄像头都经过独立测试,以30 fps的帧速率工作。
我使用命令同时启动了这两个流
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'
我遇到一个摄像头的帧速率为~25fps,而另一个摄像头的输出如下
frame=1 fps=0.2 q=2.9 size=6kB time=00:00:00.04 bitrate=1135.6kbits/s speed=0.00983x
其中一个视频按预期播放,另一个只存储了几帧。当我尝试使用OpenCV的VideoCapture()
类捕获视频时,也出现了同样的问题。
我看到了this问题,在ffmpeg
点赞中将帧速率降至15
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
推荐答案
30fps的640x480数据的RGB888流占用以下带宽:
640 * 480 * 3 * 30 * 8 i.e. about 220 Mbits/s
这几乎是480Mbit/s USB 2带宽的一半,因此您实际上不可能流畅地运行两个这样的流。
您可以使用lsusb -t
命令检查USB带宽。这是一个插入USB 2端口的记忆棒-您可以看到它被分配了480 MB/s:
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端口的设备,距离以太网分配的5Gbit/s更近:
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、带宽、速度分配
这篇关于树莓PI上视频采集的带宽限制及其克服方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文