RTMP 筆記

RTMP握手過程目的:
1.檢驗客戶端和服務器端RTMP協(xié)議版本號
2.發(fā)了一堆數(shù)據(jù),測試網(wǎng)絡環(huán)境

RTMP分塊

創(chuàng)建RTMP連接比較復雜,涉及消息分塊chunk和AFM格式數(shù)據(jù)

Chunk Size

RTMP是按照chunk size進行分塊,chunk size指chunk的實際數(shù)據(jù)大小。客戶端和服務器有各自的chunk size,默認chunk size 128字節(jié)。通過命令:set chunk size來更改chunk size大小
在實際代碼中,會把chunk size設置很大,如:4096,F(xiàn)FMPEG推流時候設置60*1000,這樣設置好處避免頻繁拆包組包,占用CPU;設置過大,如果包發(fā)送,丟失,播放器就會出現(xiàn)花屏或黑屏現(xiàn)象

Chunk Type

RTMP分成Chunk4種類型:由chunk basic header 高兩位指定。
在拆包時候會把一條RTMP消息拆成Type_0類型開始的chunk,之后的包拆成Type_3類型的chunk。
RTMP中message分chunk

RTMP消息
推流

Connect消息

握手之后先發(fā)送一個connect命令消息,真實通信中要指定一些編解碼的信息,這些信息是AMF格式發(fā)送
發(fā)送完connect命令之后,會發(fā)送一個set chunk size消息來設置chunk size的大小,也可以不發(fā)。
然后等待服務器對于connect的回應,一半是服務器返回chunk都讀完組成完整的RTMP消息,進行下一步。

Create Stream消息

創(chuàng)建完RTMP連接之后創(chuàng)建RTMP流,客戶端要向服務器發(fā)送一個releaseStream命令消息,之后是FCPbulish命令消息,在之后是createStream命令消息。當發(fā)送完createStream消息之后,解析服務器返回的消息會得到一個stream ID,這個ID也就是以后和服務器通信的message stream ID,一般返回的是1

Publish Stream

推流準備工作的最后一步是Publish Stream,就是向服務器發(fā)送一個publish命令,這個命令的message stream ID就是上面create stream之后服務器返回的stream ID,發(fā)完這個命令一般不用等待服務器返回的回應,直接下一步發(fā)送音視頻數(shù)據(jù)。有些rtmp庫還會發(fā)setMetaData消息,這個消息可以發(fā)液可以不發(fā),里面包含一些音視頻編碼的消息

發(fā)布音視頻

當以上工作都完成,就可以發(fā)送音視頻了。音視頻RTMP消息的都是按照flv-tag格式封的音視頻包

關于RTMP的時間戳

RTMP時間戳在發(fā)送音視頻之前都為0,開始發(fā)送音視頻消息的時候保證時間戳是單增的就可以正常播放音視頻。

關于Chunk Stream ID

RTMP的chunk stream ID是用來區(qū)分某一個chunk是屬于哪一個message的,0和1是保留的。每次發(fā)送一個不同類型的RTMP消息時都要有不同的chunk stream id.

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容