用motion实现家庭视频监控

需求?当然不是为了艳照!你们这些猥琐的人类!

毕竟家里总会有没人的时候,出门走到半路忘记煤气灶是不是关了,还得回去看看。在这个科技以人为本的时代,当然应该是拿出智能手机联网看看啦。还有万一有人闯空门什么的,也能有个及时报警什么的。

motion是什么?motion是一个提供视频监控解决方案的开源软件,支持Linux/FreeBSD/MacOS等多个平台,本文以Linux为例,测试平台是LinuxMint17。motion的功能主要有以下几个:

支持USB摄像头和webcam(可通过HTTP查看实时视频直播的摄像头)
支持多摄像头
提供web访问实时视频功能(可以把USB摄像头变成webcam)
重点是运动检测,可以在画面中出现活动物体时才开始拍摄并记录,以节约存储空间
可以配置在运动事件发生时拍照(连续拍照,可选保存全部照片或只保存一张,保存一张可选保存第一张,最好的一张,或是运动在画面中央的一张)
可以配置各种事件触发(比如在运动检测发生时或者视频照片保存后发个邮件什么的)
可以配置web远程管理(用处不大,建议关闭)
可以配置使用数据库(支持MySQL和PostgreSQL)
……

当然,其中的web实时视频和web管理默认都只能本机访问,不建议配置为直接允许远程访问,不安全。更安全的做法是:通过一个加密的web代理提供远程访问,或者干脆就只能通过ssh tunnel连到本地访问。为了手机访问方便的话,还是前者吧。

开工。

LinuxMint上安装很简单,apt-get即可,不过它还依赖了ffmpeg,会自动装上。

然后是配置,有好几种配置方式,比如常见的配置到~/.motion下什么的,不过我还是建议直接修改/etc/motion/motion.conf比较好,否则搞出太多配置文件,会搞不清最终生效的是哪个。

配置文件里每个选项都有备注说明,就不一一介绍了。通常需要改的几个参数有:

daemon off - 一般就off好了,需要后台运行可以用 service motion start 来启动

videodevice /dev/video0 - 一般USB摄像头默认就是这个,如果有多个的话就以此类推

v4l2_palette 8 - 一般就用8好了,虽然并不是所有的摄像头都是这个模式(至少我手里两个分别是3和6),但其实motion会自动检测选择合适的。关于这个参数有一点需要说明的是,在motion的早期版本中支持了18种,现在只有9种,其中有一些老式摄像头使用的SGBRG8模式(GBRG)在新版本的motion中已经不再被支持,请更换新的摄像头,不建议使用motion文档评论区有人提供的补丁。目前市场上常见的RGB24或YUY2之类的都没问题

width/height - 建议根据摄像头修改,默认的320x240太低了,现在最低端的摄像头也至少是640x480的,连352x288的都已经没有了

framerate 2 - 默认的2有点低,但是太高的话占用的存储空间也会大,自己考虑决定吧

output_normal on - 检测到运动时拍照,on为保存所有拍的照片(会很多),可选关闭,第一张,最佳,中央

ffmpeg_cap_new on - 检测到运动时录像

ffmpeg_video_codec swf - 支持多种视频文件格式,不过要通过网页看的话,推荐还是swf格式

target_dir - 照片和视频的默认存放路径。注意:motion 默认以motion用户运行,所以这个路径的权限要注意一下

webcam_port 8081 - 实时查看视频的HTTP端口

control_port 8080 - 管理motion的WEB页面端口

以上两个设置为0即可关闭相应功能

配置文件最后的 thread 参数用于指定多个摄像头时其它摄像头使用的配置文件

按自己的需要修改好配置文件以后就可以启动motion了:

sudo service motion start

命令行上会有一些提示信息,但是不太全(FreeBSD下会比较全),不过没关系,还有日志嘛:

tail -f /var/log/syslog

如果有错误,请根据错误信息检查修改配置文件,直到服务正常启动。

现在就可以用浏览器打开: http://localhost:8080 查看实时视频,如果是一块灰图,说明摄像头配置不对,请查看日志。

事件触发的配置也在配置文件里,常用的有:

on_event_start - 运动事件开始
on_event_end - 运动事件结束
on_picture_save - 图片保存后(可选参数 %f 为相应的图片文件名)
on_movie_end - 视频保存后(可选参数 %f 为相应的视频文件名)

这几个选项的参数都是可执行文件名,可以自己写一些脚本触发执行,比如发个邮件以便及时收到通知(或利用手机运营商提供的邮箱转成短信提醒),或上传到云端(防止服务器被端丢失证据)。

至此大功告成。