ubuntu 上多个摄像头的设置

1650阅读 0评论2019-08-15 iibull
分类:其他平台

Q:
  libv4l2: error turning on stream: No space left on device
A: 
  有可能的情况出现 视频捕获设备的驱动程序报告了USB带宽争用。检查像素格式是否为YUYV,恰好是未压缩的。相反,如果像素格式是MJPG(压缩),则可以在同一USB通道上具有多个设备
  v4l2-ctl -d /dev/video0 --list-formats
  输出将如下所示: 
  ioctl: VIDIOC_ENUM_FMT
    Index : 0
    Type : Video Capture
    Pixel Format: 'YUYV' 
    Name : 16bpp YUY2, 4:2:2, packed

以下是可能的解决方案:
使用来自不同制造商的捕获设备,以便加载的驱动程序不同。通常,处理多个设备的驱动程序需要有效处理带宽。
如果可用,请使用PCI USB扩展卡连接第二个USB视频捕获设备。当我尝试连接加载驱动程序cx231xx的AVerMedia DVD EZMaker 7时,这种解决方法对我来说非常有效

将格式切换到MJPEG,数据就足够小了,则可以从多个摄像头读取数据。可使用libjpeg来解码MJPEG流

参考 
http://renoirsrants.blogspot.com/2011/07/multiple-webcams-on-zoneminder.html


通过 xawtv -v 1 -c /dev/video0 打开一个摄像头. 打开另外一个的时候可能会出现信息如下
libv4l2: error turning on stream: No space left on device
VIDIOC_STREAMON - Unable to start capture: No space left on device fps is set to 1/30
这说明 uvcvideo 模块需要设置正确的带宽. 

很有魅力的一句话
sudo rmmod uvcvideo
sudo modprobe uvcvideo quirks=128
这将在每次机器重启时重置。开机重启自动生效, 则需要创建以下文件: 
sudo vi /etc/modprobe.d/uvcvideo.conf 包含这一行: 
options uvcvideo quirks=128

quirks = 128修复适用于320x240无压缩视频。但对于压缩(mjpg)格式,quirks = 128不起作用(它对压缩格式没有任何作用)
要解决此问题, 需要修改uvc驱动程序.


下载内核源代码
mkdir -p ~/Software/kernel-git
cd ~/Software/kernel-git
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
git checkout v3.2
# NOTE: `uname -r`  shows me my current kernel is 3.2.0-60-generic
# For a different kernel use a different tag


复制uvc目录:
mkdir -p ~/Software/uvcvideo_driver
cd ~/Software/uvcvideo_driver
#cp -a ~/Software/kernel-git/linux/drivers/media/usb/uvc .
cp ~/Software/kernel-git/linux/drivers/media/video/uvc .

修改Makefile
cd ~/Software/uvcvideo_driver/uvc
vi Makefile
obj-m += aauvcvideo.o
        aauvcvideo-objs  := uvc_driver.o uvc_queue.o uvc_v4l2.o uvc_video.o uvc_ctrl.o \
              uvc_status.o uvc_isight.o
        all:
          make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
          make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean


设置压缩时强制带宽为0x400。
cd ~/Software/uvcvideo_driver/uvc
vi uvc_video.c
找到 uvc_fixup_video_ctrl() .  函数最后添加:
      if (format->flags & UVC_FMT_FLAG_COMPRESSED) {
        ctrl->dwMaxPayloadTransferSize = 0x400;
      }

构建aauvcvideo模块:
make
删除旧模块并插入新模块:
sudo rmmod uvcvideo
sudo insmod ./aauvcvideo.ko quirks=128
在2个不同的窗口中进行gucview两次压缩测试
guvcview --device=/dev/video1 --format=mjpg 
guvcview --device=/dev/video2 --format=mjpg 

有关带宽和USB的说明。 USB 2.0(几乎所有网络摄像头都使用)的带宽为480 Mbit / s。 
340x480(30 fps)和24位/像素未压缩大约为221 Mbit / s,因此可以通过未压缩的网络摄像头快速消耗USB 2.0带宽。
而每个USB主控制器只有480 Mbit / s,(USB集线器不添加主机控制器,并且主板上的多个USB端口通常连接到同一主机控制器。连接到主机控制器的所有设备和集线器共享带宽。)
如果要适用多个USB摄像头, FIX_BANDWIDTH quirk可能有用, 但只适用于未压缩的格式, 而不适合mpeg格式.
==========================================================
==========================================================
==========================================================
实际还是因为usb带宽的问题, 所以最根本的方法就是 使用 pcie转USB的卡, 一步解决usb带宽问题.
https://m.jb51.cc/ubuntu/347553.html 

上一篇:如何部署无缝切换的网络
下一篇:有效需求分析