流媒體DASH協(xié)議詳解
- 2019-09-27 15:35:00
- admin 原創(chuàng)
- 27937
DASH(MPEG-DASH)是 Dynamic Adaptive Streaming over HTTP的縮寫,是國(guó)際標(biāo)準(zhǔn)組 MPEG 2014年推出的技術(shù)標(biāo)準(zhǔn), 主要目標(biāo)是形成IP網(wǎng)絡(luò)承載單一格式的流媒體并提供高效與高質(zhì)量服務(wù)的統(tǒng)一方案, 解決多制式傳輸方案(HTTP Live Streaming, Microsoft Smooth Streaming, HTTP Dynamic Streaming)并存格局下的存儲(chǔ)與服務(wù)能力浪費(fèi)、運(yùn)營(yíng)高成本與復(fù)雜度、系統(tǒng)間互操作弱等問題.
DASH是基于HTTP的動(dòng)態(tài)自適應(yīng)的比特率流技術(shù),使用的傳輸協(xié)議是TCP(有些老的客戶端直播會(huì)采用UDP協(xié)議直播, 例如YY, 齊齊視頻等). 和HLS, HDS技術(shù)類似, 都是把視頻分割成一小段一小段, 通過HTTP協(xié)議進(jìn)行傳輸,客戶端得到之后進(jìn)行播放;不同的是MPEG-DASH支持MPEG-2 TS、MP4等多種格式, 可以將視頻按照多種編碼切割, 下載下來的媒體格式既可以是ts文件也可以是mp4文件, 所以當(dāng)客戶端加載視頻時(shí), 按照當(dāng)前的網(wǎng)速和支持的編碼加載相應(yīng)的視頻片段進(jìn)行播放.
DASH的整個(gè)流程
主播直播流上傳
服務(wù)器的編解碼封裝
流媒體分發(fā)器
mpd文件
切割后的媒體文件
客戶端
客戶端加載mpd文件
解析MPD文件, 組成文件下載鏈接
當(dāng)前的網(wǎng)速和支持的編碼加載相應(yīng)的視頻片段進(jìn)行播放
MPD文件內(nèi)容
MPD文件構(gòu)成
MPD 標(biāo)簽
屬性:
profiles: 不同的profile對(duì)應(yīng)不同的MPD要求和Segment格式要求mediaPresentationDuration:整個(gè)節(jié)目的時(shí)長(zhǎng)
minBufferTime: 至少需要緩沖的時(shí)間
type:點(diǎn)播對(duì)應(yīng)static,直播對(duì)應(yīng)dynamic
availabilityStartTime=2019-05-22T22:16:57Z:如果是直播流的話,則必須提供,代表MPD中所有Seg從該時(shí)間開始可以request了
minimumUpdatePeriod=PT10H:至少每隔這么長(zhǎng)時(shí)間,MPD就有可能更新一次,只用于直播流BaseURL 根目錄
該元素可以在MPD\\Period\\AdaptationSet\\Representation同時(shí)出現(xiàn),若同時(shí)出現(xiàn),則層層嵌套;在每一層也可以出現(xiàn)多次,默認(rèn)使用第一個(gè)BaseURL;
3. Period 區(qū)段
一條完整的mpegdash碼流可能由一個(gè)或多個(gè)Period構(gòu)成,每個(gè)Period代表某一個(gè)時(shí)間段。比如某條碼流有60秒時(shí)間,Period1從0-15秒,Period2從16秒到40秒,Period3從41秒到60秒。同一個(gè)Period內(nèi),意味著可用的媒體內(nèi)容及其各個(gè)可用碼率(Representation)不會(huì)發(fā)生變更。直播情況下,“可能”需要周期地去服務(wù)器更新MPD文件,服務(wù)器可能會(huì)移除舊的已經(jīng)過時(shí)的Period,或是添加新的Period。新的Period中可能會(huì)添加新的可用碼率或去掉上一個(gè)Period中存在的某些碼率, 即上面的 Representation 字段
屬性:
duration:Period的時(shí)長(zhǎng);
start:Period的開始時(shí)間
4. AdaptationSet 自適應(yīng)子集
一個(gè)Period由一個(gè)或者多個(gè)Adaptationset組成。Adaptationset由一組可供切換的不同碼率的碼流(Representation)組成,這些碼流中可能包含一個(gè)(ISO profile)或者多個(gè)(TS profile)media content components,因?yàn)镮SO profile的mp4或者fmp4 segment中通常只含有一個(gè)視頻或者音頻內(nèi)容,而TS profile中的TS segment同時(shí)含有視頻和音頻內(nèi)容. 當(dāng)同時(shí)含有多個(gè)media component content時(shí),每個(gè)被復(fù)用的media content component將被單獨(dú)描述。
屬性:
segmentAlignment: 如果為true,則代表該AS中的segment互不重疊
startWithSAP: 每個(gè)Segment的第一幀都是關(guān)鍵幀
mimeType AdaptationSet 的媒體類型
minWidth 最小寬度
par 寬高比
contentType: 內(nèi)容類型
5. media content component 媒體內(nèi)容
一個(gè)media content component表示表示一個(gè)不同的音視頻內(nèi)容,比如不同語言的音軌屬于不同的media content component,而同一音軌的不同碼率(mpeg dash中叫做Representation)屬于相同的media content component。如果是TS profile,同一個(gè)碼率可能包括多個(gè)media content components。
6. SegmentTemplate 片段模板
組成下載 Representation 的URL 模板
屬性:
media: 指定用來生成Segment列表的模板,可以包含的通配符有$RepresentaonID$,$Bandwidth$,$Number$, $Time$
7. Representation 媒體文件描述
每個(gè)Adaptationset包含了一個(gè)或者多個(gè)Representations,一個(gè)Representation包含一個(gè)或者多個(gè)media streams,每個(gè)media stream對(duì)應(yīng)一個(gè)media content component。為了適應(yīng)不同的網(wǎng)絡(luò)帶寬,dash客戶端可能會(huì)從一個(gè)Representation切換到另外一個(gè)Representation
屬性:
codecs=avc1.640028
解碼器標(biāo)準(zhǔn)
bandwidth=3200000
需要帶寬 3.2Mbps
8. segment 切片
每個(gè)Representation由一個(gè)或者多個(gè)segment組成,每個(gè)segment由一個(gè)對(duì)應(yīng)的URL指定,也可能由相同的URL+不同的byte range指定。dash 客戶端可以通過HTTP協(xié)議來獲取URL(+byte range)對(duì)應(yīng)的分片數(shù)據(jù)。MPD中描述segment URL的形式有多種,如Segment list,Segment template,Single segment。
單獨(dú)介紹一個(gè)特殊的segment : Initialization Segment(初始化片段),
Representation的Segments一般都采用1個(gè)Init Segment+多個(gè)普通Segment的方式,還有一種形式就是Self Initialize Segment,這種形式?jīng)]有單獨(dú)的Init Segment,初始化信息包括在了各個(gè)Segment中。Init Segment中包含了解封裝需要的全部信息,比如Representation中有哪些音視頻流,各自的編碼格式及參數(shù)。對(duì)于 ISO profile來說(容器為MP4),包含了moov box,H264的sps/pps數(shù)據(jù)等關(guān)鍵信息存放于此(avCc box)。
切片內(nèi)容
fMP4(fragmented MP4),可以簡(jiǎn)單理解為分片化的MP4,是DASH采用的媒體文件格式,文件擴(kuò)展名通常為(.m4s或直接用.mp4), 或者分別切分成mpa(音頻), m4v(視頻);
fMP4 由分片組成,可以按整個(gè)文件存儲(chǔ),也可以按分片存儲(chǔ):
如果按照單個(gè)文件存儲(chǔ),每個(gè)輸出是一個(gè)m4s文件。
完整的fMP4視頻可以描述為如下形式:
moov + (moof + mdat) * N
如果按照分片存儲(chǔ),每個(gè)分片是一個(gè)m4s文件,輸出對(duì)應(yīng)了多個(gè)m4s。
fMP4中的第一個(gè)分片,對(duì)應(yīng)了DASH協(xié)議中Initialization Segment;其后的分片,則對(duì)應(yīng)Media Segment。
注:
moov: Movie Box,它是一種container box,子box里包含了媒 體的metadata信息;
moof: moofbox,這個(gè)box是視頻分片的描寫敘述信息, 即分片(fragment)的標(biāo)識(shí)
mdat: mdatbox 實(shí)際媒體數(shù)據(jù)。我們終于解碼播放的數(shù)據(jù)都在這里面
前端工作
加載視頻說明mpd文件
識(shí)別mpd內(nèi)容
判斷網(wǎng)速加載第一個(gè)適合該網(wǎng)速的視頻片段, 解析視頻數(shù)據(jù)
視頻數(shù)據(jù)通過 MSE(Media Source Extensions) API 把視頻數(shù)據(jù)傳輸給Video播放
不斷通過加載視頻片段大小/下載時(shí)間得出網(wǎng)速, 下載相應(yīng)碼率的視頻
自己動(dòng)手做DEMO
1. 下載MP4Box( 切片工具)
https://gpac.wp.imt.fr/downloads/gpac-nightly-builds/
注: 安裝后 application 中的 GPAC 是個(gè)播放器, 我們需要的是它文件里的下面的MP4Box 工具
執(zhí)行命令
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(開源庫(kù))
html
<script src="https://cdn.dashjs.org/latest/dash.all.min.js"></script>video src標(biāo)明地址
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開源庫(kù)
Dash.js 前端播放
聯(lián)系人: | 北極星通公司 |
---|---|
電話: | 010-56545416 |
傳真: | 010-82896426 |
Email: | support@bjsin.cn |
QQ: | 35338585 |
微信: | Aoku2017 | QQ群:241759321 |
地址: | 北京市中關(guān)村生命科學(xué)園創(chuàng)意園3-3-103 |