转载请注明出处:https://blog.csdn.net/impingo
项目地址:https://github.com/im-pingo/pingos
项目官网:https://pingos.io
原始nginx-rtmp-module通过修改配置可以实现在rtmp连接创建过程中触发http回调接口,如on_play和on_publish就是分别在play请求和publish请求时触发的事件。
原生的nginx-rtmp-module中的网络回调事件太少,很难满足生产环境中业务的需求。在PingOS中的nginx-rtmp-module使用了AlexWoo编写的事件通知模块,实现了更多的网络消息类型。
经过本人的进一步扩展,目前PingOS中的事件通知模块已经支持在自定义参数配置中添加变量,可以满足绝大多数线上生产环境的业务需求。
事件回调通知的作用是在媒体服务器可以将实时操作通过http请求的形式反馈给你的业务服务器,以达到更精准的服务器控制的目的。
鉴权、在线统计、开播通知、动态推流、动态回源等等操作都可以通过事件回调接口来实现。
事件 | 可触发点 | 描述 |
---|---|---|
oclp_proc | start | worker进程开启时触发,只有start阶段触发,可用于做进程监控,利用此事件刷新业务中的数据(如收到此消息就可以认为此进程重新启动,表明该进程上的原有客户端连接都已经断开) |
oclp_play | start, update, done | play过程触发,可用于播放鉴权和在线统计 |
oclp_publish | start, update, done | publish过程触发,可用于推流鉴权、开播通知和在线统计 |
oclp_pull | start, update, done | 服务器收到play消息时,如果本机没有流,则触发该消息。该消息可用于动态拉流(动态回源) |
oclp_push | start, update, done | 服务器收到publish消息时,则触发该消息。该消息可用于动态转推 |
oclp_stream | start, update, done | 服务器创建流时触发 |
需要注意的是,以上所有事件默认都不触发,需要使用者在服务器配置里添加相应配置项才能实现。
配置选项
一条完整的事件配置包括以下配置项:
其中事件触发点(stage)包含三个选项:
Syntax: oclp_play url [args=string] [stage=[start][,update][,done]] [timeout=time] [update=time];
Default: -
Context: application
注意:同一个application下不能重复配置。
配置示例:
oclp_play http://xxxx stage=start,update,done args=$pargs&clientip=$remote_addr update=20s timeout=3s;
当外部拉流时,媒体服务器向配置的 url 发送 http get 请求,请求中携带默认参数和扩展参数。
默认参数是不需要通过args配置就有的:
call=play&act=start&domain=$domain&app=$app&name=$name
扩展参数(配置文件中args后面所加内容):
$pargs&clientip=$remote_addr
最终发出的完整http get请求是这样的:
GET uri?call=play&act=start&domain=$domain&app=$app&name=$name&$pargs&client=$remote_addr HTTP/1.1
默认参数不需要在配置文件里出现就会被加入到 http get请求的url里
参数 | 解释 |
---|---|
call=play | 事件类型,oclp_play触发的就是play事件,对于oclp_publish来说call=publish,以此类推 |
act=start | 触发点,act=start代表此时play请求刚开始。 |
domain=$domain | 客户端建联时所用的host名称,可能是ip也可能是域名,这个参数跟http请求中的host类似 |
app=$app | play请求的application名称 |
name=$name | play请求的流名 |
参数 | 解释 |
---|---|
$pargs | $ pargs 在配置文件中是个变量,意思是rtmp或http-flv或http-ts或hls+播放url中携带的所有参数,例如客户端通过rtmp://ip/app/name?token=xxxxxx请求播放,那么$pargs则会在程序运行过程中被token=xxxxxx代替。用这种方法可以将播放请求中携带的参数传递给你的业务服务器,以便业务服务器做token鉴权。 |
clientip=$remote_addr | 同样的,$remote_addr在配置文件中也是变量,代表远程客户端的IP地址。类似的变量还有非常多,具体的变量查询请参考我的另外一篇博客“nginx-rtmp-module在配置里使用变量” |
stage在这里可以理解为触发点,每种事件(oclp_proc除外)都有三个触发点,分别是:start、update、done。
stage | 响应值 |
---|---|
start阶段(act=start) | 200 允许播放,非200则断掉拉流请求 |
update阶段(act=update) | 忽略响应值 |
done阶段(act=done) | 忽略响应值 |
如上表所示:
对于初始请求,如果外部异常,导致pingos服务器没有收到http返回结果,pingos将不会发送 update 请求;
如果外部回送非 200 响应,将会使用 403/NetStream.Play.Forbidden 断掉拉流请求;
如果外部回送 200 响应并配置了刷新,会启动 update 定时器发送刷新通知。
对于刷新通知和结束通知,不对响应做处理。
Syntax: oclp_publish url [args=string] [stage=[start][,update][,done]] [timeout=time] [update=time];
Default: -
Context: application
一个application里只能配置一条oclp_publish,服务器收到外部推流请求时会触发publish事件。
oclp_publish http://xxxx stage=start,update,done args=$pargs&clientip=$remote_addr update=20s timeout=3s;
oclp_publish和oclp_play非常类似,关于各参数的解释,以及http响应值的描述可以参考oclp_play的内容。