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庫作為我們的流媒體傳輸庫。