RTMP播放流媒體過程
- 2020 年 4 月 2 日
- 筆記
前言
RTMP協議規定,播放一個流媒體需要執行以下幾個步驟:
- 建立一個網絡連接(NetConnection),網絡連接代表RTMP服務器端和客戶端之間建立真正的網絡連接。
- 建立一個網絡流(NetStream)。網絡流代表了發送多媒體數據的通道。這是一個邏輯連接,有點像 http協義中的 session。
- 播放流。
服務器和客戶端之間只能建立一個網絡連接,但是基於該連接可以創建很多網絡流。他們的關係如圖所示:

播放網絡流
在RTMP服務器端對於每一個網絡媒體流都建立了一個狀態機,包括以下幾個狀態:
- 握手態;
- 連接態;
- 媒體流已建立態;
- 播放態;
RTMP通過命令來變更狀態機。並在每個狀態下做相應的工作。
握手(HandShake)
一個RTMP網絡流的建立是以握手開始的,雙方分別發送大小固定的三個數據塊
- 握手開始於客戶端發送C0、C1塊。服務器收到C0或C1後發送S0和S1。
- 當客戶端收齊S0和S1後,開始發送C2。當服務器收齊C0和C1後,開始發送S2。
- 當客戶端和服務器分別收到S2和C2後,握手完成。

連接(NetConnection)
- 客戶端發送命令消息「連接」(connect)到服務器。
- 服務器接收到「連接」消息後,發送確認窗口大小(Window Acknowledgement Size)消息到客戶端。
- 服務器發送「設置帶寬」消息到客戶端。
- 客戶端處理「設置帶寬」消息後,發送確認窗口大小(Window Acknowledgement Size)消息到服務器端。
- 服務器發送消息「流開始」(Stream Begin)到客戶端。
- 服務器發送消息「結果」,通知客戶端連接的狀態。

建立網絡流(NetStream)
- 客戶端發送消息「創建流」(createStream)到服務器端。
- 服務器端接收到「創建流」命令後,發送「結果」消息,通知客戶端流的狀態。

播放(Play)
- 客戶端發送消息「播放」(play)到服務器。
- 接收到「播放」消息後,服務器發送設置塊大小(ChunkSize)消息。
- 服務器發消息「streambegin」,告知客戶端流ID。
- 服務器收到"播放"消息後,發送消息「響應狀態」 NetStream.Play.Start & NetStream.Play.reset,告知客戶端「播放」命令執行成功。
- 之後,服務器發送客戶端要播放的音頻和視頻數據。

小結
以上就是 RTMP協議的播放過程。建立一個網絡流的播放就是以下這幾步。
- 握手;
- 連接;
- 建立網絡流;
- 播放;
目前,已經有很多開源庫實現了 RTMP 協議。其中比較著名的是 librtmp 庫,它是 rtmpdump 工具的一部分。
如果我們想實現簡單的音視頻直接可以直接使用 librtmp庫作為我們的流媒體傳輸庫。