1. 程式人生 > 實用技巧 >pingOS指定拉流和推流的響應事件配置

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 { listen
80; 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_playstart通知,當拉流持續時,每隔一定時間間隔向外發送on_playupdate 通知,當拉流結束時傳送on_playdone通知。

  • on_publish

當有推流時,觸發 on_publishstart通知,當推流持續時,每隔一定時間間隔向外發送on_publishupdate通知,當推流結束時傳送on_publichdone通知。

  • on_pull

當需要回源拉流時,觸發pull控制(傳送on_pullstart通知),回源拉流建立成功後,每隔一定時間間隔向外發送on_pullupdate通知,當拉流結束時傳送on_pulldone 通知。

  • on_push

當需要轉推流時,觸發push控制(傳送on_pushstart通知),轉推流建立成功後,每隔一定時間間隔向外發送on_pushupdate通知,當轉推流結束時傳送on_pushdone通知。

  • on_stream

當有推流時,觸發 on_streamstart 通知,當流還繼續存在時,每隔一定時間間隔向外發送 on_streamupdate 通知,推流結束時傳送 on_streamdone 通知。

  • on_meta

meta 的行為和 push 一致,只是 meta 的觸發點在收到音視訊頭,push 觸發點是收到 publish 命令,pushmeta 是互斥的,配置了 pushmeta 將不生效。

控制事件觸發點包含:

  • 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 在收到音訊或視訊頭時均會觸發