基於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是拉流會話;
- 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編譯方法,思路是一致的,只是
nginx與nginx-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