树莓派:搭建简易宿舍监控

前言

购买了树莓派作为Linux入门后,它就一直被闲置了,这几天碰巧搞到一块硬盘,就用它来做一个监控玩玩吧。

技术点:

  • ffmpeg 利用树莓派的硬H.264编码器转码后推流
  • Nginx的rtmp版本
  • crontab 定时任务

成果展示:

录像文件,可自动删除
以直播,或在线观看

安装与调试摄像头

这一步在网上有许多参考,详细可以参考《树莓派开发笔记 – 第1部分 基础篇》第6章 树莓派摄像头操作

可以利用一下命令拍照测试一下有没有安装正确

raspistill -t 2000 -o image.jpg

笔者在这里把摄像头装反了,不管没关系编码的时候翻转一下就好了。

安装FFmpeg与rtmp版的nginx

以下内容引用自用树莓派做 RTMP 流直播服务器,可推送至斗鱼直播

我们用 nginx 加上 nginx-rtmp-module 模块作为 RTMP 服务端。这里先安装 nginx 然后再移除它,目的是利用这个过程吧 nginx 相关的依赖安装好并设定好系统环境。这个通过 apt 安装的 nginx 并不能直接使用,因为他并不包含我们需要的 RTMP 模块,所以将它移除。而后我们手工下载 nginx 和 nginx-rtmp-module 模块源码来手工编译安装,以获得我们最终需要的服务端。


sudo apt-get update
#安装 nginx
sudo apt-get -y install nginx
#移除 nginx
sudo apt-get -y remove nginx
sudo apt-get clean
#清空 nginx 的配置文件
sudo rm -rf /etc/nginx/*
#安装编译用的模块
sudo apt-get install -y curl build-essential libpcre3 libpcre3-dev libpcre++-dev zlib1g-dev libcurl4-openssl-dev libssl-dev
#创建存放网页的目录给 nginx 使用
sudo mkdir -p /var/www
#创建编译用的目录
mkdir -p ~/nginx_src
cd ~/nginx_src
#下载 nginx 源码包
wget http://nginx.org/download/nginx-1.11.8.tar.gz
#下载 nginx-rtmp-module 源码包
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
tar -zxvf nginx-1.11.8.tar.gz
unzip master.zip
cd nginx-1.11.8
#设定编译参数
./configure --prefix=/var/www --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --pid-path=/var/run/nginx.pid --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_ssl_module --without-http_proxy_module --add-module=/home/pi/nginx_src/nginx-rtmp-module-master
#开始编译安装
make
sudo make install

比较漫长的等待之后,编译安装结束。这时可以测试 nginx 是否安装好。

nginx -v

正常的話,會顯示 nginx 的版本。

配置 nginx。

/etc/nginx/nginx.conf

在末尾添加如下配置:

rtmp {
     server {
        listen 1935;
        #chunk_size 4096;
        application live {
          live on;
          record off;
        }
        application hls {
          live on;
          hls on;
          hls_path /tmp/hls;
        }
     }
}

重启 nginx 服务。

sudo service nginx start

没有错误提示就表示成功了。
到这里 nginx 和 RTMP 模块都准备好了。 

安装FFmpeg

sudo apt-get install ffmpeg

推流到本地,然后保存

我们利用强大的ffmpeg将摄像头的拍摄数据转化为流媒体,然后推流给自己。如果想推流到其它地方的话,复制一份流推留给其它地方也是可以的。记得把这个脚本加入rc.local开机启动并丢掉输出。


ffmpeg -ss 0 -i /dev/video0 -vf vflip -c:v h264_omx -an -r 8 -f flv rtmp://127.0.0.1:1935/live/test
#-ss 开始时间,由于是直播,其实这个参数应该没有用
#-i 是视频源 这里指摄像头
#-vf vflip 翻转过滤器,把装倒了的摄像头的画面正过来
#-c:v 对于第一个视频流 h264_omx 这是树莓派的硬件编码器
#-an 静音,反正本来就没有声音
#-r 控制帧率,减小文件大小与处理压力
#-f 强制包装格式,这里包装成flv,不知道为啥我的流媒体播放器只认这个格式
#最后是推流地址,这里推流給本机的Nginx

这一步过后,你可以用流媒体播放器(例如potplayer等等)访问一下树莓派的rtmp://127.0.0.1:1935/live/test,看看有没有视频流,假如一切都没有问题的话,就可以开始存储获取的视频流了。

cur_date="`date +%Y-%m-%d_%H:%M:%S`"
#获取一个时间作为文件名
sudo ffmpeg -i rtmp://127.0.0.1:1935/live/test -t 01:00:30  -c copy /media/pi/Repository/$cur_date.mp4 -timestamp now
#利用ffmpeg保存一小时的流

接下来就是添加定时任务,让这个Shell脚本没小时运行一次,关于crontab的细节可以看 这个

crontab -e

进入定时任务编辑模式,加入(记得写你自己的脚本路径) :

0 */1 *  *   *     /home/pi/SaveSteam.sh

按照我的视频质量,一周大概会拍摄1GB左右的视频,这明显有点儿大,所以我每天清理一次一周前拍摄的视频,下面简单的shell脚本相信大家都看得懂:


lastWeek=`date -d last-week +%Y-%m-%d`
 
for e in `sudo ls /media/pi/Repository/$lastWeek*.mp4`
do
         sudo rm -f "$e"
#        echo $e
done

然后编辑定时任务加入:


0    5    *    *    *     /home/pi/DeleteOldFlv.sh
#每天凌晨五点运行

结尾

一个简易的监控系统,这样就差不多搭建好了。

顺便提一下,利用nginx的自动列出功能可以把某一目录下的文件全部列出来,而现代大部分浏览器都自带播放器,这样就可以不用播放器来查看已经录制好的视频了。

感谢看到这里的你,希望对你有所帮助~ 

上一篇
下一篇