什么是流媒體
流媒體(streaming media)是指采用流式傳輸技術在網絡上連續實時播放的媒體格式,如音頻、視頻或多媒體文件,采用流媒體技術使得數據包得以像流水一樣發送, 如果沒有流媒體技術, 那么我們就要像以前用迅雷下電影一樣, 下載整個影片才能觀看, 講DASH之前先簡單介紹一下常用的直播協議: HLS, RTMP, HDS協議. 因為DASH協議其實就是組合了以前的一些技術而發展出來的.
1. RTMP
RTMP(Real Time Messaging Protocol)實時消息傳送協議是Adobe Systems公司為Flash播放器和服務器之間音頻、視頻和數據傳輸 開發的開放協議。是我們市面上絕大多數部分PC秀場使用的技術棧, 他有低延遲(2秒左后), 穩定性高, 技術完善, 高支持度, 編碼兼容性高等特點.
RTMP的整體流程
2. HTTP-FLV
FLV (Flash Video) 是 Adobe 公司推出的另一種視頻格式,是一種在網絡上傳輸的流媒體數據存儲容器格式。HTTP-FLV 即將流媒體數據封裝成 FLV 格式,然后通過 HTTP 協議傳輸給客戶端。HTTP-FLV這種方式較RTMP協議好的就是它采用公共的HTTP80端口, 有效避免被防火牆攔截, 可以通過 HTTP 302 跳轉靈活調度/負載均衡,支持使用 HTTPS 加密傳輸,但它也有缺點, 視頻的內容會緩存到用戶本地, 保密性不好. HTTP-FLV的整體流程和RTMP協議一致, 但在客戶端播放有些差異, 在MSE出現以前市場上一般都是用flash播放器去播放, MSE出現以后以及推廣HTML5播放器的原因, 市場上開始使用JS軟解FLV的方式, 通過HTMLVideoElement去播放.
3. HLS協議
HTTP Live Streaming(縮寫是HLS)是一個由蘋果公司提出的基於HTTP的流媒體網絡傳輸協議。是蘋果公司QuickTime X和iPhone軟件系統的一部分, HLS支持MPEG-2 TS標准(WWDC16 蘋果宣布支持 Fragmented MP4), 移動端支持良好, 現在已經成為移動端H5直播的主要技術, 它的工作原理是把整個流分成一個個小的基於HTTP的文件來下載,每次只下載一些。當媒體流正在播放時,客戶端可以選擇從許多不同的備用源中以不同的速率下載同樣的資源,允許流媒體會話適應不同的數據速率。在開始一個流媒體會話時,客戶端會下載一個包含元數據的extended M3U (m3u8)playlist文件,用於尋找可用的媒體流。主要是為了解決RTMP協議存在的一些問題, 比如RTMP協議不使用標准的HTTP接口傳輸數據(TCP、UDP端口:1935),所以在一些特殊的網絡環境下可能被防火牆屏蔽掉。但是HLS由於使用的HTTP協議傳輸數據(80端口),不會遇到被防火牆屏蔽的情況.
HLS的整體流程
客戶端播放HLS流時的情況
index.m3u8文件的構成
協議對比
4. HDS
Http Dynamic Streaming(HDS)是一個由Adobe公司模仿HLS協議提出的另一個基於Http的流媒體傳輸協議。其模式跟HLS類似,但是又要比HLS協議復雜一些,也是索引文件和媒體切片文件結合的下載方式。
在服務器端降一個視頻文件分割成segment節,segment節表示的是這個視頻的幾種不同的分辨率模式,針對某種分辨率的segment節,可以再划分成fragmen片段,每個片段都是視頻的一小段時間,分段后每個片段會有segment+fragment的索引,客戶端會根據索引請求視頻片段。索引文件可以是.f4m的manifest文件,也可以是.bootstrap文件,視頻文件是使用附加的基於標准的MP4片段格式(ISO / IEC 14496-12:2008)擴展F4V格式,擴展名為.f4f。
HDS的流程圖
1.客戶端向Web服務器發送一個HTTP請求,例如http://www.example.com/media/httpdynamicStreaming.f4m。
2.服務器將收到的請求傳遞給HTTP Origin Module。
3.HTTP Origin Module將描述文件(F4M)返回到客戶端。
4.客戶端收到描述文件(F4M),根據 bootstrap中的信息中的傳送時間,組成一個segment#/fragment#對。
5.然后客戶端解析F4M的內容向服務器發送一個請求,比如http://www.example.com/media/httpdynamicStreamingSeg1-Frag1(segment中的fragmen片段)或者http://www.example.com/media/httpdynamicStreamingSeg1.f4f。(segment)
6.服務器返回相應的視頻片段。
7.客戶端接收分片,處理之后播放。
DASH協議
DASH(MPEG-DASH)是 Dynamic Adaptive Streaming over HTTP的縮寫,是國際標准組 MPEG 2014年推出的技術標准, 主要目標是形成IP網絡承載單一格式的流媒體並提供高效與高質量服務的統一方案, 解決多制式傳輸方案(HTTP Live Streaming, Microsoft Smooth Streaming, HTTP Dynamic Streaming)並存格局下的存儲與服務能力浪費、運營高成本與復雜度、系統間互操作弱等問題.
DASH是基於HTTP的動態自適應的比特率流技術,使用的傳輸協議是TCP(有些老的客戶端直播會采用UDP協議直播, 例如YY, 齊齊視頻等). 和HLS, HDS技術類似, 都是把視頻分割成一小段一小段, 通過HTTP協議進行傳輸,客戶端得到之后進行播放;不同的是MPEG-DASH支持MPEG-2 TS、MP4等多種格式, 可以將視頻按照多種編碼切割, 下載下來的媒體格式既可以是ts文件也可以是mp4文件, 所以當客戶端加載視頻時, 按照當前的網速和支持的編碼加載相應的視頻片段進行播放.
DASH的整個流程
-
主播直播流上傳
-
服務器的編解碼封裝
-
流媒體分發器
-
mpd文件
-
切割后的媒體文件
-
-
客戶端
-
客戶端加載mpd文件
-
解析MPD文件, 組成文件下載鏈接
-
當前的網速和支持的編碼加載相應的視頻片段進行播放
-
MPD文件內容
MPD文件構成
-
MPD 標簽
屬性:
profiles: 不同的profile對應不同的MPD要求和Segment格式要求mediaPresentationDuration:整個節目的時長
minBufferTime: 至少需要緩沖的時間
type:點播對應static,直播對應dynamic
availabilityStartTime=2019-05-22T22:16:57Z
:如果是直播流的話,則必須提供,代表MPD中所有Seg從該時間開始可以request了
minimumUpdatePeriod=PT10H
:至少每隔這么長時間,MPD就有可能更新一次,只用於直播流 -
BaseURL 根目錄
該元素可以在MPD\Period\AdaptationSet\Representation同時出現,若同時出現,則層層嵌套;在每一層也可以出現多次,默認使用第一個BaseURL;
3. Period 區段
一條完整的mpeg dash碼流可能由一個或多個Period構成,每個Period代表某一個時間段。比如某條碼流有60秒時間,Period1從0-15秒,Period2從16秒到40秒,Period3從41秒到60秒。同一個Period內,意味着可用的媒體內容及其各個可用碼率(Representation)不會發生變更。直播情況下,“可能”需要周期地去服務器更新MPD文件,服務器可能會移除舊的已經過時的Period,或是添加新的Period。新的Period中可能會添加新的可用碼率或去掉上一個Period中存在的某些碼率, 即上面的 Representation 字段
屬性:
duration:Period的時長;
start:Period的開始時間
4. AdaptationSet 自適應子集
一個Period由一個或者多個Adaptationset組成。Adaptationset由一組可供切換的不同碼率的碼流(Representation)組成,這些碼流中可能包含一個(ISO profile)或者多個(TS profile)media content components,因為ISO profile的mp4或者fmp4 segment中通常只含有一個視頻或者音頻內容,而TS profile中的TS segment同時含有視頻和音頻內容. 當同時含有多個media component content時,每個被復用的media content component將被單獨描述。
屬性:
segmentAlignment: 如果為true,則代表該AS中的segment互不重疊
startWithSAP: 每個Segment的第一幀都是關鍵幀
mimeType AdaptationSet 的媒體類型
minWidth 最小寬度
par 寬高比
contentType: 內容類型
5. media content component 媒體內容
一個media content component表示表示一個不同的音視頻內容,比如不同語言的音軌屬於不同的media content component,而同一音軌的不同碼率(mpeg dash中叫做Representation)屬於相同的media content component。如果是TS profile,同一個碼率可能包括多個media content components。
6. SegmentTemplate 片段模板
組成下載 Representation 的URL 模板
屬性:
media: 指定用來生成Segment列表的模板,可以包含的通配符有$RepresentaonID$,$Bandwidth$,$Number$, $Time$
7. Representation 媒體文件描述
每個Adaptationset包含了一個或者多個Representations,一個Representation包含一個或者多個media streams,每個media stream對應一個media content component。為了適應不同的網絡帶寬,dash客戶端可能會從一個Representation切換到另外一個Representation
屬性:
codecs=avc1.640028
解碼器標准
bandwidth=3200000
需要帶寬 3.2Mbps
8. segment 切片
每個Representation由一個或者多個segment組成,每個segment由一個對應的URL指定,也可能由相同的URL+不同的byte range指定。dash 客戶端可以通過HTTP協議來獲取URL(+byte range)對應的分片數據。MPD中描述segment URL的形式有多種,如Segment list,Segment template,Single segment。
單獨介紹一個特殊的segment : Initialization Segment(初始化片段),
Representation的Segments一般都采用1個Init Segment+多個普通Segment的方式,還有一種形式就是Self Initialize Segment,這種形式沒有單獨的Init Segment,初始化信息包括在了各個Segment中。Init Segment中包含了解封裝需要的全部信息,比如Representation中有哪些音視頻流,各自的編碼格式及參數。對於 ISO profile來說(容器為MP4),包含了moov box,H264的sps/pps數據等關鍵信息存放於此(avCc box)。
切片內容
fMP4(fragmented MP4),可以簡單理解為分片化的MP4,是DASH采用的媒體文件格式,文件擴展名通常為(.m4s或直接用.mp4), 或者分別切分成mpa(音頻), m4v(視頻);
fMP4 由分片組成,可以按整個文件存儲,也可以按分片存儲:
如果按照單個文件存儲,每個輸出是一個m4s文件。
完整的fMP4視頻可以描述為如下形式:
-
moov + (moof + mdat) * N
-
如果按照分片存儲,每個分片是一個m4s文件,輸出對應了多個m4s。
fMP4中的第一個分片,對應了DASH協議中Initialization Segment;其后的分片,則對應Media Segment。
注:
-
moov: Movie Box,它是一種container box,子box里包含了媒 體的metadata信息;
-
moof: moofbox,這個box是視頻分片的描寫敘述信息, 即分片(fragment)的標識
-
mdat: mdatbox 實際媒體數據。我們終於解碼播放的數據都在這里面
前端工作
-
加載視頻說明mpd文件
-
識別mpd內容
-
判斷網速加載第一個適合該網速的視頻片段, 解析視頻數據
-
視頻數據通過 MSE(Media Source Extensions) API 把視頻數據傳輸給Video播放
-
不斷通過加載視頻片段大小/下載時間得出網速, 下載相應碼率的視頻
自己動手做DEMO
1. 下載MP4Box(切片工具)
https://gpac.wp.imt.fr/downloads/gpac-nightly-builds/
注: 安裝后 application 中的 GPAC是個播放器, 我們需要的是它文件里的下面的MP4Box工具
-
執行命令
sudo /Applications/GPAC.app/Contents/MacOS/MP4Box -dash-strict 5000 -profile dashavc264:live -rap /Users/lijiancheng/Documents/mse/assert/foo.mp4#video /Users/lijiancheng/Documents/mse/assert/foo.mp4#audio -out index.mpd
-
引入Dash.js(開源庫)
html
<script src="https://cdn.dashjs.org/latest/dash.all.min.js"></script> -
video src標明地址
html
<video data-dashjs-player autoplay src="./assert/index.mpd" controls></video>
別人的DASH DEMO
http://reference.dashif.org/dash.js/nightly/samples/dash-if-reference-player/index.html
http://demo.theoplayer.com/test-your-stream-with-statistics
https://bitmovin.com/demos/stream-test
DASH 切片工具
-
FFmpeg
-
MP4Box
Dash開源庫
-
Dash.js 前端播放
相關文檔
-
自適應流媒體傳輸(四)——深入理解MPD(https://blog.csdn.net/nonmarking/article/details/85714099)
-
MP4Box指令(https://gpac.wp.imt.fr/mp4box/dash/)
-
DASH簡介及使用方法(FFmpeg, MP4Box)(https://blog.csdn.net/yue_huang/article/details/78466537)
-
MP4Box的安裝和使用(https://www.jianshu.com/p/c801e8dd041e)
-
DASH協議及各種碼率自適應協議的對比(https://juejin.im/post/5a697868f265da3e3f4ce17d)
-
Azure 媒體服務支持 DASH 實時傳送流(https://blogs.msdn.microsoft.com/azchina/2014/12/04/azure-dash/)
-
第四部分:如何借助當前的自適應比特率技術降低廣播延遲 – 參考架構和測試結果(https://aws.amazon.com/cn/blogs/china/compete-broadcast-latency-bitrate-tech4/)