接下來咱們要來介紹 RTMP 協議。
RTMP 協議
本篇文章將會分成幾個章節來理解 RTMP 協議:
它當初的動機為:
在 Flash 平台與伺服器進行串流媒體傳輸的協議
RTMP( Real-Time Messaging Protocol ),為 Adode 所開發,它就是要用來讓 Server 可以與 Flash 平台進行串流傳輸。
這裡問個問題。
這裡我覺得有兩個原因:
更多有支援的請參考RTMP Spec在 31、32 頁。
事實上就是一樣定義一些連線標準
不過這裡有個比較特殊的東西要說明一下,那就是 RTMP 傳輸的結構,如下圖,假設你有一段聲音要進行傳遞,它會將它封裝成message
,然後再實際要傳輸時,會將它分成更小的chunk
。對了注意一下 message 不是只有聲音與影像這樣類型,還有一些控制或調整的類型,但這裡就不細說明了。
分割成較小的 chunk 有個好處,這樣更能有助於調解傳輸的效率,例如假設因為某些原因導致影像的傳輸低於聲音,這時就可以自動增加影像的 chunk 傳輸量。
這裡咱們問個問題。
基本上預設為128 byte
,當然這個大小可以進行調整。
都有優缺點。
大一點的 chunk 可以節省傳輸的內容,並且減少 cpu 的計算時間(因為要計算每個 chunk 的關係),但缺點就在於越大就越不容易進行調整傳輸效率,就會有比較高的機率發生影像卡彈。
而相對的小一點的 chunk 則比較不會發生影像卡彈,但缺點在於它要傳的資訊會比較多,因為每個 chunk 都會有 header 附加額外資訊。
所以這可能要根據你所在的網路環境來進行 chunk 的大小調整。
要建立 RTMP 來進行串流媒體的傳輸基本上有以下幾個步驟。接下來我們來理一下每一個步驟在做啥。
備註:
下面的封包資訊是使用 wireshake 與 ffmpeg 打 rtmp 所產的,有興趣的友人可以試試。
ffmpeg rtmp://184.72.239.149/vod/mp4:bigbuckbunny_1500.mp4
這階段事實上只是確認兩件事情 1. RTMP 版本 2. 網路是否正常
流程如下圖。172 為我的電腦,而 184 則為 RTMP Server 位置。
這裡 RMTP Spec 裡面這些 Chunk 裡面只要求帶版本號而以,其它裡面帶的都是由實作端自已決定,它沒有強制要求。
設定一些這個連接的參數
在使用 Handshake 確認可以建立連接以後,接下來就是設定一些參數,例如 Chunk 大小、頻寬大小等,如下圖 289 ~ 318。
如同下圖的 323 開始,然後你會看到每個封包裡面都多包含多個 chunk,像 323 的最左邊那寫的 audio data 與 video data 這樣。
它有以下特點: