树莓PI上视频采集的带宽限制及其克服方法 [英] Bandwidth limitations for video capturing on a Raspberry Pi and how to overcome them

查看:0
本文介绍了树莓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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆