在树莓派上使用动作来解决网络摄像头流问题

Posted

技术标签:

【中文标题】在树莓派上使用动作来解决网络摄像头流问题【英文标题】:using motion on raspberry pi for webcam streaming issue 【发布时间】:2012-12-20 07:55:39 【问题描述】:

我有一个 USB 网络摄像头(未知品牌,没有标记),在我的 Raspberry Pi 上检测到正常。

这是 lsusb 的输出

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. 
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
Bus 001 Device 004: ID 0c45:608f Microdia PC Camera (SN9C103 + OV7630)
Bus 001 Device 005: ID 1267:0103 Logic3 / SpectraVideo plc G-720 Keyboard

但是,当我运行运动时,使用带有唯一默认配置的 /dev/video0 会更改分辨率并将网络摄像头主机设置为关闭,以便我可以在网络上流式传输它。 这是我运行运动时的日志

Log of motion -n 

[0] Processing thread 0 - config file /etc/motion/motion.conf
[0] Motion 3.2.12 Started
[0] ffmpeg LIBAVCODEC_BUILD 3482368 LIBAVFORMAT_BUILD 3478784
[0] Thread 1 is from /etc/motion/motion.conf
[0] motion-httpd/3.2.12 running, accepting connections
[0] motion-httpd: waiting for data on port TCP 8080
[1] Thread 1 started
[1] cap.driver: "sonixb"
[1] cap.card: "USB camera"
[1] cap.bus_info: "usb-bcm2708_usb-1.2"
[1] cap.capabilities=0x05000001
[1] - VIDEO_CAPTURE
[1] - READWRITE
[1] - STREAMING
[1] Config palette index 8 (YU12) doesn't work.
[1] Supported palettes:
[1] 0: S910 (S910)
[1] 1: BA81 (BA81)
[1] Selected palette BA81
[1] Test palette BA81 (480x640)
[1] Adjusting resolution from 480x640 to 160x120.
[1] Using palette BA81 (160x120) bytesperlines 160 sizeimage 19200 colorspace 00000008
[1] found control 0x00980900, "Brightness", range 0,255 
[1]     "Brightness", default 127, current 127
[1] found control 0x00980911, "Exposure", range 0,1023 
[1]     "Exposure", default 66, current 66
[1] found control 0x00980912, "Automatic Gain (and Exposure)", range 0,1 
[1]     "Automatic Gain (and Exposure)", default 1, current 1
[1] found control 0x00980913, "Gain", range 0,255 
[1]     "Gain", default 127, current 127
[1] mmap information:
[1] frames=4
[1] 0 length=20480
[1] 1 length=20480
[1] 2 length=20480
[1] 3 length=20480
[1] Using V4L2
[1] Resizing pre_capture buffer to 1 items
[1] v4l2_next: VIDIOC_DQBUF: EIO (s->pframe 0): Input/output error
[1] v4l2_next: VIDIOC_QBUF: Invalid argument
[1] v4l2_next: VIDIOC_QBUF: Invalid argument
[1] v4l2_next: VIDIOC_QBUF: Invalid argument
[1] v4l2_next: VIDIOC_QBUF: Invalid argument
[1] Error capturing first image
[1] Started stream webcam server in port 8081
[1] v4l2_next: VIDIOC_QBUF: Invalid argument
[1] Video device fatal error - Closing video device
[1] Closing video device /dev/video0
[1] Retrying until successful connection with camera
[1] cap.driver: "sonixb"
[1] cap.card: "USB camera"
[1] cap.bus_info: "usb-bcm2708_usb-1.2"
[1] cap.capabilities=0x05000001
[1] - VIDEO_CAPTURE
[1] - READWRITE
[1] - STREAMING
[1] Config palette index 8 (YU12) doesn't work.
[1] Supported palettes:
[1] 0: S910 (S910)
[1] 1: BA81 (BA81)
[1] Selected palette BA81
[1] Test palette BA81 (480x640)
[1] Adjusting resolution from 480x640 to 160x120.
[1] Using palette BA81 (160x120) bytesperlines 160 sizeimage 19200 colorspace 00000008
[1] found control 0x00980900, "Brightness", range 0,255 
[1]     "Brightness", default 127, current 127
[1] found control 0x00980911, "Exposure", range 0,1023 
[1]     "Exposure", default 66, current 66
[1] found control 0x00980912, "Automatic Gain (and Exposure)", range 0,1 
[1]     "Automatic Gain (and Exposure)", default 1, current 1
[1] found control 0x00980913, "Gain", range 0,255 
[1]     "Gain", default 127, current 127
[1] mmap information:
[1] frames=4
[1] 0 length=20480
[1] 1 length=20480
[1] 2 length=20480
[1] 3 length=20480
[1] Using V4L2
[1] Camera has finally become available
[1] Camera image has different width and height from what is in the config file. You should fix that
[1] Restarting Motion thread to reinitialize all image buffers to new picture dimensions
[1] Thread exiting
[1] Calling vid_close() from motion_cleanup
[1] Closing video device /dev/video0
[0] Motion thread 1 restart
[1] Thread 1 started
[1] config image height (120) is not modulo 16
[1] Could not fetch initial image from camera
[1] Motion continues using width and height from config file(s)
[1] Resizing pre_capture buffer to 1 items
[1] Started stream webcam server in port 8081
[1] Retrying until successful connection with camera
[1] config image height (120) is not modulo 16
[0] httpd - Finishing
[0] httpd Closing
[0] httpd thread exit
[1] Thread exiting
[0] Motion terminating

相机上的灯一开始就亮,然后又熄灭,有人知道我遇到的任何错误吗?

谢谢!

【问题讨论】:

我的网络摄像头是兼容l4v2的,我也试过fswebcam等其他视频输入方式。仍然无济于事。我没有尝试过的一件事是使用有源 USB 集线器,目前我只是在 700mA 的板上直接使用它,它可能不足以运行我的网络摄像头。 通过在我的 USB 键盘和 HDMI 电缆断开连接的情况下多次重试,我能够在因输入输出错误而失败之前拍摄一些照片。所有图片看起来都是这样 - s7.postimage.org/mjb0z2wwn/01_20130115174957_01.jpg 因此我会假设我需要更多的电源,我会购买一个有源 USB 集线器并试一试 【参考方案1】:

我建议您尝试使用 guvcview 而不是 motion。它运行得更快,并且在我的 Pi 上提供了更好的图像。它在 X 下运行。

guvcview 的两个音符 - 将 POWER LINE FREQUENCY 设置为您当地的电源频率。 - 将分辨率设置为 640 x 480。

guvcview 需要大约 50% 的处理器功率。是的,也可以使用 USB 集线器!

嗯。

【讨论】:

我试过了,但没用。将等待我的 USB 集线器到达并使用动作重试【参考方案2】:

我认为您需要将 conf 文件中图像的高度和宽度设置为您的相机规格。在我设置高度 640 宽度 480 之前,我的没有工作。流很棒!只需要弄清楚webstream身份验证的补丁。目前我有这个需要登录的网络服务器的流媒体,但是如果有人输入我的 IP 加上我正在流式传输的端口,这可以绕过。

【讨论】:

我确实玩过分辨率,我认为在我发布的示例中,我以错误的方式设置了高度和宽度 - 将分辨率从 480x640 调整为 160x120。所以我会试试的。 对不起...宽680高480 是的,这就是我的意思,在我的示例中,它将 480x640 调整为 160x120,所以我应该将其设置为 680x480【参考方案3】:

即使在 conf 文件中配置不同,运动也会使用它在运行时检测到的可能分辨率(至少根据我的经验)。

此外,似乎在 conf 文件中设置了一个不受支持的调色板,并且动作选择了它检测为受支持的两个调色板之一。您是否尝试在 conf 文件中将调色板设置更改为“0”(S910)?

最后,Pi 的 USB 支持存在一些关于大数据块的已知问题和目前尚未解决的问题。降低帧速率在其他情况下也可能有所帮助(在这种情况下,我认为我无济于事,因为该过程已经因第一张图像而失败)。

【讨论】:

【参考方案4】:

试试v2l4-ctl --list-format-ext,看看您的相机支持哪些像素格式和图像大小的组合。 S910 是一款便宜的旧相机,您可能需要升级。

【讨论】:

【参考方案5】:

您的问题在日志中:

config image height (120) is not modulo 16

所以你需要不同的图像分辨率。

看看你的设备支持什么

$ uvcdynctrl -f

选择一个 y 分辨率是 16 倍数的。 例如。 640x480(如果为您的相机列出的那个)。

【讨论】:

以上是关于在树莓派上使用动作来解决网络摄像头流问题的主要内容,如果未能解决你的问题,请参考以下文章

在Windows IoT上使用网络摄像头

树莓派 RaspBerryPi 网络配置相关与改造usb网络摄像头

树莓派摄像头检测人物动作

使用管道字符 |与 child_process spawn

将视频从 Raspberry Pi 流式传输到 Android 应用程序

将RTSP流转换为虚拟网络摄像头