流媒體DASH簡介及使用方法(FFmpeg, MP4Box)(轉(zhuǎn))

網(wǎng)頁端的視頻觀看體驗(yàn)存在以下問題:

  1. 切換畫質(zhì)(1080P/高清/標(biāo)清)時(shí),播放器會黑屏,并回退到關(guān)鍵幀重新播放。
  2. 不能根據(jù)網(wǎng)絡(luò)狀況自適應(yīng)調(diào)整碼率(YouTube默認(rèn)啟用自適應(yīng)碼率,對照畫質(zhì)選項(xiàng)中的“Auto”)

要解決以上問題,需要引入流媒體解決方案。

DASH

為什么選擇DASH
YouTube采用DASH!其網(wǎng)頁端及移動(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)容無縫切換,提供更好的播放體驗(yàn)。

DASH中的重要概念

  • MPD
    媒體文件的描述文件(manifest),作用類似HLS的m3u8文件。MPD文件以XML格式組織,其層次結(jié)構(gòu)參圖1。

  • Representation
    對應(yīng)一個(gè)可選擇的輸出(alternative)。如,480p video,720p video, 44100采樣 audio,22050采樣audio,都使用Representation描述。

  • Segment(分片)
    每個(gè)Representation會劃分為多個(gè)Segment。Segment分為4類,其中,最重要的是:Initialization Segment(每個(gè)Representation都包含1個(gè)Init Seg),Media Segment(每個(gè)Representation的媒體內(nèi)容包含若干Media Seg)!


    1.png

圖1. MPD的層次示意圖 (每個(gè)Rrepresentation使用fMP4文件格式)

fMP4

fMP4(fragmented MP4),可以簡單理解為分片化的MP4,是DASH采用的媒體文件格式,文件擴(kuò)展名通常為(.m4s或直接用.mp4)。

2.png

圖2. 普通MP4與fMP4組織結(jié)構(gòu)對比,fMP4與DASH 分片概念對照
圖2說明:
普通MP4 由索引文件頭文件moov box和媒體數(shù)據(jù)mdat box組成。
fMP4 由分片組成,可以按整個(gè)文件存儲,也可以按分片存儲:

  • 如果按照單個(gè)文件存儲,每個(gè)輸出是一個(gè)m4s文件。 完整的fMP4視頻可以描述為如下形式:
    moov + (moof + mdat) * N
    其中moof box是分片(fragment)的標(biāo)識, mdat box存放的是當(dāng)前分片的媒體數(shù)據(jù);

  • 如果按照分片存儲,每個(gè)分片是一個(gè)m4s文件,輸出對應(yīng)了多個(gè)m4s。

fMP4中的第一個(gè)分片,對應(yīng)了DASH協(xié)議中Initialization Segment;其后的分片,則對應(yīng)Media Segment。

YouTube調(diào)研

一段15’ 720分辨率視頻,YouTube有如下Representation:

  1. audio1 id:139 codec:HE-AAC 采樣率22050 分片:5
  2. audio2 id:140 codec:AAC-LC 采樣率44100 分片:5
  3. video1 id:133 codec:264 main profile level1.2 240p 分片:4
  4. video2 id:134 codec:264 main profile level2.0 360p 分片:4
  5. video3 id:135 codec:264 main profile level2.0 480p 分片:4
  6. video4 id:160 codec:264 main profile level1.1 144p 分片:4
  7. 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.png

圖3. 正常順序播放的時(shí)序圖

(1)下載MPD
(2)下載Init Seg
(3)下載Media Seg(s)
在第6s已經(jīng)完成所有視頻分片的下載。

切換行為

4.png

圖4. 發(fā)生switch的時(shí)序圖

切換前,Representation 0的所有分片已經(jīng)下載完成,交互流程同上,
第8s進(jìn)行畫質(zhì)切換:

  1. 下載Representation 1的Init Seg # 每次切換都會先下載Init Seg
  2. 下載Representation 1 當(dāng)前所在分片!Seg2
  3. 下載后續(xù)分片。

說明:YouTube在播放Rep0 Seg2期間發(fā)生切換,會下載Repr1的Seg2,這屬于YouTube的播放策略。很多DASH播放器,此時(shí)會直接請求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í)長5s。

2)FFmpeg 轉(zhuǎn)封裝

若存在兼容普通mp4轉(zhuǎn)碼的需求,可以直接對已編碼視頻轉(zhuǎn)封裝得到DASH文件,避免重復(fù)編碼。
要點(diǎn)在于保證編碼命令中的GOP length與DASH要求匹配,否則會發(fā)生卡頓問題,需要在播放器端做額外處理。

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播放

使用開源的網(wǎng)頁端DASH player dash.js可以播放,如下圖。


5.png

圖5. 后臺轉(zhuǎn)碼的實(shí)際播放效果

原文:https://blog.csdn.net/yue_huang/article/details/78466537

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容