RTMP協議推流互動流程
阿新 • • 發佈:2020-03-05
# RTMP協議推流互動流程
[toc]
---
想了解下直播常見協議RTMP,可是看著網文,頭疼,這裡記錄下RTMP協議推流播放的互動流程,細節可以再看規範,感覺會舒服一些。
RTMP(Real Time Messaging Protocol 實時訊息傳輸協議)
RTMP是由Adobe公司提出的,在網際網路TCP/IP五層體系結構中應用層,RTMP協議是基於TCP協議的······ , 吧啦吧啦的就不看了,先只瞭解它是基於tcp且可以用來推流的一個應用層協議就行了。
## RTMP協議推流流程
然後看看它的一個推流過程
在TCP三次握手後(補個圖)
![](https://img2020.cnblogs.com/blog/1384555/202003/1384555-20200305174706720-1353055898.png)
用RTMP協議的流媒體推流還需要經過以下幾個步驟:
>**握手**(RTMP連線都是以握手作為開始)
**建立連線** (建立客戶端與伺服器之間的“網路連線”)
**建立流** (建立客戶端與伺服器之間的“網路流”)
**推流&播放**
### RTMP握手
首先服務端與客戶端需要通過3次交換報文完成握手,RTMP是由三個靜態大小的塊,而不是可變大小的塊組成的,客戶端與伺服器傳送相同的三個chunk,客戶端傳送c0,c1,c2,服務端傳送s0,s1,s2。
![](https://img2020.cnblogs.com/blog/1384555/202003/1384555-20200305174729553-1120713483.png)
>●客戶端傳送 C0,C1 塊,握手開始。
●客戶端在傳送 C2 之前客戶端必須等待接收 S1 。
●客戶端在傳送任何資料之前客戶端必須等待接收 S2。
●服務端在傳送 S0 和 S1 之前必須等待接收 C0,也可以等待接收 C1。
●服務端在傳送 S2 之前必須等待接收 C1。
●服務端在傳送任何資料之前必須等待接收 C2。
### RTMP建立連線
>●客戶端傳送命令訊息中的“連線”(connect)到伺服器,請求與一個服務應用例項建立連線。
●伺服器接收到連線命令訊息後,傳送確認視窗大小(Window Acknowledgement Size)協議訊息到客戶端,同時連線到連線命令中提到的應用程式。
●伺服器傳送設定頻寬協議(Set Peer Bandwidth)訊息到客戶端。
●客戶端處理設定頻寬協議訊息後,傳送確認視窗大小(Window Acknowledgement Size)協議訊息到伺服器端。
●伺服器傳送使用者控制訊息中的“流開始”(Stream Begin)訊息到客戶端。
●伺服器傳送命令訊息中的“結果”(_result),通知客戶端連線的狀態。
![](https://img2020.cnblogs.com/blog/1384555/202003/1384555-20200305174746702-702764465.png)
### RTMP建流&Play
>●客戶端在收到來自伺服器的建流命令(createstream)的成功結果(_result)後傳送(play)命令。
●伺服器在接收到play命令後,傳送一個來設定塊大小(SetChunkSize)訊息。
●伺服器傳送另一個使用者控制訊息,指定事件“流記錄”(StreamIsRecorded)和流ID。這個訊息的頭2位元組攜帶事件型別,最後4位元組攜帶流ID。
●伺服器傳送另一個使用者控制訊息,指定事件“流開始”(StreamBegin)。向客戶端指示流的開始。
●如果客戶端傳送的播放(play)命令成功,伺服器傳送命令訊息(onStatus),NeStream.Play.Start & NeStream.Play.Reset。
只有當客戶端傳送的play命令設定了reset標誌時,伺服器才會傳送NeStream.Play.Reset。
●如果沒有找到要播放的流,伺服器將傳送onStatus訊息NeStream.Play.StreamNotFound。
●之後,客戶端播放伺服器傳送的音訊和視訊資料
![](https://img2020.cnblogs.com/blog/1384555/202003/1384555-20200305174804667-2010908395.png)
## Wireshark抓個RTMP流
湖南衛視的RTMP流
ffplay rtmp://58.200.131.2:1935/livetv/hunantv
![](https://img2020.cnblogs.com/blog/1384555/202003/1384555-20200305174817666-1006501929.png)
拋開握手不看流程如下:
**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
...
其他關於協議細節再看看協議規範 `rtmp_specification_1.0.pdf`
參考 :`rtmp_specification_1.0.pdf`