前期内容提要:


在完成网络摄像头的前期准备之后,从这一章开始将正式进入工程。关于监控画面的传输,网络上相关文章已经很多了,但实践起来往往仅在局域网环境下拥有较好的用户体验,针对需要内网穿透的mjpg-stream配置方法尚未有系统化归纳。

因此这篇文章在实现监控画面传输的同时,也会带大家排排那些mjpg-stream存在的坑。


一、开启摄像头服务

在将摄像头连接树莓派后前往raspi-config开启服务:

  1. sudo raspi-config

【树莓派-网络监控(2)画面传输】基于mjpg-stream实现监控画面的传输_网络_Deng's Blog-CSDN博客 - 图1

  1. sudo reboot

二、安装MJPG-streamer及相应依赖
  1. sudo apt-get update
  2. sudo apt-get upgrade
  3. sudo apt-get install subversion libjpeg8-dev imagemagick libv4l-dev cmake git
  4. git clone https://github.com/jacksonliam/mjpg-streamer.git
  5. cd mjpg-streamer/mjpg-streamer-experimental/

三、修正MJPG-streamer配置(无外网访问需求的可跳过此步骤)
  1. cd mjpg-streamer/mjpg-streamer-experimental/plugins/input_uvc
  2. sudo chmod 7777 input_uvc.c
  3. vim input_uvc.c

如下图开启帧率自适应[-softfps],将屏幕分辨率调至352*288。经测试(50M宽带环境),这在后续穿透视频画面后能有较好的体验。

【树莓派-网络监控(2)画面传输】基于mjpg-stream实现监控画面的传输_网络_Deng's Blog-CSDN博客 - 图2

四、编译(每次修改配置文件后都需要重新操作此步骤)
  1. cd mjpg-streamer/mjpg-streamer-experimental/
  2. make all
  3. sudo make install

【树莓派-网络监控(2)画面传输】基于mjpg-stream实现监控画面的传输_网络_Deng's Blog-CSDN博客 - 图3

五、开启摄像头测试
  1. cd mjpg-streamer/mjpg-streamer-experimental/

普通的免驱动USB摄像头,执行命令(本文准备的是USB摄像头):

  1. ./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so -w ./www"

如果是使用的Picamera摄像头,则使用命令:

  1. ./mjpg_streamer -i "./input_raspicam.so" -o "./output_http.so -w ./www"

【树莓派-网络监控(2)画面传输】基于mjpg-stream实现监控画面的传输_网络_Deng's Blog-CSDN博客 - 图4

参数

说明

./Mjpg_streamer

执行主程序

-i

输入(input)

input_uvc.so

UVC输入组件

-o

输出(output)

output_http.so

网页输出组件

-w ./www

网页输出(默认端口8080)

六、查看监控画面的传输效果

在局域网内获取动态图像:

  • http:// 树莓派IP:8080/?action=stream(推荐)
  • http:// 树莓派IP:8080/javascript_simple.html

在局域网内获取静态图像:

  • http:// 树莓派IP:8080/?action=snapshot
    【树莓派-网络监控(2)画面传输】基于mjpg-stream实现监控画面的传输_网络_Deng's Blog-CSDN博客 - 图5

七、实现开机后台自启

在确认传输画面清晰无误后,我们将监控画面的传输服务设置为开机自启,以便后续其他操作。

  1. sudo vim /etc/systemd/system/camera.service
  2. [Unit]
  3. Description=camera daemon
  4. After=syslog.target network.target
  5. Wants=network.target
  6. [Service]
  7. Type=simple
  8. ExecStart=/home/pi/mjpg-streamer/mjpg-streamer-experimental/mjpg_streamer -i "/home/pi/mjpg-streamer/mjpg-streamer-experimental/input_uvc.so" -o "/home/pi/mjpg-streamer/mjpg-streamer-experimental/output_http.so -w /home/pi/mjpg-streamer/mjpg-streamer-experimental/www"
  9. Restart= always
  10. RestartSec=1min
  11. [Install]
  12. WantedBy=multi-user.target
  13. #启动监控画面的传输
  14. systemctl daemon-reload
  15. systemctl start camera
  16. #查看是否成功开启
  17. systemctl status camera.service
  18. #设置为开机启动
  19. systemctl enable camera

【树莓派-网络监控(2)画面传输】基于mjpg-stream实现监控画面的传输_网络_Deng's Blog-CSDN博客 - 图6


八、最后聊聊mjpg-stream存在的一些坑

经测试,关于视频分辨率、帧率自适应等一系列参数变更的方式,现无法直接通过启动命令定义。

  1. ./mjpg_streamer -i "./input_uvc.so r 352x288 softfps 3" -o "./output_http.so -w ./www"

【树莓派-网络监控(2)画面传输】基于mjpg-stream实现监控画面的传输_网络_Deng's Blog-CSDN博客 - 图7
可以看到返回的视频分辨率并未改变,因此如果还有其他参数需要修改,建议统一按照上文的修改方式(编辑mjpg-streamer/mjpg-streamer-experimental/plugins/input_uvc/input_uvc.c文件)进行修改。

此外,对于不熟悉vi编辑器的用户可以选择本地编辑完成后通过WinSCP上传至树莓派指定目录:

我也会在这篇博客上上传一份已经配置完成的input_uvc.c文件,以供大家直接使用。

但是树莓派初次登陆WinSCP会因为没有权限致使访问被拒绝。

  • 解决方法:
    sudo passwd root
    sudo passwd —unlock root #启用root

如果报错:passwd: password expiry information changed.则是ssh默认关闭了root登陆。

  1. vi /etc/ssh/sshd_config
  2. PermitRootLogin yes #值更改为yes

【树莓派-网络监控(2)画面传输】基于mjpg-stream实现监控画面的传输_网络_Deng's Blog-CSDN博客 - 图8

  1. #重启ssh服务
  2. sudo systemctl restart ssh
  3. #为root用户应用于当前用户相同的bash配置
  4. sudo cp ~/.bashrc /root/.bashrc

在完成上述工作之后,我们已经基于mjpg-stream实现了监控画面的传输,这一需求实现起来很简单,故不再多述了,如果您有任何疑问或者好的建议,欢迎留言评论!


后期内容提要: