万码皆空的博客
Published on

监控辅助工具的实现过程(二)

Authors
  • avatar
    Name
    万码皆空
    Twitter

使用之前的方法,我每天早上手动获取session后打开监控并录制,等到中午对方服务重启后再来一次。如果遇到意外断开连接,还需要再来一次。时间一长,很烦。必须再想想办法。

要解决以上问题,需要处理以下两个问题:

  1. 保证连接的稳定性
  2. 自动重连

保持连接稳定性

想保持连接稳定性,给联通打电话肯定是没用的,路由器、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配置、重启服务。多了一个服务器,好像更麻烦一些了?

先这样凑合着吧。