視頻傳輸協議詳解(RTMP、RTSP、HLS)


這兩年網絡直播特別火,國內很多網絡直播平臺都做的風生水起,特別是熊貓直播、斗魚、花椒等。投資人為了把平臺做大做強,大把大把燒錢,搞的很多小伙伴們都很心動想跳槽去做直播。作為構建直播平臺的基礎之一 -—— 傳輸協議,我們該如何選擇呢?那么首先我們就要了解這些協議的原理及特點。

RTMP——Real Time Messaging Protocol(實時消息傳輸協議)

RTMP是由Adobe公司提出的,在互聯網TCP/IP五層體系結構中應用層,RTMP協議是基于TCP協議的,也就是說RTMP實際上是使用TCP作為傳輸協議。TCP協議在處在傳輸層,是面向連接的協議,能夠為數據的傳輸提供可靠保障,因此數據在網絡上傳輸不會出現丟包的情況。不過這種可靠的保障也會造成一些問題,也就是說前面的數據包沒有交付到目的地,后面的數據也無法進行傳輸。幸運的是,目前的網絡帶寬基本上可以滿足RTMP協議傳輸普通質量視頻的要求。

RTMP傳輸的數據的基本單元為Message,但是實際上傳輸的最小單元是Chunk(消息塊),因為RTMP協議為了提升傳輸速度,在傳輸數據的時候,會把Message拆分開來,形成更小的塊,這些塊就是Chunk。

消息(Message)的結構


消息的結構

Message結構分析

1.Message Type:它是一個消息類型的ID,通過該ID接收方可以判斷接收到的數據的類型,從而做相應的處理。Message Type ID在1-7的消息用于協議控制,這些消息一般是RTMP協議自身管理要使用的消息,用戶一般情況下無需操作其中的數據。Message Type ID為8,9的消息分別用于傳輸音頻和視頻數據。Message Type ID為15-20的消息用于發送AMF編碼的命令,負責用戶與服務器之間的交互,比如播放,暫停等。

2.Playload Length: 消息負載的長度,即音視頻相關信息的的數據長度,4個字節

3.TimeStamp:時間戳,3個字節。

4.Stream ID:消息的唯一標識。拆分消息成Chunk時添加該ID,從而在還原時根據該ID識別Chunk屬于哪個消息。

5.Message Body:消息體,承載了音視頻等信息。

消息塊(Chunk)



消息塊結構

通過上圖可以看出,消息塊在結構上與與消息類似,有Header和Body。

1.Basic Header:基本的頭部信息,在頭部信息里面包含了chunk stream ID(流通道Id,用來標識指定的通道)和chunk type(chunk的類型)。

2.Message Header:消息的頭部信息,包含了要發送的實際信息(可能是完整的,也可能是一部分)的描述信息。Message Header的格式和長度取決于Basic Header的chunk type。

3.Extended TimeStamp:擴展時間戳。

4.Chunk Data:塊數據。

RTMP在傳輸數據的時候,發送端會把需要傳輸的媒體數據封裝成消息,然后把消息拆分成消息塊,再一個一個進行傳輸。接收端收到消息塊后,根據Message Stream ID重新將消息塊進行組裝、組合成消息,再解除該消息的封裝處理就可以還原出媒體數據。由此可以看出,RTMP收發數據是以Chunk為單位,而不是以Message為單位。需要注意的是,RTMP發送Chunk必須是一個一個發送,后面的Chunk必須等前面的Chunk發送完成。

RTSP

RTSP(Real Time Streaming Protocol)是TCP/UDP協議體系中的一個應用層協議,由哥倫比亞大學, 網景和RealNetworks公司提交的IETF RFC標準.該協議定義了一對多應用程序如何有效地通過IP網絡傳輸多媒體數據。RTSP在體系結構上位于RTP和RTCP之上,它使用TCP或者RTP完成數據傳輸,目前市場上大多數采用RTP來傳輸媒體數據。

RTSP和RTP/RTCP之間是什么關系呢?下面是一個經典的流媒體傳輸流程圖


RTSP和RTP/RTCP之間的關系

一次基本的RTSP操作過程:

首先,客戶端連接到流服務器并發送一個RTSP描述命令(DESCRIBE)。

流服務器通過一個SDP描述來進行反饋,反饋信息包括流數量、媒體類型等信息。

客戶端再分析該SDP描述,并為會話中的每一個流發送一個RTSP建立命令(SETUP),RTSP建立命令告訴服務器客戶端用于接收媒體數據的端口。流媒體連接建立完成后,

客戶端發送一個播放命令(PLAY),服務器就開始在UDP上傳送媒體流(RTP包)到客戶端。 在播放過程中客戶端還可以向服務器發送命令來控制快進、快退和暫停等。

最后,客戶端可發送一個終止命令(TERADOWN)來結束流媒體會話。

由上圖可以看出,RTSP處于應用層,而RTP/RTCP處于傳輸層。RTSP負責建立以及控制會話,RTP負責多媒體數據的傳輸。而RTCP是一個實時傳輸控制協議,配合RTP做控制和流量監控。封裝發送端及接收端(主要)的統計報表。這些信息包括丟包率,接收抖動等信息。發送端根據接收端的反饋信息做響應的處理。RTP與RTCP相結合雖然保證了實時數據的傳輸,但也有自己的缺點。最顯著的是當有許多用戶一起加入會話進程的時候,由于每個參與者都周期發送RTCP信息包,導致RTCP包泛濫(flooding)。

RTSP的請求報文結構如下圖

RTSP請求報文結構

簡單的RTSP消息交互過程

C表示RTSP客戶端,S表示RTSP服務端

第一步:查詢服務器端可用方法

C->S OPTION request //詢問S有哪些方法可用

S->C OPTION response //S回應信息的public頭字段中包括提供的所有可用方法

第二步:得到媒體描述信息

C->S DESCRIBE request //要求得到S提供的媒體描述信息

S->C DESCRIBE response //S回應媒體描述信息,一般是sdp信息

第三步:建立RTSP會話

C->S SETUP request //通過Transport頭字段列出可接受的傳輸選項,請求S建立會話

S->C SETUP response //S建立會話,通過Transport頭字段返回選擇的具體轉輸選項,并返回建立的Session ID;

第四步:請求開始傳送數據

C->S PLAY request //C請求S開始發送數據

S->C PLAY response //S回應該請求的信息

第五步: 數據傳送播放中

S->C 發送流媒體數據 // 通過RTP協議傳送數據

第六步:關閉會話,退出

C->S EARDOWN request //C請求關閉會話

S->C TEARDOWN response //S回應該請求

上述的過程只是標準的、友好的rtsp流程,但實際的需求中并不一定按此過程。 其中第三和第四步是必需的!第一步,只要服務器和客戶端約定好有哪些方法可用,則option請求可以不要。第二步,如果我們有其他途徑得到媒體初始化描述信息(比如http請求等等),則我們也不需要通過rtsp中的describe請求來完成。

HLS ——?HTTP Live Streaming

HTTP Live Streaming(縮寫是HLS)是一個由蘋果公司提出的基于Http協議的的流媒體網絡傳輸協議。是蘋果公司QuickTime XiPhone軟件系統的一部分。它的工作原理是把整個流分成一個個小的基于HTTP的文件來下載,每次只下載一些。當媒體流正在播放時,客戶端可以選擇從許多不同的備用源中以不同的速率下載同樣的資源,允許流媒體會話適應不同的數據速率。在開始一個流媒體會話時,客戶端會下載一個包含元數據的extended M3U (m3u8)playlist文件,用于尋找可用的媒體流。

HLS協議的優點:

1.跨平臺性:支持iOS/Android/瀏覽器,通用性強。

2.穿墻能力強:由于HLS是基于HTTP協議的,因此HTTP數據能夠穿透的防火墻或者代理服務器HLS都可以做到,基本不會遇到被防火墻屏蔽的情況。

3.切換碼率快(清晰度):自帶多碼率自適應,客戶端可以選擇從許多不同的備用源中以不同的速率下載同樣的資源,允許流媒體會話適應不同的數據速率。客戶端可以很快的選擇和切換碼率,以適應不同帶寬條件下的播放。

3.負載均衡:HLS基于無狀態協議(HTTP),客戶端只是按照順序使用下載存儲在服務器的普通TS文件,做負責均衡如同普通的HTTP文件服務器的負載均衡一樣簡單。

HLS的缺點:

1.實時性差:蘋果官方建議是請求到3個片之后才開始播放。所以一般很少用HLS做為互聯網直播的傳輸協議。假設列表里面的包含5個 ts 文件,每個 TS 文件包含5秒的視頻內容,那么整體的延遲就是25秒。蘋果官方推薦的ts時長時10s,所以這樣就會大改有30s(n x 10)的延遲。

2.文件碎片化嚴重:對于點播服務來說, 由于 TS 切片通常較小, 海量碎片在文件分發, 一致性緩存, 存儲等方面都有較大挑戰.

HLS協議由三部分組成:HTTP+M3U8+TS

HTTP:傳輸協議

M3U8:索引文件

TS:音視頻媒體信息,視頻的編碼格式為H.264,音頻格式為AAC。

HLS的工作原理:


HLS工作原理圖

1.填入請求m3u8的url,通過http請求。

2.sever返回一個m3u8的播放列表,該列表包含了5段數據的url。

3.客戶端解析m3u8播放列表后,按順序的拿每一段數據的url去獲取ts流。


流程圖

HLS如何切片問題

Media encoder將視頻源中的視頻數據轉碼到目標編碼格式(H264)的視頻數據,之后,在stream segmenter模塊將視頻切片。切片的結果就是index file(m3u8)和ts文件,如上圖。

參考文獻:

維基百科

RTSP協議詳解

流媒體傳輸協議系列之--RTSP協議詳解

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容