使用多个摄像头时出现“设备上没有剩余空间”问题

使用多个摄像头时出现“设备上没有剩余空间”问题

当我尝试从连接在单个 USB 端口上的两个 USB(UVC)摄像头捕获视频时出现错误:

libv4l2: error turning on stream: No space left on device
Unable to start capture: No space left on device

我知道这是一个已知问题;有时这是因为 USB 端口上没有剩余带宽,有时我们可以通过sudo rmmod uvcvideo; sudo modprobe uvcvideo quirks=128命令解决这个问题。

但是我发现在几乎相同的条件下(USB 2,两个相同的摄像头设备),我们可以在某些机器上获得视频流,而在某些机器上则无法获得。以下是我的调查。我想知道为什么会发生这种情况,更有趣的是,如何从两个或更多个摄像头进行流式传输。

实验

我使用的相机:ELP-USBFHD01M-L180
输出v4l2-ctl --list-formats-ext(我们仅使用 320x240;省略其他分辨率):

ioctl: VIDIOC_ENUM_FMT
    Index       : 0
    Type        : Video Capture
    Pixel Format: 'MJPG' (compressed)
    Name        : Motion-JPEG
            Size: Discrete 320x240
                    Interval: Discrete 0.008s (120.101 fps)

    Index       : 1
    Type        : Video Capture
    Pixel Format: 'YUYV'
    Name        : YUYV 4:2:2
            Size: Discrete 320x240
                    Interval: Discrete 0.033s (30.000 fps)

机器:

  • Thinkpad T440p,Ubuntu 14.04.5,USB 2
  • Odroid XU4,Ubuntu 16.04.2,USB 3
  • 树莓派 3B,Ubuntu 16.04,USB 2

方法:在每台机器上执行mjpg-streamer适用于一台或两台摄像机的 YUYV 模式或 MJPG 模式。

结果:

  • Thinkpad T440p,Ubuntu 14.04.5,USB 2
    • 两个摄像机 320x240 YUYV 以 30 fps 的速度工作。
    • 一台相机 320x240 MJPG 以 67 fps 的速度工作。
    • 两个摄像头 320x240 MJPG 无法工作。
  • Odroid XU4,Ubuntu 16.04.2,USB 3
    • 两个摄像机 320x240 YUYV 以 30 fps 的速度工作。
    • 一台相机 320x240 MJPG 以 69 fps 的速度工作。
    • 两个摄像头 320x240 MJPG 无法工作。
  • 树莓派 3B,Ubuntu 16.04,USB 2
    • 两个摄像机 320x240 YUYV 以 30 fps 的速度工作。
    • 两个 320x240 MJPG 摄像机以 65 fps 的速度工作。

因此,在 Raspberry Pi 3B 上,我们可以以 60+ FPS 的速度从两个摄像头以 MJPG 模式流式传输视频,而由于“设备上没有剩余空间”错误,我们无法在其他机器上执行此操作。

我想知道为什么,以及如何在其他机器(Thinkpad,Odroid)上提供此功能。

根据这个问题, 我检查了:

cat /sys/kernel/debug/usb/devices | grep "B: "

从摄像机流式传输时。

结果:

Thinkpad T440p,Ubuntu 14.04.5,USB 2

没有相机

3:B:  Alloc=  0/800 us ( 0%), #Int=  1, #Iso=  0
56:B:  Alloc=  0/800 us ( 0%), #Int=  3, #Iso=  0

两个摄像机 320x240 YUYV 以 30 fps 的速度工作。

3:B:  Alloc=512/800 us (64%), #Int=  4, #Iso= 10
113:B:  Alloc=  0/800 us ( 0%), #Int=  3, #Iso=  0

一台相机 320x240 MJPG 以 67 fps 的速度工作。

3:B:  Alloc=488/800 us (61%), #Int=  3, #Iso=  5
113:B:  Alloc=  0/800 us ( 0%), #Int=  3, #Iso=  0

Odroid XU4,Ubuntu 16.04.2,USB 3

没有相机

B:  Alloc=  0/800 us ( 0%), #Int=  0, #Iso=  0
B:  Alloc=  0/800 us ( 0%), #Int=  0, #Iso=  0
B:  Alloc=  0/800 us ( 0%), #Int=  0, #Iso=  0
B:  Alloc=  0/800 us ( 0%), #Int=  0, #Iso=  0
B:  Alloc= 39/900 us ( 4%), #Int=  2, #Iso=  0
B:  Alloc=  0/800 us ( 0%), #Int=  0, #Iso=  0

两个摄像机 320x240 YUYV 以 30 fps 的速度工作。

B:  Alloc=  0/800 us ( 0%), #Int=  0, #Iso=  0
B:  Alloc=  0/800 us ( 0%), #Int=  0, #Iso=  0
B:  Alloc=  0/800 us ( 0%), #Int=  0, #Iso=  0
B:  Alloc=  0/800 us ( 0%), #Int=  0, #Iso=  9
B:  Alloc= 39/900 us ( 4%), #Int=  2, #Iso=  0
B:  Alloc=  0/800 us ( 0%), #Int=  0, #Iso=  0

一台相机 320x240 MJPG 以 69 fps 的速度工作。

B:  Alloc=  0/800 us ( 0%), #Int=  0, #Iso=  0
B:  Alloc=  0/800 us ( 0%), #Int=  0, #Iso=  0
B:  Alloc=  0/800 us ( 0%), #Int=  0, #Iso=  0
B:  Alloc=  0/800 us ( 0%), #Int=  0, #Iso=  5
B:  Alloc= 39/900 us ( 4%), #Int=  2, #Iso=  0
B:  Alloc=  0/800 us ( 0%), #Int=  0, #Iso=  0

树莓派 3B,Ubuntu 16.04,USB 2

没有相机

B:  Alloc=-7151580/800 us (-893947%), #Int= -9, #Iso=-119193

两个摄像机 320x240 YUYV 以 30 fps 的速度工作。

B:  Alloc=-5395920/800 us (-674489%), #Int= -8, #Iso=-89932

两个 320x240 MJPG 摄像机以 65 fps 的速度工作。

B:  Alloc=-4363020/800 us (-545377%), #Int= -8, #Iso=-72717

非常感谢!
--Akihiko

相关内容