rtsp流转码为rtmp/http-flv流的视频监控/直播系统中,视频流路数越来越多时,服务器端对CPU、内存、网络带宽的压力越来越大的解决方法

一、问题描述:

    为了实现在浏览器中播放摄像机的视频流,所以使用了ffmpeg对摄像机的rtsp流转码再推流到流媒体服务器(nginx + rtmp + nginx-http-flv-module)的方案。但这套方案存在一个问题:随着接入的摄像机越来越多,需要启动的推流路数也会越来越多,服务器端对CPU、内存、网络带宽的压力也会越来越大。

 

二、解决方法:

    无人观看的摄像机不取流(判断是否有浏览器在拉流播放,如果没有,则停止相应的推流)。目前主流的流媒体服务器(nginx,srs,ZLMediaKit等)都支持检测拉流端是否拉流,并提供相关的接口。

 

三、nginx检测拉流端是否在拉流

    以nginx为例,其提供了事件回调接口。可以用on_play和on_play_done来监听客户端播放与播放结束事件。具体可以参考nginx的官方英文文档:https://github.com/arut/nginx-rtmp-module/wiki/Directives#on_play

下面给大家列出中文翻译:

 

语法:on_play url。上下文:rtmp, server,application。

描述:

设置 HTTP 播放回调。每次一个客户分发播放命令时,一个 HTTP 请求异步发送,命令处理会挂起 - 直到它返回结果码。之后再解析 HTTP 结果码。

HTTP 2XX 返回码的话继续 RTMP 会话。

HTTP 3XX 返回码的话 重定向 RTMP 到另一个流,这个流的名字在 HTTP 返回头的 Location 获取。如果新流的名字起始于 rtmp:// 然后远程 relay 会被创建。relay 要求 IP 地址是指定的而不是域名,并且只工作在 1.3.10 版本以上的 nginx。另请参考 notify_relay_redirect。

其他返回码的话 RTMP 连接丢弃。

 

语法:on_play_done url。上下文: rtmp, server, application。和on_done一样的行为,但只作用于play和event。然而HTTP状态代码不检查此回调。

 

nginx的配置如下。下面的配置表示,当一个客户端播放/拉流时,nginx会向ip为192.168.4.112的服务器发送http post请求;当一个客户端停止播放/停止拉流时,nginx也会向ip为192.168.4.112的服务器发送post请求。

rtmp {
    server {
        listen 1935;
        chunk_size 4000;
        application live {
				live on;
				on_play http://192.168.4.112:8777/on_play;
				on_play_done http://192.168.4.112:8777/on_play_done;     
        }
    }
}

 

四、wireshark抓包分析

按照上述nginx的配置,当客户端向rtmp://192.168.4.105:1935/live/test3拉流时(192.168.4.105为nginx所在电脑的ip),nginx会向ip为192.168.4.112的服务器发送http post请求。使用wireshark抓取到的数据如下:

 

当客户端向rtmp://192.168.4.105:1935/live/test3停止拉流时(192.168.4.105为nginx所在电脑的ip),nginx会向ip为192.168.4.112的服务器发送http post请求。使用wireshark抓取到的数据如下:

 

当客户端向http://192.168.4.105:8050/flv_live?port=1935&app=live&stream=test3拉流时(192.168.4.105为nginx所在电脑的ip),nginx会向ip为192.168.4.112的服务器发送http post请求。使用wireshark抓取到的数据如下:

 

当客户端向http://192.168.4.105:8050/flv_live?port=1935&app=live&stream=test3停止拉流时(192.168.4.105为nginx所在电脑的ip),nginx会向ip为192.168.4.112的服务器发送http post请求。使用wireshark抓取到的数据如下:

 

 

五、遇到问题

1.设置on_play监听客户端播放事件后,启动推流后,拉流无法播放。导致该问题的原因为:得要有HTTP 2XX 返回码的话才能继续rtmp/http-flv会话。也就是说,当拉流时,nginx会发送一个http post请求,然后得返回http 2XX才能拉流。所以你自己写的服务器在接收nginx请求后必须返回http 2XXX,比如返回“HTTP/1.1 200 OK”给nginx,如下图所示:

 

 

 

 

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值