想了解下直播常見(jiàn)協(xié)議RTMP,可是看著網(wǎng)文,頭疼,這里記錄下RTMP協(xié)議推流播放的交互流程,細(xì)節(jié)可以再看規(guī)范,感覺(jué)會(huì)舒服一些。
RTMP(Real Time Messaging Protocol 實(shí)時(shí)消息傳輸協(xié)議)
RTMP是由Adobe公司提出的,在互聯(lián)網(wǎng)TCP/IP五層體系結(jié)構(gòu)中應(yīng)用層,RTMP協(xié)議是基于TCP協(xié)議的······ , 吧啦吧啦的就不看了,先只了解它是基于tcp且可以用來(lái)推流的一個(gè)應(yīng)用層協(xié)議就行了。
RTMP協(xié)議推流流程
然后看看它的一個(gè)推流過(guò)程
在TCP三次握手后(補(bǔ)個(gè)圖)

用RTMP協(xié)議的流媒體推流還需要經(jīng)過(guò)以下幾個(gè)步驟:
握手(RTMP連接都是以握手作為開(kāi)始)
建立連接(建立客戶(hù)端與服務(wù)器之間的“網(wǎng)絡(luò)連接”)
建立流(建立客戶(hù)端與服務(wù)器之間的“網(wǎng)絡(luò)流”)
推流&播放
RTMP握手
首先服務(wù)端與客戶(hù)端需要通過(guò)3次交換報(bào)文完成握手,RTMP是由三個(gè)靜態(tài)大小的塊,而不是可變大小的塊組成的,客戶(hù)端與服務(wù)器發(fā)送相同的三個(gè)chunk,客戶(hù)端發(fā)送c0,c1,c2,服務(wù)端發(fā)送s0,s1,s2。

●客戶(hù)端發(fā)送 C0,C1 塊,握手開(kāi)始。
●客戶(hù)端在發(fā)送 C2 之前客戶(hù)端必須等待接收 S1 。
●客戶(hù)端在發(fā)送任何數(shù)據(jù)之前客戶(hù)端必須等待接收 S2。
●服務(wù)端在發(fā)送 S0 和 S1 之前必須等待接收 C0,也可以等待接收 C1。
●服務(wù)端在發(fā)送 S2 之前必須等待接收 C1。
●服務(wù)端在發(fā)送任何數(shù)據(jù)之前必須等待接收 C2。
RTMP建立連接
●客戶(hù)端發(fā)送命令消息中的“連接”(connect)到服務(wù)器,請(qǐng)求與一個(gè)服務(wù)應(yīng)用實(shí)例建立連接。
●服務(wù)器接收到連接命令消息后,發(fā)送確認(rèn)窗口大小(Window Acknowledgement Size)協(xié)議消息到客戶(hù)端,同時(shí)連接到連接命令中提到的應(yīng)用程序。
●服務(wù)器發(fā)送設(shè)置帶寬協(xié)議(Set Peer Bandwidth)消息到客戶(hù)端。
●客戶(hù)端處理設(shè)置帶寬協(xié)議消息后,發(fā)送確認(rèn)窗口大小(Window Acknowledgement Size)協(xié)議消息到服務(wù)器端。
●服務(wù)器發(fā)送用戶(hù)控制消息中的“流開(kāi)始”(Stream Begin)消息到客戶(hù)端。
●服務(wù)器發(fā)送命令消息中的“結(jié)果”(_result),通知客戶(hù)端連接的狀態(tài)。

RTMP建流&Play
●客戶(hù)端在收到來(lái)自服務(wù)器的建流命令(createstream)的成功結(jié)果(_result)后發(fā)送(play)命令。
●服務(wù)器在接收到play命令后,發(fā)送一個(gè)來(lái)設(shè)置塊大小(SetChunkSize)消息。
●服務(wù)器發(fā)送另一個(gè)用戶(hù)控制消息,指定事件“流記錄”(StreamIsRecorded)和流ID。這個(gè)消息的頭2字節(jié)攜帶事件類(lèi)型,最后4字節(jié)攜帶流ID。
●服務(wù)器發(fā)送另一個(gè)用戶(hù)控制消息,指定事件“流開(kāi)始”(StreamBegin)。向客戶(hù)端指示流的開(kāi)始。
●如果客戶(hù)端發(fā)送的播放(play)命令成功,服務(wù)器發(fā)送命令消息(onStatus),NeStream.Play.Start & NeStream.Play.Reset。
只有當(dāng)客戶(hù)端發(fā)送的play命令設(shè)置了reset標(biāo)志時(shí),服務(wù)器才會(huì)發(fā)送NeStream.Play.Reset。
●如果沒(méi)有找到要播放的流,服務(wù)器將發(fā)送onStatus消息NeStream.Play.StreamNotFound。
●之后,客戶(hù)端播放服務(wù)器發(fā)送的音頻和視頻數(shù)據(jù)

Wireshark抓個(gè)RTMP流
湖南衛(wèi)視的RTMP流
ffplay rtmp://58.200.131.2:1935/livetv/hunantv

拋開(kāi)握手不看流程如下:
Client :
connect('livetv')
Server :
Window Acknowledgement Size 5000000 Set Peer Bandwidth 5000000,Dynamic Set Chunk Size 4096 _result('NetConnection.Connect.Success')
Client :
Window Acknowledgement Size 5000000 createStream()
Server :
_result()
Client :
getStreamLength() play('hunantv') Set Buffer Length 1,3000ms
Server :
Stream Begin 1 onStatus('NetStream.Play.Start') RtmpSampleAccess() onMetaData()
Server :
Video Data Audio Data ...
其他關(guān)于協(xié)議細(xì)節(jié)再看看協(xié)議規(guī)范 rtmp_specification_1.0.pdf
參考 : rtmp_specification_1.0.pdf