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ù)大小⊥M牛客戶端和服務器有各自的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.