網(wǎng)頁(yè)端的視頻觀看體驗(yàn)存在以下問(wèn)題:
- 切換畫質(zhì)(1080P/高清/標(biāo)清)時(shí)默垄,播放器會(huì)黑屏,并回退到關(guān)鍵幀重新播放朦前。
- 不能根據(jù)網(wǎng)絡(luò)狀況自適應(yīng)調(diào)整碼率(YouTube默認(rèn)啟用自適應(yīng)碼率,對(duì)照畫質(zhì)選項(xiàng)中的“Auto”)
要解決以上問(wèn)題春哨,需要引入流媒體解決方案棒仍。
DASH
為什么選擇DASH
YouTube采用DASH!其網(wǎng)頁(yè)端及移動(dòng)端APP都使用了DASH癞尚。DASH的其他采用者包括:Netflix, Hulu, …
什么是DASH
一種服務(wù)端乱陡、客戶端的流媒體解決方案:
服務(wù)端:
將視頻內(nèi)容分割為一個(gè)個(gè)分片,每個(gè)分片可以存在不同的編碼形式(不同的codec胳徽、profile爽彤、分辨率、碼率等)往核;
播放器端:
就可以根據(jù)自由選擇需要播放的媒體分片嚷节;可以實(shí)現(xiàn)adaptive bitrate streaming技術(shù)。不同畫質(zhì)內(nèi)容無(wú)縫切換衩婚,提供更好的播放體驗(yàn)效斑。
DASH中的重要概念
MPD
媒體文件的描述文件(manifest),作用類似HLS的m3u8文件税娜。MPD文件以XML格式組織藏研,其層次結(jié)構(gòu)參圖1。Representation
對(duì)應(yīng)一個(gè)可選擇的輸出(alternative)弧岳。如,480p video涧卵,720p video, 44100采樣 audio腹尖,22050采樣audio,都使用Representation描述乐设。-
Segment(分片)
每個(gè)Representation會(huì)劃分為多個(gè)Segment绎巨。Segment分為4類,其中戈锻,最重要的是:Initialization Segment(每個(gè)Representation都包含1個(gè)Init Seg)和媳,Media Segment(每個(gè)Representation的媒體內(nèi)容包含若干Media Seg)留瞳!
圖1. MPD的層次示意圖 (每個(gè)Rrepresentation使用fMP4文件格式)
fMP4
fMP4(fragmented MP4),可以簡(jiǎn)單理解為分片化的MP4,是DASH采用的媒體文件格式帝牡,文件擴(kuò)展名通常為(.m4s或直接用.mp4)蒙揣。
圖2. 普通MP4與fMP4組織結(jié)構(gòu)對(duì)比,fMP4與DASH 分片概念對(duì)照
圖2說(shuō)明:
普通MP4 由索引文件頭文件moov box和媒體數(shù)據(jù)mdat box組成罩息。
fMP4 由分片組成个扰,可以按整個(gè)文件存儲(chǔ)递宅,也可以按分片存儲(chǔ):
如果按照單個(gè)文件存儲(chǔ)苍狰,每個(gè)輸出是一個(gè)m4s文件烘绽。 完整的fMP4視頻可以描述為如下形式:
moov + (moof + mdat) * N
其中moof box是分片(fragment)的標(biāo)識(shí), mdat box存放的是當(dāng)前分片的媒體數(shù)據(jù)翔忽;如果按照分片存儲(chǔ)盏檐,每個(gè)分片是一個(gè)m4s文件,輸出對(duì)應(yīng)了多個(gè)m4s贬丛。
fMP4中的第一個(gè)分片给涕,對(duì)應(yīng)了DASH協(xié)議中Initialization Segment够庙;其后的分片,則對(duì)應(yīng)Media Segment耘眨。
YouTube調(diào)研
一段15’ 720分辨率視頻剔难,YouTube有如下Representation:
- audio1 id:139 codec:HE-AAC 采樣率22050 分片:5
- audio2 id:140 codec:AAC-LC 采樣率44100 分片:5
- video1 id:133 codec:264 main profile level1.2 240p 分片:4
- video2 id:134 codec:264 main profile level2.0 360p 分片:4
- video3 id:135 codec:264 main profile level2.0 480p 分片:4
- video4 id:160 codec:264 main profile level1.1 144p 分片:4
- video5 id:136 codec:264 main profile level3.0 720p 分片:4
關(guān)注視頻部分,4個(gè)分片包含:1個(gè)Init Seg非迹,3個(gè)Media Seg纯趋,視頻內(nèi)容部分分別為5.12s 5.12s 4.76s。
正常順序播放
圖3. 正常順序播放的時(shí)序圖
(1)下載MPD
(2)下載Init Seg
(3)下載Media Seg(s)
在第6s已經(jīng)完成所有視頻分片的下載纯命。
切換行為
圖4. 發(fā)生switch的時(shí)序圖
切換前亿汞,Representation 0的所有分片已經(jīng)下載完成揪阿,交互流程同上匙铡,
第8s進(jìn)行畫質(zhì)切換:
- 下載Representation 1的Init Seg # 每次切換都會(huì)先下載Init Seg
- 下載Representation 1 當(dāng)前所在分片鳖眼!Seg2
- 下載后續(xù)分片嚼摩。
說(shuō)明:YouTube在播放Rep0 Seg2期間發(fā)生切換,會(huì)下載Repr1的Seg2愿卒,這屬于YouTube的播放策略潮秘。很多DASH播放器,此時(shí)會(huì)直接請(qǐng)求Repr1的Seg3枕荞。
DASH應(yīng)用
1)FFmpeg 轉(zhuǎn)碼
FFmpeg支持DASH封裝柜候,仿YouTube格式的命令:
ffmpeg -hide_banner -y -threads 0 -i INPUT_VIDEO -filter_complex 'split=2[s0][s1];[s0]scale=480:-2[480s];[s1]scale=360:-2[360s]' -map '[480s]' -c:v:0 libx264 -crf 25 -preset veryslow -map '[360s]' -c:v:1 libx264 -crf 27 -preset veryslow -map a -c:a:0 libfdk_aac -ar:a:0 22050 -map a -c:a:1 libfdk_aac -ar:a:1 44100 -g 150 -sc_threshold 0 -b_strategy 0 -min_seg_duration 5000 -use_timeline 0 -use_template 1 -single_file 1 -window_size 5 -adaptation_sets "id=0,streams=v id=1,streams=a" -f dash OUTPUT.mpd
輸出:
- mpd描述文件
- m4s 輸出文件
視頻兩個(gè)文件分別是480p crf25 和360p crf 27。
音頻兩個(gè)文件分別是22050采樣率和44100采樣率躏精。
獨(dú)立文件內(nèi)部每個(gè)分片時(shí)長(zhǎng)5s渣刷。
2)FFmpeg 轉(zhuǎn)封裝
若存在兼容普通mp4轉(zhuǎn)碼的需求,可以直接對(duì)已編碼視頻轉(zhuǎn)封裝得到DASH文件矗烛,避免重復(fù)編碼辅柴。
要點(diǎn)在于保證編碼命令中的GOP length與DASH要求匹配,否則會(huì)發(fā)生卡頓問(wèn)題瞭吃,需要在播放器端做額外處理碌嘀。
3) MP4Box 轉(zhuǎn)封裝
mp4box -dash 5000 -frag 5000 -rap -frag-rap -profile dashavc264:onDemand ld.mp4 hd.mp4 audio.m4a -out OUTPUT.mpd
4)DASH播放
使用開(kāi)源的網(wǎng)頁(yè)端DASH player dash.js可以播放歪架,如下圖股冗。
圖5. 后臺(tái)轉(zhuǎn)碼的實(shí)際播放效果