網絡流媒體-RTMP

1、RTMP協議概述

流媒體協議概述中,我們知道rtmp協議屬於應用層協議,下層傳輸層協議使用的是TCP協議(其實還可以是UDP的,只不過我好像沒看到)。在每學習一種協議的時候,我們首先要清楚協議封裝,在我的理解中流媒體的所有協議均可看成與常見的flv,ts一樣把我們需要的數據(音視頻等)進行包裝的一種封裝格式,只不過流媒體的這種封賬用於網絡傳輸,flv,ts封裝用於本地存儲,作用不一樣而已。除此之外不同的是,流媒體不僅僅封裝用戶數據(這裏主要是音視頻數據),還封裝了控制播放等操作的控制數據

2、RTMP的封裝邏輯

rtmp屬於應用層協議,封裝邏輯其實也很簡單,以ts封裝爲例,一個ts文件裏面是有一個一個的tsPacket組成的。那麼rtmp也一樣,rtmp協議裏面把所有的數據(音視頻數據以及控制信息數據)封裝成一個一個message。

message

看到這個message header是不是特別熟悉,沒錯這就是flv中的tag header,所以說rtmp裏面實際封裝的就是flv。有一點區別的是message type 這裏不僅僅有8(音頻),9(視頻),12(meta),還包括其他的控制消息的message。因此,我們可以說message就是tag,並且一個message存放的是一幀完整的視音頻數據。

chunk:

先要清楚chunk和message有什麼關係?chunk是用來在網絡在實際傳輸的數據包,我們封裝的message可能會有很大(比如視頻數據),不利於網絡傳輸,那麼就需要把message拆分成很多個chunk包來進行網絡分發。既然拆分成chunk了,那麼每個chunk當然也有一個chunk header(包含了message header裏面的所有信息,以及自己的chunk信息)。

其實chunk十分簡單,總的來說分爲四種類型的chunk,那麼爲啥要分爲這麼多類型呢,原因在於當我們在進行網絡傳輸的時候可能會把同一幀(message)劃分爲多個chunk,比如劃分爲5個chunk,那麼這5個chunk的時間戳,流ID肯定是都是一樣的(因爲屬於同一幀數據),如果每一個chunk都帶上這些信息是不是就加重了網絡傳輸負擔了呢?因此我們定義了幾種不同的chunk,有的帶的信息比較全,有的信息量非常少(可以沿用上一個的一些信息),這樣是不是就減少傳輸負擔了呢。看個例子:

爲啥要劃分爲兩個type3的chunk,因爲沒有必要帶其他信息在第一個chunk的時候全部信息都有,右面幾個chunk直接沿用就行了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章