需求?当然不是为了艳照!你们这些猥琐的人类!
毕竟家里总会有没人的时候,出门走到半路忘记煤气灶是不是关了,还得回去看看。在这个科技以人为本的时代,当然应该是拿出智能手机联网看看啦。还有万一有人闯空门什么的,也能有个及时报警什么的。
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
命令行上会有一些提示信息,但是不太全,不过没关系,还有日志嘛:
tail -f /var/log/syslog
如果有错误,请根据错误信息检查修改配置文件,直到服务正常启动。
现在就可以用浏览器打开: http://localhost:8080 查看实时视频,如果是一块灰图,说明摄像头配置不对,请查看日志。
事件触发的配置也在配置文件里,常用的有:
on_event_start - 运动事件开始
on_event_end - 运动事件结束
on_picture_save - 图片保存后(可选参数 %f 为相应的图片文件名)
on_movie_end - 视频保存后(可选参数 %f 为相应的视频文件名)
这几个选项的参数都是可执行文件名,可以自己写一些脚本触发执行,比如发个邮件以便及时收到通知(或利用手机运营商提供的邮箱转成短信提醒),或上传到云端(防止丢失证据)。
至此大功告成。
补充说明:
目前我只在Linux下测试成功,FreeBSD下有困难,原因在于摄像头驱动不好搞。虽然我一向喜欢FreeBSD多些,但是碰到硬件驱动问题还真是没办法。
FreeBSD版的motion本身应该是没有多大问题,问题在于它使用一个叫PWCBSD的东西来做摄像头兼容处理,因为大部分摄像头都可以被V4L(Video for Linux)所驱动,这个PWCBSD则是实现了部分摄像头的V4L驱动在BSD上的兼容,问题在于它实现的型号太少,反正我手头上的几个都不行,所以完全没法用。
更坑的是PWCView倒是支持的摄像头比较多一些——注意,是ports里另外一个单独的PWCView,不是PWCBSD自带的那个PWCView。
所以我目前的办法是用一个python程序去调用PWCView来实现部分motion功能,因为功能很简陋,就不献丑了。
推荐还是用Linux吧,省事很多。