天天看點

分布式直播系統(十一)【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)