硬件准备:
树莓派3B+,500万CSI模块摄像头
系统环境:
pi@raspberrypi:~ $ cat /etc/issue
Raspbian GNU/Linux 9 \n \l
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.14.50-v7+ #1122 SMP Tue Jun 19 12:26:26 BST 2018 armv7l GNU/Linux
首先在树莓派上有两种实现方案(我所知道的)。一种是用mjpg-streamer,一种是motion。motion是Linux下一款开源的摄像头监控软件,用命令行运行,只保存有运动物体的图像。当前教程使用的是motion,比较简单的一种。那么这款软件的优点就是安装配置简单,缺点就是拍摄有延迟,画面不清楚,不过后面第7步我会教大家怎么去优化。
1、安装
sudo apt install motion -y
2、配置
备份配置文件
sudo cp /etc/motion/motion.conf /etc/motion/motion.conf.bak
编辑配置文档
sudo vim /etc/motion/motion.conf
更改文档中以下内容
daemon on #改为on,后台运行
videodevice /dev/video0 #这个表示motion软件会使用这个设备,如果你的树莓派上没有这个文件,参考我之前的文章进行设置
width 640 #图像的宽
height 480 #图像的高
framerate 2 #帧率,相当于fps,自动监控拍照,帧率没必要太高,否则输出的文件很多
threshold 3000 #多少个像素发生改变的时候,保存当前照片
output_pictures on #开启自动保存运动图片
ffmpeg_output_movies on #开启自动保存运动视频
ffmpeg_variable_bitrate 0 # 0, 2 - 31 动态比特率
target_dir /home/pi/motion-images #图片保存的路径
stream_port 8081 #串流端口
stream_quality 50 #网络摄像头传输质量
stream_maxrate 1 #摄像头帧速率,数字越大延迟越小
stream_localhost off #只通过本地串流关闭
stream_auth_method2 #开启密码认证
stream_authentication #用户名:密码 #网页查看摄像头的用户名和密码4
webcontrol_port 8080 #通过网页控制的端口
webcontrol_localhost on #只能通过本地进行网页控制打开
创建一个目录来存放motion拍下的运动图像
mkdir ~/motion-images
官方详细配置说明:http://lavrsen.dk/foswiki/bin/view/Motion/ConfigFileOptions
3、运行
sudo motion
用浏览器登陆树莓派的网址192.168.1.105:8081,会弹出用户名和密码的对话框,输入用户名和密码后看到图像就成功了。
4.、停止
sudo pkill motion sudo systemctl stop motion.service sudo service motion stop
不过有时候这两个命都不能停止motion的运行,那只好用脚本解决了
sudo nano motionstop.sh
#!/bin/bash sudo ps -aux | grep motion | awk '{print $2}' | head -1 | xargs sudo kill -9
chmod +x motionstop.sh
接下先sudo motion
摄像头红灯亮
./motionstop.sh
摄像头红灯灭,motion进程被杀死
或者另外一种:
运行这条命令停止
sudo ps -C motion --noheader | awk '{print $1}' | xargs sudo kill -9
也可以写进脚本里面运行,方法和第一个是一样的。
5、设置为开机启动
sudo systemct enable motion.service
或者
sudo vim /etc/rc.local
在exit 0前添加 motion , 保存,就会开机自动运行了。
6、防火墙开放端口
由于我在树莓派装了redhat的防火墙,故此处必须在防火墙开放端口,否则只能在树莓派本地通过网页访问
sudo firewall-cmd --permanent --add-port=8081/tcp sudo firewall-cmd --reload
现在可以再电脑上浏览器地址栏输入树莓派IP:8081查看效果了
实测支持UC,谷歌浏览器,IE打开地址会转到搜索,QQ浏览器会变成下载文件。
前面介绍中说了motion会保存运动物体的图片,进入目录一看,这不一会就保存了好几十张图片
7、优化
1、延迟和流畅度
主要优化的是延迟问题,如果只改默认配置那延迟相当严重,经过修改配置优化过后延迟和画质会有一个质的提升,但是占用带宽会达到10M-60M左右,也就是你在浏览器看监控的时候,电脑管家会显示每秒有1M-6M以上的下载。没有优化的话延迟在3-5秒,但是带宽只会占用1M左右,建议弄两份配置切换着使用,
sudo cp /etc/motion/motion.conf /etc/motion/motion.conf.youuhua
切换配置记得先停止再启动,不然切换另一份配置文件之后是不会生效的。当然也可能你觉得优化过后还是不满意,那么请看我另一篇文章,安装mjpg-streamer来监控,不过默认情况下它占用带宽更高,达到了20M-50M左右,每秒有2-4.5M以上的下载量,而且画面不能像motion一样调整大小,打开网页界面重视固定大小,而motion你调整了宽度和高度之后网页的监控面积也会增大和缩小,所以说相比之下各有胜负!
那么改哪几个地方了?
sudo vim /etc/motion/motion.conf
framerate 30 #帧率 这个和下面的stream_maxrate是对应的,这里是摄像头原始帧率,也就是fps,下面那个是网络传输帧率,超过30就浪费带宽了,但是效果提升却看不上出来。 ffmpeg_variable_bitrate 2 #改为2,默认0 stream_maxrate 30 #默认1,改为30 #摄像头帧速率,数字越大延迟越小,和frame rate参数应该一致。 stream_quality 100 #默认50,改为100 网络摄像头传输质量
这三个地方改完之后
sh motionstop.sh
停止motion
sudo motion
再次启动motion
你会发现画质和延迟都有极大的改观。
2、关闭自动拍照和录像
另一个优化就是,默认情况motion都会对镜头中移动的物体进行拍照和录制视频,这样很占内存卡空间和影响使用寿命,只需要
sudo nano /etc/motion/motion.conf
output_pictures off #关闭自动保存运动图片 ffmpeg_output_movies off #关闭自动保存运动视频
8、照片上传到网盘:
将https://github.com/houtianze/bypy里的bypy.py bypygui.pyw setup.py上传到baidu目录里,并chmod 755 bypy.py权限
需要先认证:
pi@raspberrypi:~/code/baidu $ sudo python bypy.py syncup
Please visit:
https://openapi.baidu.com/oauth/2.0/authorize?scope=basic+netdisk&redirect_uri=oob&response_type=code&client_id=q8WE4xxxxxxxxxxxxxxxx
And authorize this app
Paste the Authorization Code here within 10 minutes.
Press [Enter] when you are done
3ead6bbe8ea730735810af937bxxxxx
Authorizing, please be patient, it may take upto 60.0 seconds...
Authorizing/refreshing with the OpenShift server ...
Successfully authorized 说明认证成功
sudo vim /etc/motion/motion.conf
on_picture_save /home/pi/baidu/upload.sh %f 拍照后执行upload.sh
sudo vim upload.sh
#!/bin/sh sudo python /home/code/baidu/bypy.py syncup /mnt/udisk/motion
sudo chmod 755 upload.sh
用设置上面的方法不好使,只能用下面的办法,每30秒上传图片到百度网盘,然后删除本地图片 :
#!/usr/bin/python import os,sys import time while True: try: os.system("sudo python /home/pi/alex/code/motion_pic2baidu/bypy.py syncup /var/lib/motion") #这里一定要用绝对路径,不然开机启动会找不到文件,默认是root账户目录 os.system("sudo rm -rf /var/lib/motion/*") time.sleep(30) except Exception,e: with open("log.log","a") as f: f.write("error!\n")
保存后可直接运行:
python upload.py &
#下面这句是说一旦有照片被拍下来,则执行upload.sh命令,
#其中%f参数会自动转化为当前图片文件的路径,传给upload.sh:
on_picture_save /home/pi/baidu/upload.sh %f
开机启动:
sudo vi /etc/rc.local
在exit 0前加上:
sudo python /home/pi/alex/code/motion_pic2baidu/upload.py &
9、部分详细配置选项的翻译
本人英语渣,有翻译不对的地方请指出
选项Range/ Values Default 说明
auto_brightness Values: on,off
Default: off让motion 自动调节视频的的亮度,只适用于不带有自动亮度调节的摄像机
brightness Values: 0-255
Default: 0 (disabled) 调整摄像机的亮度
saturation Values: 0 - 255
Default: 0 (disabled) 调整摄像机的颜色饱和度
hue Values: 0 - 255
Default: 0 (disabled) 调整摄像机的色调
contrast Values: 0-255
Default: 0 (disabled) 调整摄像机的对比度
daemon Values: on,off
Default: off 以守护进程在后台运行。这个选项只能放在motion.conf,不能放在 thread config file
emulate_motion Values: on, off
Default: off 即使没有运动物体也要保存图像
ffmpeg_output_movies Values: on, off Default: off 是否保存视频
ffmpeg_bps Values: 0 - 9999999
Default: 400000 视频比特率
ffmpeg_variable_bitrate Values: 0, 2 - 31
Default: 0 (disabled) 动态比特率,如果开启这个功能ffmpeg_bps将被忽略,0为关闭,2为最好质量,31为最差质量
ffmpeg_duplicate_frames Values: on, off
Default: on 为了达到每秒的帧数要求,会复制一下帧填充空白时间,关掉这个功能后每个帧都紧接下一个帧,看起来像快进
ffmpeg_output_debug_movies Values: on, off
Default: off 调试模式,只看到变化的图像
ffmpeg_video_codec Values: mpeg4, msmpeg4, swf, flv, ffv1, mov, ogg, mp4, mkv, hevc
Default: mpeg4 视频格式
framerate Values: 2 - 100
Default: 100 (no limit) 帧速率,每秒多少帧
frequency Values: 0 - 999999
Default: 0 (Not set) 频率协调 Hz,(不清楚作用)
lightswitch Values: 0 - 100
Default: 0 (disabled) 忽略光照强度改变引起的变化
locate_motion_mode Values: on, off, preview
Default: off 给运动物体用方框标出
locate_motion_style Values: box, redbox, cross, redcross
Default: box 标记风格
max_movie_time Values: 0 (infinite) - 2147483647
Default: 3600 最大视频时间
minimum_frame_time Values: 0 - 2147483647
Default: 0 最小帧间隔,设置为0表示采用摄像头的帧率
minimum_motion_frames Values: 1 - 1000s
Default: 1 捕捉持续至少指定时间的运动帧
movie_filename Values: Max 4095 characters
Default: %v-%Y%m%d%H%M%S 视频的文件名
ffmpeg_timelapse Values: 0-2147483647
Default: 0 (disabled) 间隔时间,拍摄延时视频
ffmpeg_timelapse_mode Values: hourly, daily, weekly-sunday, weekly-monday, monthly, manual
Default: daily 延时拍摄模式
timelapse_filename Values: Max 4095 characters
Default: %v-%Y%m%d-timelapse 延时拍摄的文件名
output_pictures Values: on,off,first,best,center
Default: on 是否保存图片和模式设置
output_debug_pictures Values: on,off
Default: off 图片调试模式,只输出运动物体
picture_filename Values: Max 4095 characters
Default: %v-%Y%m%d%H%M%S-%q 图片文件名
picture_type Values: jpeg,ppm
Default: jpeg 图片类型
post_capture Values: 0 - 2147483647
Default: 0 (disabled) 运动在持续多少帧之后才被捕捉
pre_capture Values: 0 - 100s
Default: 0 (disabled ) 输出图像包括捕捉到运动的前几秒
quality Values: 1 - 100
Default: 75 jpg 图像的质量
quiet Values: on, off
Default: off 安静模式,检测到运动不输出哔
rotate Values: 0, 90, 180, 270
Default: 0 (not rotated) 旋转图像角度
stream_auth_method Values: 0,1,2
Default: 0 网页监控身份认证方法:0-无,1-基本,2-MD5
stream_authentication Values: username:password
Default: Not defined 网页监控用户名和密码
stream_limit Values: 0 - 2147483647
Default: 0 (unlimited) 限制帧的数量
stream_localhost Values: on, off
Default: on 是否只能本地访问网络摄像头
stream_maxrate Values: 1 - 100
Default: 1 限制网络摄像头帧速率
stream_port Values: 0 - 65535
Default: 0 (disabled) 网络摄像头端口
stream_quality Values: 1 - 100
Default: 50 网络摄像头传输质量
switchfilter Values: on, off
Default: off 过滤器开关,过滤器用来区分真正的运动和噪声
target_dir Values: Max 4095 characters
Default: Not defined = current working directory 视频和图片的保存路径
videodevice Values: Max 4095 characters
Default: /dev/video0 摄像头设备名
height Values: Device Dependent
Default: 288 图像高度,范围跟摄像机相关
width Values: Device Dependent
Default: 352 图像宽度,范围跟摄像机相关
process_id_file Values: Max 4095 characters
Default: Not defined 保存PID的文件,推荐/var/run/motion.pid
database_busy_timeout Values: 0 .. positive integer
Default: 0 数据库等待超时时间,毫秒
10、解决网页播放不能全屏的缺点:
windows电脑下载VLC播放器,打开网络串流,输入地址http://树莓派IP:8081 即可全屏播放,至此,树莓派监控完美实现。
11、 Motion软件的拓展知识
浏览器会根据服务器发送过来的内容头,即Content-type所示来处理实际内容。例如Content-type: text/html,即按网页来处理。又如Content-type: image/jpeg,则将内容显示为图片(motion在8081端口上发送的就是一系列的jpeg)。如果服务器发送过来的内容头浏览器无法有效识别,则一般情况下浏览器会提示用户将内容保存到本地的文件中,即如上图所示的“下载”。
因此,在这里建议LZ先将浏览器提示要下载的内容保存到本地文件中,再查看该文件的内容,进而判断motion到底传了什么东西过来(如果不是JPEG数据那肯定是服务端发生的问题,否则就是客户端浏览器的问题了。),这样比较容易找到问题所在。
发表评论