ITPub博客

首页 > 应用开发 > > ubuntu 上摄像头的设置

ubuntu 上摄像头的设置

作者:pengjs991111 时间:2019-08-16 08:48:56 0 删除 编辑

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格式.

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/623/viewspace-3130582/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-04-12

  • 博文量
    221
  • 访问量
    778