【速成】RTMP - 協(xié)議詳解 推流過程

推流過程

1 握手過程
    1. 建立tcp連接飞蛹,發(fā)送 C0, C1 消息
      C0:1字節(jié)纸俭,整數(shù)吧趣,請求使用的RTMP版本(基本就是版本3)
      C1:1536字節(jié)和悦,時間戳(4字節(jié)) + 全零(4字節(jié)) + 隨機(jī)數(shù)(1528字節(jié))仁热,基本沒什么用榜揖,按要求生成就行


      發(fā)送 C0, C1
    1. 等待 S0, S1 消息
      服務(wù)端生成并返回 S0, S1 消息勾哩,規(guī)則與 C1, S1 相同

收到 S0, S1

(備注:截圖中,全零4字節(jié)并沒有按要求設(shè)置举哟,因?yàn)檫@個無關(guān)緊要思劳,基本不會檢查這個要求)

    1. 發(fā)送 C2 消息
      C2: 1536字節(jié),S1的時間戳(4字節(jié)) + 接收時間戳(4字節(jié)) + S1的隨機(jī)數(shù)


      發(fā)送 C2
    1. 等待 S2 消息
      生成規(guī)則與 C2 相同
      收到 S2

      (備注:截圖中妨猩,其實(shí)S0S1S2是同時收到的潜叛,服務(wù)端收到C1后,直接發(fā)送S0S1S2壶硅,這是最簡單直接的方式)
    1. 握手完成
      服務(wù)端也是類似的流程
      (refs: https://rtmp.veriskope.com/docs/spec/#525handshake-diagram)
2. 發(fā)送推流相關(guān)命令
    1. connect('live')
      連接到 live 這個 app(此處假設(shè)推流地址為 rtmp://127.0.0.1/live/stream)威兜。
      命令使用 MessagePacket 的方式發(fā)送,MessagePacket 會拆分為若干個 ChunkPacket 發(fā)送庐椒,當(dāng)接收方收到 MessageHeader 里面給出的 MessageLength 大小的數(shù)據(jù)后椒舵,就可以拼裝一個完整的 MessagePacket。
      ChunkPacket

      MessageHeader

命令數(shù)據(jù)格式:
BasicHeader(1/2/3B) + MessageHeader(0/3/7/11B) + Ts(0/4B) +
AMF0/AMF3
BasicHeader:
Fmt(2bits) + ChunkStreamID(6bits)
Fmt決定 MessageHeader 使用 0/3/7/11 中的一種格式
Fmt: 0 使用11字節(jié)格式
Fmt: 1 使用7字節(jié)格式约谈,以此類推
AMF命令格式:
命令名稱(String) + 事務(wù)ID(Number) + 參數(shù)(Object)
AMF0格式:數(shù)據(jù)類型(1B) + 數(shù)據(jù)
(amf0 refs: https://rtmp.veriskope.com/pdf/amf0-file-format-specification.pdf)
(amf3 refs: https://rtmp.veriskope.com/pdf/amf3-file-format-spec.pdf)

connect command packet

(注:截圖中笔宿,transactionID:1 中,第一個字節(jié)(0x00)表示這個是 amf0 number棱诱,后面的字節(jié)(0x3ff0...)是浮點(diǎn)數(shù)1的內(nèi)存數(shù)據(jù))

3. 發(fā)送數(shù)據(jù)

數(shù)據(jù)也是跟命令一樣使用 MessagePacket ChunkPacket 的方式發(fā)送。MessageHeader 里設(shè)置 MessageTypeID 為 9 則表示這個是視頻數(shù)據(jù)迈勋。
其他 MessageTypeID :

0x01 = Set Packet Size Message.
0x02 = Abort.
0x03 = Acknowledge.
0x04 = Control Message.
0x05 = Server Bandwidth
0x06 = Client Bandwidth.
0x07 = Virtual Control.
0x08 = Audio Packet.
0x09 = Video Packet.
0x0F = Data Extended.
0x10 = Container Extended.
0x11 = Command Extended (An AMF3 type command).
0x12 = Data (Invoke (onMetaData info is sent as such)).
0x13 = Container.
0x14 = Command (An AMF0 type command).
0x15 = UDP
0x16 = Aggregate
0x17 = Present

數(shù)據(jù)格式:
BasicHeader + MessageHeader + VIDEODATA/AUDIODATA
在RTMP里面炬灭,音視頻數(shù)據(jù)使用 flv10.1里面定義的VIDEODATA/AUDIODATA格式
VIDEODATA格式:
FrameType(4bits) + CodecID(4bits) + AVCPacketType(1B) + CTS(3B) + Data(seq/AVCNaluData)

FrameType: key(1), inter(2) 等
CodecID: avc(7) 等
AVCPacketType: seq header(0), nalu(1), end(2)

(refs: https://rtmp.veriskope.com/pdf/video_file_format_spec_v10_1.pdf - page78 )
AUDIODATA格式:
SoundFormat(4bits) + SoundRate(2bits) + SoundSize(1bit) + SoundType(1bit) + AACPacketType(1B) + Data(seq/AACData)

SoundFormat: MP3(2), AAC(10), SPEEX(11) 等
SoundRate: 5.5kHz(0), 11kHz(1), 22kHz(2), 44kHz(3)
SoundSize: 8位(0), 16位(1)
SoundType: MONO(0), STEREO(1)
AACPacketType: seq header(0), raw(1)

(refs: https://rtmp.veriskope.com/pdf/video_file_format_spec_v10_1.pdf - page76 )

Video Data Packet

4. 停止推流

斷開 tcp 連接,服務(wù)端判定為停止推流

播放過程與推流類似

相關(guān)資料

https://blog.csdn.net/u013637931/article/details/108318996 - RTMP協(xié)議文檔中文
https://rtmp.veriskope.com/docs/spec/ - RTMP協(xié)議文檔英文
https://community.adobe.com/t5/media-server-discussions/fms-is-there-some-secret-reference-i-don-t-know-about/m-p/4273450 - 關(guān)于 releaseStream/FCPublish
https://en.wikipedia.org/wiki/Real-Time_Messaging_Protocol - wikipedia rtmp protocol

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粪躬,一起剝皮案震驚了整個濱河市担败,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌镰官,老刑警劉巖提前,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泳唠,居然都是意外死亡狈网,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門笨腥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拓哺,“玉大人,你說我怎么就攤上這事脖母∈颗福” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵谆级,是天一觀的道長烤礁。 經(jīng)常有香客問我讼积,道長,這世上最難降的妖魔是什么脚仔? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任勤众,我火速辦了婚禮,結(jié)果婚禮上鲤脏,老公的妹妹穿的比我還像新娘们颜。我一直安慰自己,他們只是感情好猎醇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布窥突。 她就那樣靜靜地躺著,像睡著了一般硫嘶。 火紅的嫁衣襯著肌膚如雪波岛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天音半,我揣著相機(jī)與錄音,去河邊找鬼贡蓖。 笑死曹鸠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斥铺。 我是一名探鬼主播彻桃,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晾蜘!你這毒婦竟也來了邻眷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤剔交,失蹤者是張志新(化名)和其女友劉穎肆饶,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岖常,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驯镊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了竭鞍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片板惑。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖偎快,靈堂內(nèi)的尸體忽然破棺而出冯乘,到底是詐尸還是另有隱情,我是刑警寧澤晒夹,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布裆馒,位于F島的核電站姊氓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏领追。R本人自食惡果不足惜他膳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绒窑。 院中可真熱鬧棕孙,春花似錦、人聲如沸些膨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽订雾。三九已至肢预,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間洼哎,已是汗流浹背烫映。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留噩峦,地道東北人锭沟。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像识补,于是被迫代替她去往敵國和親族淮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

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