轉載請註明出處: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 | 服務器創建流時觸發 |
需要注意的是,以上所有事件默認都不觸發,需要使用者在服務器配置裏添加相應配置項才能實現。
配置選項
一條完整的事件配置包括以下配置項:
- 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
- 下面對默認參數進行逐一解釋:
默認參數不需要在配置文件裏出現就會被加入到 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請求的流名 |
- 下面對擴展參數(配置中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的內容。