- Published on
监控辅助工具的实现过程(二)
- Authors
- Name
- 万码皆空
使用之前的方法,我每天早上手动获取session后打开监控并录制,等到中午对方服务重启后再来一次。如果遇到意外断开连接,还需要再来一次。时间一长,很烦。必须再想想办法。
要解决以上问题,需要处理以下两个问题:
- 保证连接的稳定性
- 自动重连
保持连接稳定性
想保持连接稳定性,给联通打电话肯定是没用的,路由器、wifi信号都有可能出现问题,完全不可控。我考虑通过服务器中转来实现。这个方案的好处如下:
- 服务器网络稳定。
- 如果家庭网络出现问题,直接重连就可以,不需要重新获取session。
通过查资料,发现了nginx-rtmp-module,这个模块可以用来搭建一个简单的 RTMP 流媒体服务器。搭建好RTMP 服务后,在服务器上使用ffmpeg拉取监控视频并推送到RTMP服务上,这样就实现了监控的中转。看监控的话,直接连接中转服务器就可以了,不再需要取session。当然,转发服务器转发还是需要取session的。
然后我就开始下载nginx源码、rtmp-module源码,编译,安装、配置。
nginx配置如下:
# rtmp服务配置
rtmp {
server {
listen 8888;
chunk_size 4000;
application live1 {
live on;
record off;
exec_static ffmpeg -i rtmp://xxxx.xxx/camera_id001?session=xxxxxxxxxxxx -c copy -f flv rtmp://localhost:8888/live1;
}
application live2 {
live on;
record off;
exec_static ffmpeg -i rtmp://xxxx.xxx/camera_id002?session=xxxxxxxxxxxx -c copy -f flv rtmp://localhost:8888/live2;
}
application live3 {
live on;
record off;
exec_static ffmpeg -i rtmp://xxxx.xxx/camera_id003?session=xxxxxxxxxxxx -c copy -f flv rtmp://localhost:8888/live3;
}
}
}
以上实现了对三个摄像头的转发,每天早上和中午对方重启后,我只需要手动获取session后重新替换下配置文件中的session并重启下nginx就好了。我只设置中转了教室里的三个摄像头,是因为担心连接太多对方服务器会有异常报警。既然不能确定对方是否有这个机制,还是谨慎一些好。
这样,我在家里就可以随意连接不再需要配置session了:
# ffplay播放
ffplay rtmp://my.domain.com:8888/live1 -analyzeduration 500
# ffmpeg存储
ffmpeg -rw_timeout 10000000 -probesize 102400 -i rtmp://my.domain.com:8888/live1 -c copy path/to/save.mp4
自动重连
有的中转服务器,本地自动重连中转服务器就简单了,示例代码如下:
while [ true ]; do
sleep 10
ffmpeg -rw_timeout 10000000 -probesize 102400 -i rtmp://my.domain.com:8888/live1 -c copy path/to/save.mp4
done
后续思考
目前这样,本以为能减轻一部分工作,可实际上并没有。因为意外断开连接的情况并不多,我依然需要每天两次手动获取session、更改nginx配置、重启服务。多了一个服务器,好像更麻烦一些了?
先这样凑合着吧。