nginx-rtmp模塊簡(jiǎn)介

nginx模塊概述

1:??Module Configuration Struct(s)模塊配置結(jié)構(gòu)

這個(gè)結(jié)構(gòu)的命名規(guī)則為ngx_http_[module-name]_[main|srv|loc]_conf_t仰猖。

main,srv,loc表示這個(gè)模塊的作用范圍是配置文件中的main/server/location三種范圍(這個(gè)需要記住邢隧,后面會(huì)經(jīng)常用到)


2: Module Directives模塊命令結(jié)構(gòu)

static?ngx_command_t ngx_http_echo_commands[] = {

{

ngx_string("echo"), //命令名字

NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, //代表是local配置群发,帶一個(gè)參數(shù)

ngx_http_echo, //組裝模塊配置結(jié)構(gòu)

NGX_HTTP_LOC_CONF_OFFSET, //上面的組裝模塊配置獲取完參數(shù)后存放到 哪里领虹?使用這個(gè)和下面的offset參數(shù)來進(jìn)行定位

offsetof(ngx_http_echo_loc_conf_t, ed), //同上?

},

ngx_null_command //必須使用ngx_null_command作為commands的結(jié)束標(biāo)記

};


3: The Module Context模塊內(nèi)容

static ngx_http_module_t???ngx_http_circle_gif_module_ctx

主要是定義了一些鉤子函數(shù), nginx會(huì)在不同時(shí)期會(huì)調(diào)用


4: The Module Definition模塊整合

ngx_module_t ngx_http_<module name>_module = {

NGX_MODULE_V1,

&ngx_http__module_ctx, /* module context模塊內(nèi)容 */

ngx_http__commands, /* module directives模塊命令*/

NGX_HTTP_MODULE, /* module type模塊類型,HTTP模塊揍移,或者HTTPS*/

5: Module Installation模塊安裝

nginx-rtmp的兩個(gè)核心模塊

1: ngx_rtmp_live_module

直播模塊:推拉流同點(diǎn), 不涉及回源

2: ngx_rtmp_relay_module

中繼模塊: ?1:回源pull ?2: 轉(zhuǎn)推: push

nginx-rtmp的總體流程分析

一:? 建立rtmp連接, 需要握手

??????1: ngx_rtmp_handshake_recv()開始握手

? ? ? 2: NGX_RTMP_HANDSHAKE_DONE()握手完成

? ? ? 3: ngx_rtmp_cycle()重新設(shè)置讀寫handler

二:? 建立網(wǎng)絡(luò)連接

????建立rtmp連接之后, ngx_rtmp_recv函數(shù)會(huì)利用ngx_event_t結(jié)構(gòu)會(huì)獲取推送過來的原始數(shù)據(jù), 接受到的數(shù)據(jù)會(huì)存放到ngx_rtmp_stream_t的in鏈表結(jié)構(gòu)中.

1:接受chunk數(shù)據(jù)

2:分析處理chunk數(shù)據(jù), 如果message還沒接受完, 繼續(xù)接受數(shù)據(jù)

3:將chunk組成一個(gè)rtmp message, 然后交給ngx_rtmp_receive_message處理, 這個(gè)函數(shù)根據(jù)消息的類型找對(duì)應(yīng)的handle

三:? 建立網(wǎng)絡(luò)流

????????在建立網(wǎng)絡(luò)連接后,就需要建立網(wǎng)絡(luò)流了, 網(wǎng)絡(luò)流代表了發(fā)送多媒體數(shù)據(jù)的通道. 服務(wù)器和客戶端只能建立一個(gè)網(wǎng)絡(luò)連接, 且多個(gè)網(wǎng)絡(luò)流可以復(fù)用這一個(gè)網(wǎng)絡(luò)連接

1: ngx_rtmp_recv接受數(shù)據(jù)后交給ngx_rtmp_receive_handler, 它會(huì)根據(jù)類型區(qū)別處理, 此時(shí)客戶端發(fā)送ngx_rtmp_msg_chunk_size類型的消息

2:接受message后跳轉(zhuǎn)到處理函數(shù)ngx_rtmp_amf_message_handler. 處理客戶端發(fā)送的amf控制消息. 此時(shí)連續(xù)接受3個(gè)amf數(shù)據(jù).

3:調(diào)用ngx_rtmp_cmd_create_stream_init初始化網(wǎng)絡(luò)流. 利用ngx_rtmp_receive_amf獲取接受的amf數(shù)據(jù).

4:調(diào)用ngx_rtmp_cmd_create_stream創(chuàng)建網(wǎng)絡(luò)流, 利用ngx_rtmp_send_amf向客戶端發(fā)送amf控制消息

四:? 傳輸媒體數(shù)據(jù)

在客戶端和服務(wù)端建立網(wǎng)絡(luò)流之后,接下來就可以傳輸媒體數(shù)據(jù)了, 一般來講, 媒體數(shù)據(jù)分為兩部分, 一部分為meta元信息, 另一部分是音視頻數(shù)據(jù), 首先傳送的是meta元信息. 然后推送媒體. 服務(wù)器處理如下:

1:從客戶端接受amf命令信息, 然后服務(wù)端會(huì)利用ngx_rtmp_cmd_publish_init來初始化發(fā)布環(huán)境. ?函數(shù)功能: 會(huì)讀取剛接受端amf信息

2:利用ngx_rtmp_auto_push_publish, ngx_rtmp_notify_publish, ngx_rtmp_exec_publish建立發(fā)布環(huán)境,

3:如果conf配置了record命令記錄媒體文件, 此時(shí)會(huì)調(diào)用ngx_rtmp_record_publish來初始化記錄環(huán)境;

4:執(zhí)行ngx_rtmp_access_publish;

[if !supportLists]l?[endif]meta信息:

5:接受客戶端amf, 并調(diào)用ngx_rtmp_codec_meta_data獲取meta元信息;

6:結(jié)合服務(wù)器的參數(shù), 利用ngx_rtmp_codec_reconstruct_meta接口重構(gòu)meta元信息, 并調(diào)用ngx_rtmp_prepare_message組成消息保存

[if !supportLists]l?[endif]媒體數(shù)據(jù):

7:接受客戶端推送, 根據(jù)類型轉(zhuǎn)到ngx_rtmp_codec_av來處理音視頻數(shù)據(jù); 其中利用函數(shù)ngx_rtmp_codec_parse_avc_header來處理頭部信息

8:調(diào)用record模塊記錄數(shù)據(jù), 接口為ngx_rtmp_codec_av;

9:調(diào)用live模塊來廣播發(fā)布數(shù)據(jù), 接口為ngx_rtmp_live_av, 廣播到所有觀察者, 第一次調(diào)用接口ngx_rtmp_live_start創(chuàng)建廣播, 之后直接調(diào)用ngx_rtmp_append_shared-bufs

?

rtmp信令交互圖:

ngx_rtmp_relay_module: pull模型分析

1:?播放器端發(fā)起play

2: ngx_rtmp_relay_play()

3: ngx_rtmp_relay_pull() --主要建立pull請(qǐng)求, 將遠(yuǎn)程拉流的上下文和本地上下文放到鏈表中

????ngx_rtmp_relay_create_local_ctx()創(chuàng)建本地上下文

????ngx_rtmp_relay_create_remote_ctx()創(chuàng)建遠(yuǎn)端上下文

4: ngx_rtmp_relay_create_remote_ctx詳解: ?創(chuàng)建遠(yuǎn)端session, 開始rtmp信令交互

? ? ? ?1: ngx_rtmp_relay_create_connection ?

????????2: ngx_rtmp_init_session

注意:此時(shí)session中的flashver為“ngx-local-relay“

5: rtmp信令交互流程

核心函數(shù): ngx_rtmp_relay_on_result主要用來接收對(duì)端服務(wù)端發(fā)送的amf消息包只损,而后按正常rtmp協(xié)議請(qǐng)求進(jìn)行下一步交互,這個(gè)主要是當(dāng)前服務(wù)端做為客戶端發(fā)起遠(yuǎn)程rtmp請(qǐng)求流程

例如:? ?ngx_rtmp_client_handshake(發(fā)起握手)

? ? ? ? ?握手完成后調(diào)用回調(diào)函數(shù): ngx_rtmp_relay_handshake_done

? ? ? ?ngx_rtmp_relay_send_connect:發(fā)起連接請(qǐng)求, 接著參考rtmp信令交互圖

ngx_rtmp_live_module模塊簡(jiǎn)介

????????核心功能:向nginx推送一個(gè)直播流包各,該直播流經(jīng) nginx-rtmp 的 ngx_rtmp_live_module 模塊轉(zhuǎn)發(fā)給 application live 應(yīng)用摘仅,然后使用vlc連接 live,播放該直播流问畅。本質(zhì)上就是1對(duì)多的廣播

開啟debug日志

參考:http://nginx.org/en/docs/debugging_log.html

nginx-rtmp資料

1: Nginx-rtmp-module模塊源碼學(xué)習(xí)

https://blog.evanxia.com/2017/02/1264

2: nginx_rtmp_relay_module模塊解讀

https://www.shangmayuan.com/a/d74b78669f804fb5b12cae5a.html

3:開發(fā)手冊(cè)中文版:包含指令介紹

https://blog.csdn.net/ai2000ai/article/details/55517992

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末娃属,一起剝皮案震驚了整個(gè)濱河市六荒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌矾端,老刑警劉巖掏击,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異秩铆,居然都是意外死亡砚亭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門殴玛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捅膘,“玉大人,你說我怎么就攤上這事滚粟÷耍” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵坦刀,是天一觀的道長(zhǎng)愧沟。 經(jīng)常有香客問我,道長(zhǎng)鲤遥,這世上最難降的妖魔是什么沐寺? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮盖奈,結(jié)果婚禮上混坞,老公的妹妹穿的比我還像新娘。我一直安慰自己钢坦,他們只是感情好究孕,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著爹凹,像睡著了一般厨诸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上禾酱,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天微酬,我揣著相機(jī)與錄音,去河邊找鬼颤陶。 笑死颗管,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的滓走。 我是一名探鬼主播垦江,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼搅方!你這毒婦竟也來了比吭?” 一聲冷哼從身側(cè)響起茬斧,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梗逮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绣溜,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡慷彤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怖喻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片底哗。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖锚沸,靈堂內(nèi)的尸體忽然破棺而出跋选,到底是詐尸還是另有隱情,我是刑警寧澤哗蜈,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布前标,位于F島的核電站,受9級(jí)特大地震影響距潘,放射性物質(zhì)發(fā)生泄漏炼列。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一音比、第九天 我趴在偏房一處隱蔽的房頂上張望俭尖。 院中可真熱鬧,春花似錦洞翩、人聲如沸稽犁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽已亥。三九已至,卻和暖如春来屠,著一層夾襖步出監(jiān)牢的瞬間陷猫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來泰國打工的妖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绣檬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓嫂粟,卻偏偏與公主長(zhǎng)得像娇未,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子星虹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359