RTMP播放流媒體過程

前言

RTMP協議規定,播放一個流媒體需要執行以下幾個步驟:

  • 建立一個網路連接(NetConnection),網路連接代表RTMP伺服器端和客戶端之間建立真正的網路連接。
  • 建立一個網路流(NetStream)。網路流代表了發送多媒體數據的通道。這是一個邏輯連接,有點像 http協義中的 session。
  • 播放流。

伺服器和客戶端之間只能建立一個網路連接,但是基於該連接可以創建很多網路流。他們的關係如圖所示:

播放網路流

在RTMP伺服器端對於每一個網路媒體流都建立了一個狀態機,包括以下幾個狀態:

  • 握手態;
  • 連接態;
  • 媒體流已建立態;
  • 播放態;

RTMP通過命令來變更狀態機。並在每個狀態下做相應的工作。

握手(HandShake)

一個RTMP網路流的建立是以握手開始的,雙方分別發送大小固定的三個數據塊

  1. 握手開始於客戶端發送C0、C1塊。伺服器收到C0或C1後發送S0和S1。
  2. 當客戶端收齊S0和S1後,開始發送C2。當伺服器收齊C0和C1後,開始發送S2。
  3. 當客戶端和伺服器分別收到S2和C2後,握手完成。

連接(NetConnection)

  1. 客戶端發送命令消息「連接」(connect)到伺服器。
  2. 伺服器接收到「連接」消息後,發送確認窗口大小(Window Acknowledgement Size)消息到客戶端。
  3. 伺服器發送「設置頻寬」消息到客戶端。
  4. 客戶端處理「設置頻寬」消息後,發送確認窗口大小(Window Acknowledgement Size)消息到伺服器端。
  5. 伺服器發送消息「流開始」(Stream Begin)到客戶端。
  6. 伺服器發送消息「結果」,通知客戶端連接的狀態。

建立網路流(NetStream)

  1. 客戶端發送消息「創建流」(createStream)到伺服器端。
  2. 伺服器端接收到「創建流」命令後,發送「結果」消息,通知客戶端流的狀態。

播放(Play)

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

小結

以上就是 RTMP協議的播放過程。建立一個網路流的播放就是以下這幾步。

  • 握手;
  • 連接;
  • 建立網路流;
  • 播放;

目前,已經有很多開源庫實現了 RTMP 協議。其中比較著名的是 librtmp 庫,它是 rtmpdump 工具的一部分。

如果我們想實現簡單的音影片直接可以直接使用 librtmp庫作為我們的流媒體傳輸庫。