iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 14
1
Software Development

30天之即時網路影音開發攻略(小白本)系列 第 14

30-14之 RTMP 傳輸協議

黑色好看版 - 傳送門


https://ithelp.ithome.com.tw/upload/images/20181029/20089358qubqhcvKOT.png

正文開始

接下來咱們要來介紹 RTMP 協議。

RTMP 協議

本篇文章將會分成幾個章節來理解 RTMP 協議:

  • RTMP 協議是要用來完成什麼事情呢 ?
  • RTMP 協議如何完成它想做的事情呢 ?
  • 建立 RTMP 的串流傳輸流程。
  • RTMP 的特點總結。

RTMP 協議是要用來完成什麼事情呢 ?


它當初的動機為:

在 Flash 平台與伺服器進行串流媒體傳輸的協議

RTMP( Real-Time Messaging Protocol ),為 Adode 所開發,它就是要用來讓 Server 可以與 Flash 平台進行串流傳輸。

https://ithelp.ithome.com.tw/upload/images/20181029/20089358P4e1TTnNwr.png

這裡問個問題。

為什麼不要用 RTSP 來進行傳輸呢 ?

這裡我覺得有兩個原因:

  1. 因為 RTSP 大部份還是基於 RTP over UDP 上,由於當時 RTSP 大部份都用在 IPTV 或 VOD 上這些都是有專門一條線給它用,所以網路很穩定。但是 RTMP 當初是希望開發在互聯網上,所以不能保證網路很穩定,因此它選擇用 TCP 來傳輸。2. 因為想建立一個更符合 Flash 用途的協議。我猜的。

更多有支援的請參考RTMP Spec在 31、32 頁。

RTMP 協議如何完成它想做的事情呢 ?


事實上就是一樣定義一些連線標準

不過這裡有個比較特殊的東西要說明一下,那就是 RTMP 傳輸的結構,如下圖,假設你有一段聲音要進行傳遞,它會將它封裝成message,然後再實際要傳輸時,會將它分成更小的chunk。對了注意一下 message 不是只有聲音與影像這樣類型,還有一些控制或調整的類型,但這裡就不細說明了。

https://ithelp.ithome.com.tw/upload/images/20181029/20089358dYZ9bFSILu.png

分割成較小的 chunk 有個好處,這樣更能有助於調解傳輸的效率,例如假設因為某些原因導致影像的傳輸低於聲音,這時就可以自動增加影像的 chunk 傳輸量。

https://ithelp.ithome.com.tw/upload/images/20181029/20089358dQ6DyKPKWL.png

這裡咱們問個問題。

那一個 Chunk 是多大呢 ?

基本上預設為128 byte,當然這個大小可以進行調整。

那 Chunk 大一點好還是小一點好 ?

都有優缺點。

大一點的 chunk 可以節省傳輸的內容,並且減少 cpu 的計算時間(因為要計算每個 chunk 的關係),但缺點就在於越大就越不容易進行調整傳輸效率,就會有比較高的機率發生影像卡彈。

而相對的小一點的 chunk 則比較不會發生影像卡彈,但缺點在於它要傳的資訊會比較多,因為每個 chunk 都會有 header 附加額外資訊。

所以這可能要根據你所在的網路環境來進行 chunk 的大小調整。

建立 RTMP 的串流傳輸流程。


要建立 RTMP 來進行串流媒體的傳輸基本上有以下幾個步驟。接下來我們來理一下每一個步驟在做啥。

備註:

下面的封包資訊是使用 wireshake 與 ffmpeg 打 rtmp 所產的,有興趣的友人可以試試。

ffmpeg rtmp://184.72.239.149/vod/mp4:bigbuckbunny_1500.mp4

握手 (Handshake)

這階段事實上只是確認兩件事情 1. RTMP 版本 2. 網路是否正常

流程如下圖。172 為我的電腦,而 184 則為 RTMP Server 位置。

  • Client 發送 C0 + C1 Chunks 給 Server。
  • Server 回傳 S0 + S1 + S2 Chunks 給 Client。
  • Client 發送 C2 給 Client。

這裡 RMTP Spec 裡面這些 Chunk 裡面只要求帶版本號而以,其它裡面帶的都是由實作端自已決定,它沒有強制要求。

https://ithelp.ithome.com.tw/upload/images/20181029/20089358y8d4DCgzhD.png

建立網路連接

設定一些這個連接的參數

在使用 Handshake 確認可以建立連接以後,接下來就是設定一些參數,例如 Chunk 大小、頻寬大小等,如下圖 289 ~ 318。

https://ithelp.ithome.com.tw/upload/images/20181029/20089358TpgnYYpe37.png

然後就是開始傳輸資料囉。

如同下圖的 323 開始,然後你會看到每個封包裡面都多包含多個 chunk,像 323 的最左邊那寫的 audio data 與 video data 這樣。

https://ithelp.ithome.com.tw/upload/images/20181029/20089358TpgnYYpe37.png

RTMP 的特點總結


它有以下特點:

  • 基於 TCP 的雙向傳輸。
  • RTMP 串流目前只能由 Flash 播放器來播出 ( 這也代表開始不支援 Flash 的東東都無法執行 ex. 蘋果的東東,還有一些瀏覽器 ex. chrome)
  • 默認 Port 為 1935。
  • 它可以使用 AMF 與 FLV 流容器。
  • 它可以支援聲音編碼主要的為 AAC、MP3。
  • 而支援的影像編碼為 H.264。 (它好像沒支援 VPX 系列的呢)
  • 它支援推流與拉流,也就是所謂的你可以推聲音到 Server,你也可以去 Server 將聲音拉回來。 (之後會詳細說明)
  • 目前大部份的 PC 都有 Flash,但手機端就 QQ 了。
  • 它的延遲時間大約 3 ~ 5 秒或更低,如果處理的好的話,這裡的延遲的意思就是主播說話後,你大約 3 ~ 5 秒才能聽到。

參考資料



上一篇
30-13之 RTSP 傳輸協議
下一篇
30-15之 HLS 傳輸協議
系列文
30天之即時網路影音開發攻略(小白本)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言