前言
购买了树莓派作为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的自动列出功能可以把某一目录下的文件全部列出来,而现代大部分浏览器都自带播放器,这样就可以不用播放器来查看已经录制好的视频了。
感谢看到这里的你,希望对你有所帮助~