天天看点

分布式直播系统(十一)【nginx-rtmp-module鉴权接口】描述事件回调播放鉴权推流鉴权QQ交流群:697773082微信(cczjp1989)

转载请注明出处:https://blog.csdn.net/impingo

项目地址:https://github.com/im-pingo/pingos

项目官网:https://pingos.io

目录

  • 描述
  • 事件回调
    • 什么是事件回调
    • 事件类型
  • 播放鉴权
    • 配置示例
    • 配置项args
    • 配置项stage
    • http响应值
  • 推流鉴权
  • QQ交流群:697773082
  • 微信(cczjp1989)

描述

原始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 服务器创建流时触发

需要注意的是,以上所有事件默认都不触发,需要使用者在服务器配置里添加相应配置项才能实现。

配置选项

一条完整的事件配置包括以下配置项:

  • args:向外发送通知或控制请求时,携带的 http 请求参数
  • groupid:分组,主要针对 push 或 meta,多路转推时,用于标识每路转推用
  • stage:触发阶段,可选 start,update 和 done
  • timeout:向外发送通知或控制请求时,等待外部响应的超时时间,默认为 3s
  • update:发送 update 通知的时间间隔,默认为 1min,只有 stage 配置了 update 才生效

其中事件触发点(stage)包含三个选项:

  • start:事件发生时触发,配置或不配置 start 均为默认开启状态
  • update:事件持续过程中的心跳刷新,只有start收到正常响应值(200或302)才会试update生效
  • done:事件结束时触发

播放鉴权

配置示例

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
           

配置项args

  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请求的流名
  1. 下面对扩展参数(配置中args起的作用)进行逐一解释:
参数 解释
$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

stage在这里可以理解为触发点,每种事件(oclp_proc除外)都有三个触发点,分别是:start、update、done。

  • start:不管有没有显示地在配置文件里配置出来,默认都认为已经配置,在play开始时的http get请求中act=start。
  • update:可选,如果配置了update,并且act=start的响应结果为200,则服务器在play持续过程中会周期性地发送act=update的请求,可以理解为心跳。
  • done:可选,如果配置里done,则在play结束时,发送act=done的http get请求,可以理解为结束通知。

http响应值

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的内容。

QQ交流群:697773082

微信(cczjp1989)

分布式直播系统(十一)【nginx-rtmp-module鉴权接口】描述事件回调播放鉴权推流鉴权QQ交流群:697773082微信(cczjp1989)