pingOS指定拉流和推流的響應事件配置
worker_processes 1; error_log logs/error.log debug; events { worker_connections 1024; } rtmp { server { listen 1935; application live1 { live on; # record off; sync 300ms; on_play http://127.0.0.1:9990/video/notify/play args=stream=$stream stage=start,done;on_publish http://127.0.0.1:9990/video/notify/publish args=stream=$stream stage=start,done; } application live2 { live on; drop_idle_publisher 5s; #on_play http://127.0.0.1:9990/video/notify/play stage=start,done; } ping 3m; ping_timeout 30s; } } http { server { listen80; location / { root html;
$domain |
客戶端伺服器時使用的域名,類似http協議中的host引數 |
$app |
掛載點名 |
$name |
流名 |
$stream |
流標識,serverid/app/name拼接而成 |
$pargs |
推流或播放請求連線後攜帶的自定義引數 |
$args |
rtmp協議中,在connection階段攜帶的引數 |
$flashver |
rtmp協議中的flashver |
$swf_url |
rtmp協議中的swf_url |
$tc_url |
rtmp協議中的tc_url |
$page_url |
rtmp協議中的page_url |
$acodecs |
音訊編碼型別 |
$vcodecs |
視訊編碼型別 |
$scheme |
連線使用的協議,如http、rtmp |
$serverid |
配置中的serverid |
$notify_status |
notify執行結果 |
$finalize_reason |
session被銷燬的原因 |
$stage |
當前session所處的階段: “init”, “handshake_done”, “connect”, “create_stream”, “publish”, “play”, “audio_video”, “close_stream” |
$init |
session被初始化的時間 |
$handshake_done |
rtmp握手完成時的時間 |
$connect |
連線建立的時間 |
$create_stream |
流被建立時的時間 |
$ptime |
從推流端獲取到第一幀媒體資料時的時間 |
$first_data |
收到或傳送第一幀媒體資料的時間 |
$first_metadata |
收到或傳送metadata的時間 |
$first_audio |
收到或傳送第一個音訊幀的時間 |
$first_video |
收到或傳送第一個視訊幀的時間 |
$close_stream |
流被關閉的時間 |
$relay_domain |
relay操作使用的域名,參考domain變數 |
$relay_app |
relay操作使用的掛載點名,參考app變數 |
$relay_name |
relay操作使用的流名,參考name變數 |
$relay_args |
relay操作connection的引數,參考args變數 |
$relay_pargs |
relay操作的pages引數,參考pargs變數 |
$relay_referer |
relay操作的referer,參考page_url變數 |
$relay_user_agent |
relay操作中User-Agent引數 |
$relay_swf_url |
參考swf_url |
$relay_acodecs |
relay操作成功後,拉取到的或推送出去的音訊編碼型別,參考acodecs |
$relay_vcodecs |
relay操作成功後,拉取到的或推送出去的視訊編碼型別,參考vcodecs |
$remote_addr |
客戶端IP |
$remote_port |
客戶端埠 |
$server_addr |
客戶端通過伺服器的哪個IP連線進來的 |
$server_port |
客戶端通過伺服器的哪個埠連線進來的 |
$nginx_version |
nginx版本 |
$pid |
nginx worker程序的程序號 |
$msec |
精確到微妙的時間戳,標記當前操作的精確時間 |
$time_iso8601 |
iso8601標準時間 |
$time_local |
格式化的時間 |
$ngx_worker |
worker程序的編號 |
$parg_ |
獲取到pargs引數中的某個引數,例如pargs為k0=0&k1=1,那麼$parg_k0 的值就是0,$parg_k1 是1 |
控制事件
- on_proc
程序啟動時通知,只支援 start 觸發點。
- on_play
當有拉流時,觸發 on_play
的start
通知,當拉流持續時,每隔一定時間間隔向外發送on_play
的update
通知,當拉流結束時傳送on_play
的done
通知。
- on_publish
當有推流時,觸發 on_publish
的start
通知,當推流持續時,每隔一定時間間隔向外發送on_publish
的update
通知,當推流結束時傳送on_publich
的done
通知。
- on_pull
當需要回源拉流時,觸發pull
控制(傳送on_pull
的start
通知),回源拉流建立成功後,每隔一定時間間隔向外發送on_pull
的update
通知,當拉流結束時傳送on_pull
的done
通知。
- on_push
當需要轉推流時,觸發push
控制(傳送on_push
的start
通知),轉推流建立成功後,每隔一定時間間隔向外發送on_push
的update
通知,當轉推流結束時傳送on_push
的done
通知。
- on_stream
當有推流時,觸發 on_stream
的start
通知,當流還繼續存在時,每隔一定時間間隔向外發送 on_stream
的update
通知,推流結束時傳送 on_stream
的done
通知。
- on_meta
meta
的行為和 push
一致,只是 meta
的觸發點在收到音視訊頭,push
觸發點是收到 publish
命令,push
和 meta
是互斥的,配置了 push
,meta
將不生效。
控制事件觸發點包含:
- start:事件發生時觸發,配置或不配置 start 均為預設開啟狀態
- update:事件持續過程中的心跳重新整理
- done:事件結束時觸發
擴充套件引數
- args:向外傳送通知或控制請求時,攜帶的 http 請求引數,可使用變數配置,具體變數列表請參考變數列表↑
- groupid:分組,主要針對 push 或 meta,多路轉推時,用於標識每路轉推用
- stage:觸發階段,可選 start,update 和 done
- timeout:向外傳送通知或控制請求時,等待外部響應的超時時間,預設為 3s
- update:傳送 update 通知的時間間隔,預設為 1min,只有 stage 配置了 update 才生效
配置示例
-
基本模型
application test { live on; cache_time 3s; idle_streams off; on_publish http://127.0.0.1/xxx/v1/publish stage=start,done args=a=c&b=d&$pargs; # 配置檔案中的變數以$開頭 on_play http://127.0.0.1/xxx/v1/play stage=start,done args=a=c&b=d&$pargs; on_stream http://127.0.0.1/xxx/v1/stream stage=start,done args=a=c&b=d&$pargs; }
-
拉流模型
application edge { live on; cache_time 3s; low_latency on; on_pull http://127.0.0.1/xxx/v1/pull stage=start,update,done args=a=c&b=d&$pargs; }
-
推流模型
application pub { live on; #on_push http://127.0.0.1/xxx/v1/push stage=start,update,done args=a=c&b=d&$pargs timeout=1s; on_meta http://127.0.0.1/xxx/v1/push stage=start,update,done args=a=c&b=d&$pargs timeout=1s; }
配置
on_proc
Syntax: on_proc url [timeout=time] [update=time];
Default: -
Context: rtmp
- Desc
程序啟動時,向配置的 url 傳送 http get 請求,通知時會攜帶
call=init_process&worker_id=$ngx_worker
引數。
on_play
Syntax: on_play url [args=string] [stage=[start][,update][,done]] [timeout=time] [update=time];
Default: -
Context: application
- Desc
只能配置一條。
外部拉流時,向配置的 url 傳送 http get 請求,通知時會攜帶call=play&act=start&domain=$domain&app=$app&name=$name
,如果配置了 args,會將 args 追加到預設引數後面。
如果配置了 update,拉流結束前,每隔 update 時間間隔會發送一條重新整理通知,和初始通知區別是,act=update。
如果配置了 done,拉流結束後會傳送 done 通知,和初始通知區別是,act=done。
對於初始請求,如果外部異常,將不會發送 update 請求;如果外部回送非 200 響應,將會使用 403/NetStream.Play.Forbidden 斷掉拉流請求;如果外部回送 200 響應並配置了重新整理,會啟動 update 定時器傳送重新整理通知。 對於重新整理通知和結束通知,不對響應做處理。
on_publish
Syntax: on_publish url [args=string] [stage=[start][,update][,done]] [timeout=time] [update=time];
Default: -
Context: application
- Desc
只能配置一條。
外部推流時,向配置的 url 傳送 http get 請求,通知時會攜帶call=publish&act=start&domain=$domain&app=$app&name=$name
,如果配置了 args,會將 args 追加到預設引數後面。
如果配置了 update,推流結束前,每隔 update 時間間隔會發送一條重新整理通知,和初始通知區別是,act=update。
如果配置了 done,推流結束後會傳送 done 通知,和初始通知區別是,act=done。
對於初始請求,如果外部異常,將不會發送 update 請求;如果外部回送非 200 響應,將會使用 403/NetStream.Play.Forbidden 斷掉拉流請求;如果外部回送 200 響應並配置了重新整理,會啟動 update 定時器傳送重新整理通知。
對於重新整理通知和結束通知,不對響應做處理。
on_stream
Syntax: on_stream url [args=string] [stage=[start][,update][,done]] [timeout=time] [update=time];
Default: -
Context: application
- Desc
只能配置一條。
流建立時(有一路推流或一路拉流時),向配置的 url 傳送 http get 請求,通知時會攜帶call=stream&act=start&domain=$domain&app=$app&name=$name
,如果配置了 args,會將 args 追加到預設引數後面。
如果配置了 update,所有推拉流結束前,每隔 update 時間間隔會發送一條重新整理通知,和初始通知區別是,act=update。 對於初始請求,如果外部異常或外部回送非 200 響應,將不會發送 update 請求;如果外部回送 200 響應並配置了重新整理,會啟動 update 定時器傳送重新整理通知。
如果配置了 done,所有推拉流結束後會傳送 done 通知,和初始通知區別是,act=done。
對於重新整理通知和結束通知,不對響應做處理。
on_pull
Syntax: on_pull url [args=string] [stage=[start][,update][,done]] [timeout=time] [update=time];
Default: -
Context: application
- Desc
只能配置一條。
需要觸發回源拉流時,向配置的 url 傳送 http get 請求,通知時會攜帶call=pull&act=start&domain=$domain&app=$app&name=$name
,如果配置了 args,會將 args 追加到預設引數後面。
如果配置了 update,relay pull session 結束前,每隔 update 時間間隔會發送一條重新整理通知,和初始通知區別是,act=update。
如果配置了 done,relay pull session 結束後會傳送 done 通知,和初始通知區別是,act=done。
對於初始請求,如果外部異常,將會啟動 pull reconnect;如果外部回送 200 響應,將不會建立 relay pull session,因此後續不會有 update 和 done 通知;如果外部回送 4XX 或 5XX 響應,將會結束所有拉流請求。
如果回送 3XX 響應,將會根據 Location 頭構造回源請求,Location 必須是完整的 rtmp 或 http url,如 rtmp://ip/app/name[?args],如果是 rtmp url 將會使用 rtmp 協議回源,如果是 http url 將會使用 http flv 協議回源。如果 3XX 響應中攜帶 Domain 頭,將會使用該頭構造 rtmp 的 tc_url 或 http 的 Host 頭。
對於重新整理通知和結束通知,不對響應做處理。
on_push
Syntax: on_push url [args=string] [stage=[start][,update][,done]] [timeout=time] [update=time];
Default: -
Context: application
- Desc
最多支援配置 8 條,每條對應一個 relay push session。
需要觸發流轉推時,向配置的 url 傳送 http get 請求,通知時會攜帶call=push&act=start&domain=$domain&app=$app&name=$name
,如果配置了 args,會將 args 追加到預設引數後面。
如果配置了 update,relay push session 結束前,每隔 update 時間間隔會發送一條重新整理通知,和初始通知區別是,act=update。
如果配置了 done,每條 relay push session 結束後會傳送 done 通知,和初始通知區別是,act=done。
對於初始請求,如果外部異常,將會啟動 push reconnect;如果外部回送 200 響應,將不會建立 relay push session,因此後續不會有 update 和 done 通知;如果外部回送 4XX 或 5XX 響應,將會結束推流請求。
如果回送 3XX 響應,將會根據 Location 頭構造回源請求,Location 必須是完整的 rtmp url,如 rtmp://ip/app/name[?args]。如果 3XX 響應中攜帶 Domain 頭,將會使用該頭構造 rtmp 的 tc_url。
對於重新整理通知和結束通知,不對響應做處理。
on_meta
Syntax: on_meta url [args=string] [stage=[start][,update][,done]] [timeout=time] [update=time];
Default: -
Context: application
- Desc
最多支援配置 8 條,每條對應一個 relay push session。
基本功能與 on_push 相同,只不過 on_push 是 publish 命令觸發,on_meta 是音視訊頭觸發,具體觸發規則見 on_meta_type 和 on_meta_once。
on_meta_once
Syntax: on_meta_once on|off;
Default: on
Context: rtmp, server, application
- Desc
on_meta 通知是否只觸發一次
on_meta_type
Syntax: on_meta_once video|audio|both;
Default: video
Context: rtmp, server, application
- Desc
- video:on_meta 只有在收到視訊頭時觸發
- audio:on_meta 只有在收到音訊頭時觸發
- both:on_meta 在收到音訊或視訊頭時均會觸發