1. 程式人生 > >基於nginx-rtmp-module模組的relay功能分析及完善

基於nginx-rtmp-module模組的relay功能分析及完善

基於nginx-1.8.1+nginx-rtmp-module方案

多種實時流請求觸發中繼的實現

1.概述

  • 視訊直播方案基於nginx+rtmp;
  • 叢集內區分邊緣和源務服器,邊緣與源是基於rtmp流做同步的,有relay模組實現;
  • 叢集內伺服器除提供rtmp實時流基礎功能外,基於rtmp實時流,還提供了httplive stream(hls)實時流及http live flv(hlf)實時流;
  • hls流實現詳見ngx_http_auth_hls_module、ngx_rtmp_hls_module模組;
  • hlf流實現詳見ngx_http_hlf_module、ngx_rtmp_hlf_module模組;
  • relay模組實現了當客戶向邊緣伺服器請求某一路rtmp實時流且該流不存在時,會向配置的源伺服器請求該rtmp實時流,請求成功後該邊緣伺服器分發該流給請求的客戶,即中繼開始;當最後一個請求該rtmp實時流的客戶關閉流時,該邊緣伺服器會自動斷開與源伺服器該實時流的請求,即中繼結束;
  • 現有relay中繼聯動源是基於rtmp流請求的,針對hls、hlf流的請求源存在缺失,本文件針對該功能的實現進行闡述;

2.現有中繼方案剖析

跟中繼功能相關模組,目前有三個,分別是notify,auto-push,relay。

其中notify模組暫不介紹。

2.1auto-push

模組名:ngx_rtmp_auto_push_module;

應用於nginx多程序工作方式,當某一程序受理rtmp實時推流時,同時向其它工作程序實時推流,保證所有工作程序都有該實時流資料,以便各工作程序基於該流的服務,從而保證nginx服務的完整性;

各程序流同步是基於本地套接字來實現的;

剖析主要的三個函式:

2.1.1ngx_rtmp_auto_push_init_process

   next_publish= ngx_rtmp_publish;

    ngx_rtmp_publish =ngx_rtmp_auto_push_publish;

    next_delete_stream =ngx_rtmp_delete_stream;

    ngx_rtmp_delete_stream = ngx_rtmp_auto_push_delete_stream;

初始化本地偵聽套接字

1.根據ngx_rtmp_init_connection查詢ngx_listening_t例項來複制;

2.sokcet_name:

    saun->sun_family = AF_UNIX;

    *ngx_snprintf((u_char *) saun->sun_path,sizeof(saun->sun_path),

                  "%V/"NGX_RTMP_AUTO_PUSH_SOCKNAME ".%i",

                  &apcf->socket_dir,ngx_process_slot) = 0;

3.該套接字請求產生的ngx_rtmp_session_t *s,其中s->auto_pushed = 1;

2.1.2ngx_rtmp_auto_push_publish

推流事件上來時:

typedefstruct ngx_rtmp_auto_push_ctx_s ngx_rtmp_auto_push_ctx_t;

structngx_rtmp_auto_push_ctx_s {

    ngx_int_t                      *slots; /*NGX_MAX_PROCESSES */

    u_char                         name[NGX_RTMP_MAX_NAME];

    u_char                         args[NGX_RTMP_MAX_ARGS];

    ngx_event_t                     push_evt;

};

1.生成ngx_rtmp_auto_push_ctx_t       *ctx;//上下文;

2.呼叫ngx_rtmp_auto_push_reconnect函式;

3.ngx_rtmp_auto_push_reconnect函式內再呼叫relay模組的ngx_rtmp_relay_push()函式;

4.實現斷開重連的功能;

2.1.3ngx_rtmp_auto_push_delete_stream

推流會話斷開時:

1.源session會話(推流)斷開時,清除重連事件即可;

2.目標主機session會話(拉流)斷開時/* skipnon-relays & publishers */,啟用斷開重連定時器;

前提是ngx_rtmp_relay_module模組該session的上下文指示的publish存在,若不存在說明源session會話已斷開,不需要重連;

2.2relay

模組名:ngx_rtmp_relay_module;

實現基於rtmp流的中繼功能;

重點剖析以下幾部分:

2.2.1資料結構

typedefstruct {

    ngx_array_t                 pulls;         /* ngx_rtmp_relay_target_t * */

    ngx_array_t                 pushes;        /* ngx_rtmp_relay_target_t * */

    ngx_array_t                 static_pulls;  /* ngx_rtmp_relay_target_t * */

    ngx_array_t                 static_events; /* ngx_event_t* */

    ngx_log_t                  *log;

    ngx_uint_t                  nbuckets;

    ngx_msec_t                  buflen;

    ngx_flag_t                  session_relay;

    ngx_msec_t                  push_reconnect;

    ngx_msec_t                  pull_reconnect;

    ngx_rtmp_relay_ctx_t        **ctx;

}ngx_rtmp_relay_app_conf_t;

typedefstruct {

    ngx_url_t                       url;

    ngx_str_t                       app;

    ngx_str_t                       name;

    ngx_str_t                       tc_url;

    ngx_str_t                       page_url;

    ngx_str_t                       swf_url;

    ngx_str_t                       flash_ver;

    ngx_str_t                       play_path;

    ngx_int_t                       live;

    ngx_int_t                       start;

    ngx_int_t                       stop;

    void                           *tag;     /* usually module reference */

    void                           *data;    /* module-specific data */

    ngx_uint_t                    counter; /* mutableconnection counter */

}ngx_rtmp_relay_target_t;

typedefstruct {

    ngx_rtmp_conf_ctx_t         cctx;

    ngx_rtmp_relay_target_t    *target;

}ngx_rtmp_relay_static_t;

typedefstruct ngx_rtmp_relay_ctx_s ngx_rtmp_relay_ctx_t;

structngx_rtmp_relay_ctx_s {

    ngx_str_t                       name;

    ngx_str_t                       url;

    ngx_log_t                       log;

    ngx_rtmp_session_t             *session;

    ngx_rtmp_relay_ctx_t           *publish;

    ngx_rtmp_relay_ctx_t           *play;

    ngx_rtmp_relay_ctx_t           *next;

    ngx_str_t                       app;

    ngx_str_t                       tc_url;

    ngx_str_t                       page_url;

    ngx_str_t                       swf_url;

    ngx_str_t                       flash_ver;

    ngx_str_t                       play_path;

    ngx_int_t                       live;

    ngx_int_t                       start;

    ngx_int_t                       stop;

    ngx_event_t                     push_evt;

    ngx_event_t                    *static_evt;

    void                                 *tag;

    void                                 *data;

};

2.2.2關聯事件

ngx_rtmp_relay_postconfiguration

詳見程式碼

    h = ngx_array_push(&cmcf->events[NGX_RTMP_HANDSHAKE_DONE]);

    *h = ngx_rtmp_relay_handshake_done;

    next_publish = ngx_rtmp_publish;

    ngx_rtmp_publish = ngx_rtmp_relay_publish;

    next_play = ngx_rtmp_play;

    ngx_rtmp_play = ngx_rtmp_relay_play;

    next_delete_stream =ngx_rtmp_delete_stream;

    ngx_rtmp_delete_stream =ngx_rtmp_relay_delete_stream;

    next_close_stream = ngx_rtmp_close_stream;

    ngx_rtmp_close_stream =ngx_rtmp_relay_close_stream;

    ch = ngx_array_push(&cmcf->amf);

    ngx_str_set(&ch->name,"_result");

    ch->handler = ngx_rtmp_relay_on_result;

    ch = ngx_array_push(&cmcf->amf);

    ngx_str_set(&ch->name,"_error");

    ch->handler = ngx_rtmp_relay_on_error;

    ch = ngx_array_push(&cmcf->amf);

    ngx_str_set(&ch->name,"onStatus");

    ch->handler = ngx_rtmp_relay_on_status;

2.2.3配置解析

ngx_rtmp_relay_push_pull

1.解析relay相關引數,生成ngx_rtmp_relay_app_conf_t* racf例項;

2.主要解析3部分:

  • push部分,放入racf>pulls;
  • pull部分,放入racf->pushes;
  • static pull部分,放入racf->static_pulls,同時生成ngx_event_t事件放入racf-> static_events,兩者相對應;
  • 以上三個陣列,其元素類均是ngx_rtmp_relay_target_t,其中static_pulls還帶一個ngx_rtmp_relay_static_t例項,有racf->static_events的data指定。

2.2.4控制上下文

ngx_rtmp_relay_ctx_t結構內的三個成員:

    ngx_rtmp_relay_ctx_t           *publish;

    ngx_rtmp_relay_ctx_t           *play;

    ngx_rtmp_relay_ctx_t           *next;

hash表(開鏈法),結點連結串列結構

pull時:

  • hash結點存放向目標主機拉流session上下文,該session是推流會話;
  • 結點連結串列連線的是源session的上下文,該session是拉流會話;
push時:
  • hash結點存放源session的上下文,該session是推流會話;
  • 結點連結串列連線的是向目標主機推流session的上下文,該session是拉流會話;

警告:

push、pull應用中成對配置。若配置了pull(目標主機不存在或流不存在),而沒有配置push時,往伺服器推流時無法正常拉流,因為此時拉流請求會啟用pull操作,且pull操作失敗導致ngx_rtmp_relay_close呼叫,最終關閉拉流請求,雖然此時伺服器存在該流。

2.2.5static pull

ngx_rtmp_relay_init_process();

        ngx_rtmp_relay_static_pull_reconnect();

                ngx_rtmp_relay_create_connection():

1.生成ngx_rtmp_relay_ctx_t*rctx;

2.生成ngx_peer_connection_t*pc,同時獲取ngx_peer_connection_t *pc;

3.生成ngx_rtmp_session_t*rs,其中設定rs->relay = 1;

返回ngx_rtmp_relay_static_pull_reconnect函式後,設定rs-> static_relay= 1;

靜態拉流session,對於本機來說是推流,當該session斷開時,會啟用斷開重連事件;

2.2.6pull部分

ngx_rtmp_relay_pull:

    return ngx_rtmp_relay_create(s, name, target,

            ngx_rtmp_relay_create_remote_ctx,

                    ngx_rtmp_relay_create_local_ctx);

ngx_rtmp_relay_create_remote_ctx:publish

ngx_rtmp_relay_create_local_ctx   :play

  • ngx_rtmp_relay_create_remote_ctx會呼叫ngx_rtmp_relay_create_connection函式建立session向目標主機拉流,同時生成該session的上下文(publish_ctx);對於本機來說該session是推流會話;同一路碼流,有多個拉流請求上來時,只有第一個才會建立session,並生成上下文;
  • ngx_rtmp_relay_create_local_ctx為本地源session生成上下文(play_ctx),源session是拉流會話;
  • 建立以向目標主機拉流session上下文的名稱為hash結點(開鏈法),結點採用連結串列方法連線ngx_rtmp_relay_create_local_ctx建立session上下文,即拉流會話上下文;
  • 同一路碼流,有多個pull配置時,經測試,只會啟動配置中第一個pull目標主機進行連線;

2.2.7push部分

ngx_rtmp_relay_push:

returnngx_rtmp_relay_create(s, name, target,

            ngx_rtmp_relay_create_local_ctx,

            ngx_rtmp_relay_create_remote_ctx);

ngx_rtmp_relay_create_local_ctx   : publish

ngx_rtmp_relay_create_remote_ctx: play

  • ngx_rtmp_relay_create_remote_ctx會呼叫ngx_rtmp_relay_create_connection函式建立session向目標主機推流,同時生成該session的上下文(play_ctx);對於本機來說該session是拉流會話;
  • ngx_rtmp_relay_create_local_ctx為本地源session生成上下文(publish_ctx),源session是推流會話;同一路碼有多個push目標時,只有第一個時才會生成上下文;
  • 建立以源session上下文的名稱為hash結點(開鏈法),結點採用連結串列方法連線ngx_rtmp_relay_create_remote_ctx建立session,即拉流會話上下文;
  • 當拉流會話斷開時,需要重連,呼叫ngx_rtmp_relay_push_reconnect函式;

2.2.8會話關閉時的邏輯

ngx_rtmp_relay_close函式

2.2.8.1靜態pull會話關閉

靜態pull建立的session,對於本機來說是推流會話,該會話的上下文不存放在hash表中,其中上下文的publish,play,next指標均為空。因此關閉時首先篩選靜態pull的會話,即static_relay==1時,並激活重連事件。

2.2.8.2拉流會話關閉

詳見程式碼

    /* play end disconnect? */

    if (ctx->publish != ctx) {

        for (cctx =&ctx->publish->play; *cctx; cctx = &(*cctx)->next) {

            if (*cctx == ctx) {

                *cctx = ctx->next;

                break;

            }

        }

        ngx_log_debug2(NGX_LOG_DEBUG_RTMP,ctx->session->connection->log, 0,

                "relay: play disconnectapp='%V' name='%V'",

                &ctx->app,&ctx->name);

        /* push reconnect */

        if (s->relay && ctx->tag== &ngx_rtmp_relay_module &&

           !ctx->publish->push_evt.timer_set)

        {

           ngx_add_timer(&ctx->publish->push_evt,racf->push_reconnect);

        }

        if (ctx->publish->play == NULL&& ctx->publish->session->relay) {

            ngx_log_debug2(NGX_LOG_DEBUG_RTMP,

                ctx->publish->session->connection->log, 0,

                "relay: publish disconnectempty app='%V' name='%V'",

                &ctx->app,&ctx->name);

            ngx_rtmp_finalize_session(ctx->publish->session);

        }

        ctx->publish = NULL;

        return;

    }

詳述:

1).從hash結點連結串列中移除ctx;

2).如果還是push中向目標主機建立的推流會話,對於本機是拉流會話,啟用斷開重連事件;

3).結點連結串列中沒有拉流請求,且推流會話是中繼,則斷開ctx指向的推流會話(呼叫ngx_rtmp_finalize_session);

4).設定ctx->publish=NULL;

2.2.8.3推流會話關閉

詳見程式碼

    /* publish end disconnect */

    if (ctx->push_evt.timer_set) {

        ngx_del_timer(&ctx->push_evt);

    }

    for (cctx = &ctx->play; *cctx; cctx= &(*cctx)->next) {

       (*cctx)->publish = NULL;

        ngx_rtmp_finalize_session((*cctx)->session);

    }

    ctx->publish = NULL;

    hash = ngx_hash_key(ctx->name.data,ctx->name.len);

    cctx = &racf->ctx[hash %racf->nbuckets];

    for (; *cctx && *cctx != ctx; cctx= &(*cctx)->next);

    if (*cctx) {

        *cctx = ctx->next;

    }

詳述:

1).如果激活了重連事件,則取消;

2).清除結點連結串列中所有的拉流會話,publish=NULL且ngx_rtmp_finalize_session;

兩類推流

  • 推流會話上來時(一個),生成push會話(可能多個),即拉流會話;
  • 拉流會話上來時(可以多個),生成pull會話(一個),即推流會話;

3).設定ctx->publish=NULL;

4).清除該推流會話的hash結點;

3.流聯動中繼的實現

3.1relay模組更改部分

3.1.1relay控制上下文

增加聯動其它請求源計數功能

詳見紅色部分,以下類同

struct ngx_rtmp_relay_ctx_s {

   ngx_str_t                      name;

   ngx_str_t                      url;

   ngx_log_t                      log;

   ngx_rtmp_session_t            *session;

   ngx_rtmp_relay_ctx_t          *publish;

   ngx_rtmp_relay_ctx_t          *play;

   ngx_rtmp_relay_ctx_t          *next;

    //hls,hlf relations

    ngx_uint_t                    refcount;

    ngx_rtmp_relay_callback_t      *ls_rcb;

    ngx_rtmp_relay_callback_t      *free_rcb;

   ngx_str_t                      app;

   ngx_str_t                      tc_url;

   ngx_str_t                      page_url;

   ngx_str_t                      swf_url;

   ngx_str_t                      flash_ver;

   ngx_str_t                      play_path;

   ngx_int_t                      live;

   ngx_int_t                      start;

   ngx_int_t                      stop;

   ngx_event_t                    push_evt;

   ngx_event_t                   *static_evt;

   void                          *tag;

   void                          *data;

};

其中

  • refcount表示除rtmp實時流請求外的計數,每類聯動請求源僅加1,與該類請求實際數無關;
  • ls_rcb屬回撥函式,當推流會話關閉時,需要回調處理的邏輯,同請求源的業務相關;主要應用於非rtmp模組需要繫結流會話關閉事件;

typedef ngx_int_t(*ngx_rtmp_publish_delete_stream_pt)

(ngx_str_t *app, ngx_str_t *name, void *conf);

typedef struct ngx_rtmp_relay_ctx_s ngx_rtmp_relay_ctx_t;

struct ngx_rtmp_relay_callback_s

{

         ngx_rtmp_relay_callback_t           *next;

         void                              *conf;

         ngx_rtmp_publish_delete_stream_pt    pds;

} ;

  • free_rcb啟用例項回收再利用的方法;

3.1.2增加介面函式

3.1.2.1某類請求源拉流時

聯動中繼

規則同rtmp拉流請求時一樣,只有第一個請求時才會呼叫該函式,原型如下:

ngx_int_t

ngx_rtmp_relay_pull_others_open(ngx_str_t*app, ngx_str_t *name, ngx_uint_t srv,

                                ngx_rtmp_relay_callback_t *src_rcb,ngx_rtmp_relay_callback_t **rcb);

詳述:

1.根據svr,app,name找到ngx_rtmp_conf_ctx_t(ngx_rtmp_relay_get_conf_ctx);

2.從ngx_rtmp_relay_app_conf_t->ctx查詢結點:

         2.1.找到,返回ngx_rtmp_relay_ctx_t,並修改refcount;

         2.2.沒有找到,呼叫ngx_rtmp_relay_create_connection返回ngx_rtmp_relay_ctx_t,並添 加hash表中;

3.1.2.2某類請求源拉流全部關閉時

結束中繼

同rtmp拉流關閉時一樣,當最後一個拉流關閉時才會呼叫該函式,原型如下:                                       

ngx_int_t

ngx_rtmp_relay_pull_others_close(ngx_str_t*app, ngx_str_t *name,

                                 ngx_uint_tsrv,ngx_rtmp_relay_callback_t *rcb);

詳述:

1.根據svr,app,name找到ngx_rtmp_conf_ctx_t(ngx_rtmp_relay_get_conf_ctx);

2.找到ngx_rtmp_relay_app_conf_t->ctx,對應hash結點,refcount減1;如果rcb有值,同時移除從ls_rcb移除rcb;

3.若refcount為0且play為null,且是中繼推流會話,則斷開該會話(relay,推流會話);

4.呼叫ngx_rtmp_finalize_session斷開會話,會轉到ngx_rtmp_relay_close函式執行;

3.1.3會話關閉時更改

ngx_rtmp_relay_close函式,需要改動兩個地方:

1.拉流斷開時,是否關閉推流會話,在原判斷的基礎上增加refcount==0,例如:

     if (ctx->publish->play == NULL &&

           //hls,hlf relations

           ctx->publish->refcount == 0 &&

           ctx->publish->session->relay)

       {

           ngx_log_debug2(NGX_LOG_DEBUG_RTMP,

                          ctx->publish->session->connection->log, 0,

                           "relay: publishdisconnect empty app='%V' name='%V'",

                           &ctx->app,&ctx->name);

           ngx_rtmp_finalize_session(ctx->publish->session);

       }

2.推流會話關閉時,回撥ls_rcb函式;該回調應用於非rtmp模組需要繫結ngx_rtmp_close_stream函式連結串列,例如:

   //釋出流斷開回調

   if (ctx->ls_rcb)

    {

       rcb = ctx->ls_rcb;

       for (; rcb ; rcb = rcb->next)

       {

           if (rcb->pds)

           {

               rcb->pds(&ctx->app,&ctx->name,rcb->conf);

           }

           ngx_rtmp_relay_free_rcb(rcb,ctx);

       }

       ctx->ls_rcb = NULL;

   }   

3.2hls更改部分

檔名:ngx_http_auth_hls_module.c

模組名:ngx_http_auth_hls_module,屬http模組。

該模組提供了hls流請求session管理,token認證功能,現增加聯動中繼功能;

以下闡述針對hls請求聯動中繼功能實現的修改部分。

3.2.1配置結構更改

詳見紅色部,以下類同

//auth_hls配置

typedef struct

{

         ngx_flag_t                                    enable;         //hls認證啟用標識,預設不啟用

   ngx_str_t                  url;            //認證url(本地location,其內呼叫代理                                                                                                             完成認證),預設auth_hls

    ngx_flag_t                 hls_relay;      //聯動hls中繼,預設不啟用

    ngx_uint_t                  hls_srv;        //rtmp server序號,預設0

   ngx_msec_t                timeout;        //閒時週期,預設30秒

   ngx_uint_t                 nbuckets;       //最大hash數(開連結串列示,實際容量不                                                                                                                    受限制),預設1024

     ngx_pool_t                 *pool;

     ngx_log_t                   *log;

   ngx_http_hls_relay_t        *free;

   ngx_http_hls_relay_t       **hls_relay_ref;

} ngx_http_auth_hls_conf_t;

3.2.2增加流請求計數及hls會話更改

//session結構體

struct ngx_http_auth_hls_session_s

{

   ngx_http_auth_hls_session_t    *next;

    ngx_str_t                        session;         

   ngx_str_t                       token;           

   ngx_str_t                       host;            

    ngx_http_hls_relay_t              *relay;

   ngx_pool_t                     *pool;

   ngx_event_t                     idle_timer;

};

//relay結構體

structngx_http_hls_relay_s

{

   ngx_http_hls_relay_t        *next;

   u_char                     app[NGX_RTMP_MAX_NAME];

   u_char                      name[NGX_RTMP_MAX_NAME];

   ngx_uint_t                   refcount;

   ngx_rtmp_relay_callback_t     *rcb;

   ngx_http_auth_hls_conf_t      *conf;

   ngx_http_auth_hls_session_t  **sessions;

};

3.2.3建立、銷燬會話時的更改

hls流屬http協議的實時流,之前已經提供hls流會話的管理;

  • 在建立hls流會話時,即ngx_http_auth_hls_create_session函式內,增加呼叫relay模組的ngx_rtmp_relay_pull_others_open介面,例如:

         if(conf->hls_relay && !relay->refcount)

         {

       ngx_memzero(&src_cb,sizeof(ngx_rtmp_relay_callback_t));

       src_cb.conf = conf;

       src_cb.pds = hls_publish_delete_stream;

       ngx_rtmp_relay_pull_others_open(app,name,conf->hls_srv,&src_cb,&relay->rcb);

         }

         relay->refcount++;

  • 在hls流會銷燬時,即ngx_rtmp_relay_pull_others_close函式內,增加呼叫relay模組的ngx_rtmp_relay_pull_others_close介面,例如:

         if(relay->refcount == 0)

        {

             if (conf->hls_relay)

            {

                 ngx_rtmp_relay_pull_others_close(&app,

                                               &name,conf->hls_srv,relay->rcb);

             }

             ...

3.3hlf更改部分

hlf流屬http協議的實時流,與hls流不同在於hlf流是基於http協議的長連線;

hlf流有ngx_http_hlf_module,ngx_rtmp_hlf_module兩個提供實現;

3.3.1ngx_http_hlf_module

檔案:ngx_http_hlf_module.c,屬http模組。

模組配置更改

//模組配置

typedef struct

{

   ngx_flag_t    hlf_relay;      //聯動hls中繼,預設不啟用

   ngx_uint_t    hlf_srv;        //rtmp server序號,預設0

} ngx_http_hlf_loc_conf_t;

3.3.2ngx-tmp_hlf_module

檔案

ngx_rtmp_hlf_module.h

ngx_rtmp_hlf_module.c

ngx_rtmp_hlf_shared.c

屬rtmp模組

配置更改

//hlf配置

typedef struct {

   ngx_flag_t     enable;          //啟用標識(其它選項,後續增加)

   ngx_int_t      nbuckets;        //hash桶個數,預設1024

   ngx_int_t      queue_max;     //緩衝最大幀數,預設256,最小32

   ngx_msec_t    idle_timeout;    //無流時保持時長 ,預設直接斷開(0)

    ngx_flag_t     hlf_relay;        //聯動中繼,預設off

   ngx_rtmp_hlf_ctx_t   **ctxs;

   ngx_pool_t          *pool;

   ngx_rtmp_hlf_ctx_t   *free_ctxs;

} ngx_rtmp_hlf_app_conf_t;

ngx_rtmp_hlf_add_stream函式更改

當hlf流請求時,即ngx_rtmp_hlf_add_stream函式內增加呼叫relay模組的ngx_rtmp_relay_pull_others_open介面,例如:

   //聯動中繼

   if (conf->hlf_relay && ctx->streams == NULL)

    {

       ngx_rtmp_relay_pull_others_open(app,name,srv,NULL,NULL);

    }

ngx_rtmp_hlf_del_stream函式更改

當hlf請求關閉時,即ngx_rtmp_hlf_del_stream函式內增加呼叫relay模組的ngx_rtmp_relay_pull_others_close介面,例如:

   //沒有請求流,移除ctx

   if (ctx->streams == NULL)

    {

       conf = ctx->conf;

       if (conf->hlf_relay)

       {

           ngx_rtmp_relay_pull_others_close(&st->app,&st->name,ctx->hlf_srv,NULL);

       }

...

4.總結

原始碼詳見:

https://download.csdn.net/download/laichanghe/10455405

QQ:19993939

備註:文件內QQ號是錯的,在此糾正


相關推薦

基於nginx-rtmp-module模組relay功能分析完善

基於nginx-1.8.1+nginx-rtmp-module方案多種實時流請求觸發中繼的實現1.概述視訊直播方案基於nginx+rtmp;叢集內區分邊緣和源務服器,邊緣與源是基於rtmp流做同步的,有relay模組實現;叢集內伺服器除提供rtmp實時流基礎功能外,基於rtm

基於nginx-rtmp-module模組實現的HTTP-FLV直播模組nginx-http-flv-module(二)

      由於《基於nginx-rtmp-module模組實現的HTTP-FLV直播模組nginx-http-flv-module(一)》內容已經很長,所以後續的更新將記錄在這兒。非常感謝網友們的測試反饋和程式碼提交!專案地址

基於nginx-rtmp-module模組實現的HTTP-FLV直播模組nginx-http-flv-module(一)

      本文後續的內容將在這裡更新:《基於nginx-rtmp-module模組實現的HTTP-FLV直播模組nginx-http-flv-module(二)》。注意:下文的配置很多已經不能用了,因為現在的實現跟早期的實現相差有點大。而為了看到整個專案的變遷史,所以保留了

基於nginx-rtmp-module模塊實現的HTTP-FLV直播模塊(nginx-http-flv-module

發現 app1 多播 git app 命令 避免 put 編譯 本文後續的內容將在這裏更新:《基於nginx-rtmp-module模塊實現的HTTP-FLV直播模塊(nginx-http-flv-module)續》。註意:下文的配置很多已經不能用了,因為現在的實現跟早期

搭建基於nginx-rtmp-module的流媒體伺服器

1.業務流程圖   2.軟體下載   2.1 windows下載obs   2.2 linux 安裝nginx(附加rtmp模組)      1.cd /usr/local      2.mkdir nginx      3.cd nginx      4.wget 

基於nginx-rtmp-module的推拉流測試

1、安裝nginx伺服器 (參考http://nginx.org/en/docs/) sudo apt-get install nginx 或者從原始碼安裝 wget https://www.openssl.org/source/openssl-1.1.0e.tar.gz

Nginx+Nginx-rtmp-module做線上直播伺服器線上錄播

nginx配置 worker_processes 1; error_log logs/error.log debug; events { worker_connections 1024; } rtmp { server { li

nginx rtmp module 程式碼詳解 各模組主要功能

ngx_rtmp_dash_module http模組裡播放MPEG-DASH相關處理 ngx_rtmp_mp4_module 主要支援rtmp MP4這塊點播相關功能,支援seek操作 ngx_rtmp_flv_module 主要是flv檔案格式的點播相關功能,支援seek操作 ng

#後端筆記#在CentOS上利用 nginx + nginx-rtmp-module 搭建基於HLS協議的直播伺服器

一、直播協議簡介: 搭建之前,先簡單說說現在網上主流的直播協議: 1、RTMP:      實時訊息傳輸協議,Real Time Messaging Protocol,是 Adobe Systems 公司為 Flash 播放器和伺服器之間音訊、

基於Nginx+nginx-rtmp-module+ffmpeg搭建rtmp、hls流媒體伺服器

Nginx及nginx-rtmp-module安裝新建目錄mkdir /usr/local/mginx下載cd /usr/local/nginx wget http://nginx.org/download/nginx-1.12.2.tar.gz wget https://c

nginx-rtmp-module的缺陷分析

Arut最初在開發nginx-rtmp-module的時候只實現了單程序模式,好處是架構簡單,推送和播放,資料統計,流媒體控制等都

nginx-rtmp-module的缺陷分析(二)

nginx-rtmp-module使用指令push和pull來relay媒體流資料,以便分散式部署服務。 當nginx-rtmp

nginx-rtmp-module的缺陷分析(三)

VHOST(虛擬主機)就是一址多域的意思,主流的Web伺服器都有這個功能,它解決了執行Web的主機在同一個IP地址情況下可以為不同

obs nginx-rtmp-module搭建流媒體服務器實現直播 ding

video 接下來 監聽 comm 地址 什麽 ip地址 automake text 接下來我就簡單跟大家介紹一下利用nginx來搭建流媒體服務器。 我選擇的是騰訊雲服務器 1、下載nginx-rtmp-module: nginx-rtmp-module的官方gith

Windows下編譯nginx-rtmp-module

win10 threshold tar ram 1.2 openss direct down 0.11 http://nginx.org/en/docs/howto_build_on_win32.html 官網上的操作說明。 官網的方法Nginx編譯方法,思路是一致的,只是

nginxnginx-rtmp-module搭建流媒體服務器

vedio sans nginx配置 mark dir pen isp 自己 需要 轉載自my student 克明zhang 現在,一起學習一下如何自己搭建一個流媒體服務器吧! 本次搭建流媒體使用的環境是centos 7.0+nginx; 讓我們一起開始奇妙的流媒體之

windows下搭建ffmpeg+nginx+rtmp-module搭建實時視頻環境

target ati 靜態 hub 標簽 int 性能 pan href 下載ffmpeg的Windows靜態版; https://ffmpeg.zeranoe.com/builds/win64/static/下載nginx-rtmp-windows版:https://gi

流媒體技術學習筆記之(三)Nginx-Rtmp-Module統計某頻道在線觀看流的客戶數

sele lec rest uri class origin 客戶 擴展 raw 獲得訂閱者人數,可以方便地顯示觀看流的客戶數。 查看已經安裝好的模塊 /usr/local/nginx/sbin/nginx -V 安裝從源編譯Nginx和Nginx-RTMP所

windows10 vs2015編譯 帶nginx-rtmp-module 模塊的32位nginx

clone ldd program files 指定 sed log ria bz2 1 下載必要軟件 從 http://xhmikosr.1f0.de/tools/msys/下載msys:http://xhmikosr.1f0.de/tools/msys/MSYS_Mi

nginx-rtmp-module搭建流媒體服務器

復制 file ftp fault ces 只需要 record chunk inf nginx搭建流媒體服務器 進入新建的文件夾prog 1、下載nginx-rtmp-modulegit clone https://github.com/arut/nginx-rtmp-m