轉載請注明出處: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
- 下面對預設參數進行逐一解釋:
預設參數不需要在配置檔案裡出現就會被加入到 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的内容。