H5直播系列四 RTMP HTTP-FLV HLS MPEG-DASH

2021-02-25 李才哥

參考

【騰訊Bugly乾貨分享】從0到1打造直播 App從入門到出家:流媒體協議—FLVH5直播起航全面進階 H5 直播HTML5 視頻直播(一)HLS 和 RTMPHTML5 視頻直播(二)Web Sockets+CanvasHTML5 視頻直播(三)WebRTC直播伺服器簡單實現 http_flv和hls 內網直播桌面RTMP、RTSP、HTTP視頻協議詳解(附:直播流地址、播放軟體)帶你吃透RTMP[總結]RTMP流媒體技術零基礎學習方法直播雲解決方案整理直播未來屬於RTMP還是HTTP?

Paste_Image.png

一、HLS

HLS (HTTP Live Streaming), 是由 Apple 公司實現的基於 HTTP 的媒體流傳輸協議。Apple 的全系列產品支持,由於 HLS 是蘋果提出的, 所以在 Apple 的全系列產品包括 iphone、 ipad、safari 都不需要安裝任何插件就可以原生支持播放 HLS, 現在Android 也加入了對 HLS 的支持。但PC端目前除了Microsoft Edge外,Chrome、Firefox等瀏覽器均不支持該協議的播放。可直接採用網上一些比較成熟的方案,如:sewise-player、MediaElement、videojs-contrib-hls、jwplayer。

對於支持 HLS 的瀏覽器來說,直接這樣寫就能播放了:

<videocontrolsautoplay> <sourcesrc="http://live.hkstv.hk.lxdns.com/live/hks/playlist.m3u8"type="application/vnd.apple.mpegurl"/> <pclass="warning">Your browser does not support HTML5 video.</p> </video>

以上測試地址參考

m3u8直播測試地址

,或者

APPLE提供測試地址

HLS 的基本原理就是當採集推流端將視頻流推送到流媒體伺服器時,伺服器將收到的流信息每緩存一段時間就封包成一個新的 ts 文件,同時伺服器會建立一個 m3u8 的索引文件來維護最新幾個 ts 片段的索引。當播放端獲取直播時,它是從 m3u8 索引文件獲取最新的 ts 視頻文件片段來播放,從而保證用戶在任何時候連接進來時都會看到較新的內容,實現近似直播的體驗。相對於常見的流媒體直播協議,例如 RTMP 協議、RTSP 協議等,HLS 最大的不同在於直播客戶端獲取到的並不是一個完整的數據流,而是連續的、短時長的媒體文件,客戶端不斷的下載並播放這些小文件。這種方式的理論最小延時為一個 ts 文件的時長,一般情況為 2-3 個 ts 文件的時長。HLS 的分段策略,基本上推薦是 10 秒一個分片,這就看出了 HLS 的缺點:

通常 HLS 直播延時會達到 20-30s,而高延時對於需要實時互動體驗的直播來說是不可接受的

HLS 基於短連接 HTTP,HTTP 是基於 TCP 的,這就意味著 HLS 需要不斷地與伺服器建立連接,TCP 每次建立連接時的三次握手、慢啟動過程、斷開連接時的四次揮手都會產生消耗。

不過 HLS 也有它的優點:

數據通過 HTTP 協議傳輸,所以採用 HLS 時不用考慮防火牆或者代理的問題。

使用短時長的分片文件來播放,客戶端可以平滑的切換碼率,以適應不同帶寬條件下的播放。

HLS 是蘋果推出的流媒體協議,在 iOS 平臺上可以獲得天然的支持,採用系統提供的 AVPlayer 就能直接播放,不用自己開發播放器。

HLS有一個非常大的優點:HTML5可以直接打開播放;這個意味著可以把一個直播連結通過微信等轉發分享,不需要安裝任何獨立的APP,有瀏覽器即可,所以流行度很高。社交直播APP,HLS可以說是剛需

以下參考

直播協議 HTTP-FLV 詳解

這裡首先要說一下,HLS其實是一個「文本協議」,而並不是一個流媒體協議。那麼,什麼樣的協議才能稱之為流媒體協議呢?

流(stream):數據在網絡上按時間先後次序傳輸和播放的連續音/視頻數據流。之所以可以按照順序傳輸和播放連續是因為在類似 RTMP,FLV協議中, 每一個音視頻數據都被封裝成了包含時間戳信息頭的數據包。而當播放器拿到這些數據包解包的時候能夠根據時間戳信息把這些音視頻數據和之前到達的音視頻數據連續起來播放。MP4,MKV等等類似這種封裝,必須拿到完整的音視頻文件才能播放,因為裡面的單個音視頻數據塊不帶有時間戳信息,播放器不能將這些沒有時間戳信息數據塊連續起來,所以就不能實時的解碼播放。

二、MPEG DASH(Dynamic Adaptive Streaming over HTTP)

參考

MPEG-DASH 流媒體技術介紹(上)MPEG-DASH 流媒體技術介紹(中)MPEG-DASH 流媒體技術介紹(下)MPEG DASH 和 HLS

1.在基於HTTP提供流媒體的方面,到目前為止已經看到了三種方案,蘋果的HLS,Adobe HTTP Dynamic Streaming (HDS)和Microsoft Smooth Streaming (MSS),當然,各家用的協議,格式神馬的都不會一樣。於是每次做支持都要來三人份的。看到這三倍工作量,再想想老闆不給加工資,碼農們的心都寒了...MPEG的同志們體察到了這份疾苦,呼籲大家來個標準點的玩意唄,於是就有了MPEG DASH

這裡有一篇綜述

,寫的比我好還圖文並茂的,去那看吧~

2.B站在2018.8.2發布的

我們為什麼使用DASH

中提到以後點播會使用DASH方案,直播因為延遲問題仍然使用FLV(評論回覆中有提到)

文中有提到B站二壓,這個可以參考

【教程向】教你怎樣壓製出「B站直傳「的清晰視頻

DASH,又叫MPEG DASH,DASH:Dynamic Adaptive Streaming over HTTP ,是一種在網際網路上傳送動態碼率的Video Streaming技術,類似於蘋果的HLS,DASH會通過media presentation description (MPD)將視頻內容切片成一個很短的文件片段,每個切片都有多個不同的碼率,DASH Client可以根據網絡的情況選擇一個碼率進行播放,支持在不同碼率之間無縫切換。YouTube採用DASH。其網頁端及移動端APP都使用了DASH。DASH的其他採用者包括:Netflix, Hulu。

DASH是由MPEG (Moving Picture Experts Group)組織制定,2010年開始啟動,2011年11月發布Draft版本,2012年4月發布第一稿Version(ISO/IEC 23009-1:2012),2014年5月發布第二稿(ISO/IEC 23009-1:2014),最新稿(ISO/IEC 23009-3:2015)。

目前3GPP Release 10已經將DASH納入其中;在HbbTV 1.5中也支持DASH;DVB-DASH也將DASH納入到DVB(ETSI TS 103 285 v.1.1.1)。目前DASH Industry Forum由發起廠家組成,致力於推進DASH產品生態,將DASH產業化和業界最佳實踐推向批量應用。

15年的B站我們使用整段的FLV和MP4,這種方案的好處是簡單且兼容性高,抖音與今日頭條就是用該方案。但缺點也很明顯,隨著視頻時長的增長,整段的MP4的頭部過於複雜,體積過於龐大,導致拉取與加載極為緩慢。

16年的B站為了規避這個問題,使用了分段的FLV來提升加載速度,這種方案的好處是視頻頭部小,加載速度高。愛奇藝和優酷也使用類似方案。這種方案簡單且兼容性高,而且與直播流統一了格式,所以一直沿用至今,中間由於flv.js的出現 ,把這種方案帶向了全平臺。

但隨著用戶的增加,用戶的網絡種類和情況也變得更加複雜,如果我們需要在各種場景下都需要給用戶較好的體驗,我們需要選擇一種能在不同網絡下都能流暢播放的方案。我們需要引入Dynamic Adaptive Streaming/ Bitrate 技術,以進一步提升用戶體驗。我們也需要對多音軌和多視頻軌

在評估了一些行業內使用的方案後,我們選中了DASH,DASH也可以更靈活的實現用戶與產品的新增需求。

image.png

image.png

對於普通看視頻的用戶,我們期待部署Dash有以下改進:

觀看視頻更為流暢,如下圖所示,我們會在網速不佳時無縫切換至較低清晰度視頻,在網速充足時無縫切換至高清晰度視頻,切換過程對於用戶無感。

可以很容易的支持音頻模式,滿足聽相聲/音樂的你

在退到後臺後,可以自動切換至只拉取音頻,更節省你的流量,播放更加流暢。(恢復回來可能黑屏,所以上傳視頻時,會做GOP對齊,並嘗試將GOP縮減到5s)

可以很容易的支持視頻新增多音軌,多視頻軌,多字幕軌的任意切換 ,原聲,中配,多版本字幕任君選擇。

3.兼容性

參考

新時代的點播與直播wikipedia DASHWhy YouTube & Netflix use MPEG-DASH in HTML5

MSE(

Media Source Extensions

)是目前Youtube使用的DASH的基礎。

image.png

dash.js

是Dash行業論壇官方參考和生產播放器。

shaka-player

是出自Google的開源dash播放器。

三、RTMP

RTMP協議是Real Time Message Protocol(實時信息傳輸協議)的縮寫,它是由Adobe公司提出的一種應用層的協議,用來解決多媒體數據傳輸流的多路復用(Multiplexing)和分包(packetizing)的問題。

使用RTMP技術的流媒體系統有一個非常明顯的特點:使用 Flash Player 作為播放器客戶端,而Flash Player 現在已經安裝在了全世界將近99%的PC上,因此一般情況下收看RTMP流媒體系統的視音頻是不需要安裝插件的。用戶只需要打開網頁,就可以直接收看流媒體,十分方便。

相對於 HLS 來說,採用 RTMP 協議時,從採集推流端到流媒體伺服器再到播放端是一條數據流,因此在伺服器不會有落地文件。這樣 RTMP 相對來說就有這些優點:

延時較小,通常為 1-3s。

基於 TCP 長連接,不需要多次建連。

因此業界大部分直播業務都會選擇用 RTMP 作為流媒體協議。通常會將數據流封裝成 FLV 通過 HTTP 提供出去。但是這樣也有一些問題需要解決:

iOS 平臺沒有提供原生支持 RTMP 或 HTTP-FLV 的播放器,這就需要開發支持相關協議的播放器。

實例

最簡單的基於Flash的流媒體示例:RTMP推送和接收(ActionScript)

Paste_Image.png

public function simplest_as3_rtmp_player() { nc =newNetConnection(); nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); nc.connect("rtmp://localhost/live"); } private function netStatusHandler(event:NetStatusEvent):void { trace("event.info.level: "+event.info.level +"\n", "event.info.code: "+event.info.code); switch(event.info.code) { case"NetConnection.Connect.Success": doVideo(nc); break; case"NetConnection.Connect.Failed": break; case"NetConnection.Connect.Rejected": break; case"NetStream.Play.Stop": break; case"NetStream.Play.StreamNotFound": break; } } // play a recorded stream on the server private function doVideo(nc:NetConnection):void{ ns =newNetStream(nc); ns.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); video =newVideo(640,480); video.attachNetStream(ns); ns.play("myCamera"); addChild(video); }

四、HTTP-FLV協議:

即使用HTTP協議流式的傳輸媒體內容。相對於RTMP,HTTP更簡單和廣為人知,而且不擔心被Adobe的專利綁架。內容延遲同樣可以做到2~5秒,打開速度更快,因為HTTP本身沒有複雜的狀態交互。所以從延遲角度來看,HTTP-FLV要優於RTMP。

http_flv&rtmp這兩個協議實際上傳輸數據是一樣的,數據都是flv文件的tag。http_flv是一個無限大的http流的文件,相比rtmp就只能直播,而rtmp還可以推流和更多的操作。但是http有個好處,就是是以80http通信的,穿透性強,而且rtmp是非開放協議。這兩個協議是如今直播平臺主選的直播方式,主要原因就是延時極低。

以下參考

直播http-flv小調研

HTTP協議中有個約定:content-length欄位,http的body部分的長度

伺服器回復http請求的時候如果有這個欄位,客戶端就接收這個長度的數據然後就認為數據傳輸完成了,如果伺服器回復http請求中沒有這個欄位,客戶端就一直接收數據,直到伺服器跟客戶端的socket連接斷開。

http-flv直播就是利用第二個原理,伺服器回復客戶端請求的時候不加content-length欄位,在回復了http內容之後,緊接著發送flv數據,客戶端就一直接收數據了。

五、其它

1.直播整體流程大致可分為:

視頻採集端:可以是電腦上的音視頻輸入設備、或手機端的攝像頭、或麥克風,目前以移動端手機視頻為主。

直播流視頻服務端:一臺Nginx伺服器,採集視頻錄製端傳輸的視頻流(H264/ACC編碼),由伺服器端進行解析編碼,推送RTMP/HLS格式視頻流至視頻播放端。

視頻播放端:可以是電腦上的播放器(QuickTime Player、VLC),手機端的native播放器,還有就是 H5 的video標籤等,目前還是以手機端的native播放器為主。

2.以下參考

基於rtmp協議等的流媒體伺服器是否可以被取代

flash已經死了,但是在手機平臺上還是有很多人用C++來解析rtmp協議做直播流。因為對比其他直播流協議,rtmp的實時延遲可以做到1秒以內。hls的延遲基本有10秒左右。幾年前,我做過一個菲律賓賭場的直播APP,賭場的荷官發牌,然後客戶端同時顯示開牌信息,如果不同步或者超過1秒內的延遲,會給用戶一種作弊的感覺。使用rtmp,就算在美國看這個直播,延遲也是在1秒以內。找了很多視頻直播協議,實時性最好就是rtmp,暫時找不到能代替rtmp的協議。

3.以下參考

前主流視頻網站視頻點播都是使用的哪些協議

幾乎所有主流直播平臺網站幾乎都是主線路為cdn提供的httpflv,其他線路大部分都是rtmp。上面有人說httpflv的延遲比rtmp高一點,那是瞎扯,httpflv理論延時至少是與rtmp差不多的。至於HLS,我以前倒是在web上見到過,只不過現在沒見到了,幾乎都是rtmp+httpflv。至於hls相對rtmp及httpflv的優點,我想僅僅是能夠html5播放,僅此而已,hls本身有很多不好的設計,比如ts文件,ts文件是不停的在http請求,這就相當於http和長連接的區別,不僅帶來伺服器的資源消耗,還有http報文頭一堆冗餘信息。這對流媒體直播那金貴流量費來說,這不不是一個好選擇。hls還有個致命的問題,那就是延時,本身就是分文件塊傳輸的,延時自然比rtmp高出許多。如果將hls的ts文件縮小,或許稍許降低延時。但hsl真的不是面向大眾直播的第一選擇。

相關焦點

  • N+增強能力系列 | 視頻直播HLS與RTMP
    下面我們就進入《NGINX Plus增強能力系列專題》的首篇「視頻直播HLS與RTMP」,作者朱傑。1. ngx_http_hls_module 是什麼隨著直播行業大火,遊戲、樂秀、教育、發布會等直播類產品層出不窮,能夠滿足各方人員的需求
  • 視頻/小說/直播源
    1.港澳臺: 有線新聞,https://ws.matchupstream.tuboshu.com/live/77dd1fceca65268901ea37bf26a090c2.flv有線18臺,rtmp://59.124.75.156/sat/hk041NOW·新聞臺,https://ws.matchupstream.tuboshu.com
  • 2020.10.26 更新一套Http格式直播源,低調速用
    更新Http格式港澳臺直播源,儘快使用,低調翡翠臺
  • 全民K歌推流直播Web實踐
    <video>    <source id="source" src="http://xxxx/video.m3u8" type="application/x-mpegURL" /></video>HLS局限性在服務端對直播流進行切分處理之後客戶端才能拉取到數據,所以整體延遲較高,通常延遲可達到20~30s。
  • 【第2034期】全民K歌推流直播Web實踐
    在此背景下,Web側急需為推流直播業務提供更加可靠的技術支持。HLS和HTTP FLV目前K歌Web使用的直播流格式主要以HLS直播流為主。HLS(HTTP Live Streaming) 是由Apple提出的HTTP流媒體傳輸協議。
  • 更新一下直播電視臺的直播源
    .net/sat/jp081日本7,rtmp://wv2.tp33.net/sat/jp071日本6,rtmp://wv2.tp33.net/sat/jp061日本5,rtmp://wv2.tp33.net/sat/jp051日本4,rtmp://wv2.tp33.net/sat/jp041日本3,rtmp://wv2.
  • 麼麼直播的音視頻技術實踐和優化
    ,麼麼直播在移動端採用的是硬體編碼+rtmp dump的推流方式。Web端拉流H5上使用的是hls進行拉流,通過轉碼就能夠做到。由於hls的特性,需要切片,所以延遲相對高。pc端主要是使用rtmp和flv兩種流格式,麼麼直播平臺rtmp使用flash進行播放,flv使用js進行播放。使用flash播放rtmp的流時,涉及到視頻的秒開時間、flash加載速度兩大性能指標。
  • 愛上直播軟體一鍋端
    /fs_yspd.m3u8佛山公共,http://pili-live-rtmp.wdit.com.cn/wditlive/fs_ggpd.m3u8佛山新聞頻道,http://pili-live-rtmp.wdit.com.cn/wditlive/fs_zhpd.m3u8佛山順德,http://pili-live-rtmp.wdit.com.cn/wditlive
  • 全棧開發——動手打造屬於自己的直播間(Vue+SpringBoot+Nginx)
    說到直播我們先了解下幾個常用的直播流協議,看了挺多的流媒體協議文章博客,但都是非常粗略,這裡有個比較詳細的 流媒體協議介紹(地址:http://blog.csdn.net/tttyd/article/details/12032357/),如果想詳細了解協議內容估計去要看看專業書籍了。這裡我們用到的只是rtmp和hls,實踐後發現:rtmp只能夠在電腦端播放,hls只能夠在手機端播放。
  • 2020/12/05 全套直播源,可以收藏備用,十分穩定
    聲明:本影視電視直播源完全來自於網絡,轉載網絡,如果侵犯版權,請及時與作者聯繫,予以刪除!
  • 南瓜直播一鍋端
    /hls55.m3u8遼寧 Ⅰ 遼寧體育,http://hdtv.haust.edu.cn/hls/hls3.m3u8遼寧 Ⅰ 家庭理財,http://hdtv.haust.edu.cn/hls/hls15.m3u8遼寧 Ⅰ 遼寧動漫,http://hdtv.haust.edu.cn/hls/hls64.m3u8遼寧 Ⅰ 電子體育,http:/
  • 如何從零開始搭建高性能直播平臺
    前言現在直播已經成為移動網際網路時代一個新的重要流量入口,從YY、鬥魚到花椒直播,直播已經成為人們分享交流的新方式,應用場景眾多,主要分為:等4大類。在本文中,我將先從 rtmp 協議開始,一步步帶領大家搭建一個簡易高性能的直播平臺。
  • 前端要懂的視頻知識DASH協議(建議收藏)
    1.客戶端向Web伺服器發送一個HTTP請求,例如http://www.example.com/media/httpdynamicStreaming.f4m。5.然後客戶端解析F4M的內容向伺服器發送一個請求,比如http://www.example.com/media/httpdynamicStreamingSeg1-Frag1(segment中的fragmen片段)或者http://www.example.com/media/httpdynamicStreamingSeg1.f4f。
  • 《視頻直播技術詳解》之(四):編碼和封裝
    本系列文章大綱如下:(一)開篇(二)採集(三)處理(四)編碼和封裝(五)推流和傳輸(六)現代播放器原理(七)延遲優化(八)SDK 性能測試模型在上一期的處理篇中,我們介紹了講解常見視頻處理功能如美顏、視頻水印、濾鏡、連麥等。
  • 沒有Flash如何做直播?
    其實很多播放器底層都是用的MSE,比如flv.js播放HTTP-FLV或者WebSocket-FLV,比如hls.js播放HLS,比如dash.js播放DASH切片。WebRTC:目前做直播還不太成熟,是做RTC通信還算比較成熟的一套技術,有自己的編解碼邏輯。
  • 橙子直播內置部分源
    id=tvs4廣東佛山綜合[1280*720],http://pili-live-rtmp.wdit.com.cn/wditlive/fs_zhpd.m3u8廣東佛山影視[1280*720],http://pili-live-rtmp.wdit.com.cn/wditlive/fs_yspd.m3u8廣東佛山公共[1280*720],http://pili-live-rtmp.wdit.com.cn
  • cdn.chxjon直播源
    id=3鳳凰香港,http://223.110.245.136/PLTV/3/224/3221226975/index.m3u8#http://183.207.249.34/PLTV/3/224/3221226975/index.m3u8#http://183.207.249.36/PLTV/3/224/3221226975/index.m3u8鳳凰香港,http://125.89.166.215
  • 這直播超讚!好看實用還秒播,鎮弟大佬最新直播規則分享
    /livestream/mutfysrq.flv@@http://tv.sason.xyz/logo/hks.png',\n'中央綜藝@@http://211.137.115.110:8080/gitv_live/G_CCTV-3-HD/G_CCTV-3-HD.m3u8@@http://tv.sason.xyz/logo/cctv3.png'\n,'浙江衛視@@http://211.137.115.110
  • 吐血乾貨,直播首屏耗時400ms以下的優化實踐
    拉流協議基於http-flv,http-flv更穩定些,國內大部分直播公司基本都是使用http-flv了,從我們實際數據來看,http-flv確實稍微更快些。但是考慮到會有rtmp源,這塊也加了些優化。IP直通車簡單理解就是,把域名替換成IP。