MPEG DASH 和 HLS

最近做了點(diǎn)關(guān)于這倆玩意的東西,記在這。

友提:廢話較多冯挎,想看 tl;dr 的按end后往回翻。


首先咙鞍,這倆東西都是用來處理視頻的房官,為視頻提供基于HTTP的Streaming方案,除了這倆之外奶陈,還有下面的技術(shù):

  • Adobe HTTP Dynamic Streaming (HDS)
  • Microsoft Smooth Streaming (MSS)

這倆沒接觸易阳,不寫。標(biāo)題中提到的那倆吃粒,也就記下來用到的東西潦俺,沒研究過的,比如說直播啥的也不寫徐勃。

Overview

先說需求吧事示,拋開需求談技術(shù)就是耍流氓,嗯僻肖。

隨著網(wǎng)絡(luò)的發(fā)展肖爵,技術(shù)的演進(jìn),人們手上的電子垃圾設(shè)備也越來越多臀脏,碰到的網(wǎng)絡(luò)狀況也越來越多劝堪,本文的廢話也越來越多。在現(xiàn)實(shí)的網(wǎng)絡(luò)環(huán)境中做媒體分發(fā)揉稚,以視頻為例秒啦,不同的設(shè)備所需的大小,碼率都不同搀玖,就算在相同的設(shè)備上余境,也需要根據(jù)網(wǎng)絡(luò)情況的不同選擇合適的碼率來播放。在此基礎(chǔ)上,還需要提供流暢的切換體驗芳来。不難看出含末,想法很美好,但是現(xiàn)實(shí)很復(fù)雜即舌。所以佣盒,需要有更好的辦法向用戶提供多碼率的媒體分發(fā)。

歷史

純廢話侥涵,可以無視

N年前在學(xué)校的時候就有這些東西了沼撕,當(dāng)時是 RTSPMMS (暴露年齡了哇~)宋雏,自己架好后去BBS(又一個暴露年齡的東西)上貼地址芜飘,然后傻等著那收聽數(shù)帶來的莫名其妙的成就感。好像把這玩意給革命掉的是Flash播放器磨总,在播放的時候可以選擇碼率嗦明,不過在切換碼率的時候視頻會停一下(這個后臺具體的實(shí)現(xiàn)沒考證過,只描述現(xiàn)象)蚪燕。慢慢的人們發(fā)現(xiàn)娶牌,F(xiàn)lash將設(shè)備變成曖手寶/電熨斗的功能是如此的顯著,但是這些熱量又不能給電池充電馆纳,總不能出門就給手機(jī)電腦啥的背尿袋吧诗良,于是又開始鼓搗新玩意了~

HLS

Apple弄的流媒體標(biāo)準(zhǔn),基于HTTP提供流媒體的功能鲁驶,在蘋果系的軟件中被原生支持鉴裹,至于Windows/Linux/Android,不好意思Who are you钥弯?

MPEG DASH

在基于HTTP提供流媒體的方面径荔,到目前為止已經(jīng)看到了三種方案,蘋果的HLS脆霎,土坯的HDS和巨硬的MSS总处,當(dāng)然,各家用的協(xié)議睛蛛,格式神馬的都不會一樣鹦马。于是每次做支持都要來三人份的∫渖觯看到這三倍工作量荸频,再想想老板不給加工資,碼農(nóng)們的心都寒了...

MPEG的同志們體察到了這份疾苦难菌,呼吁大家來個標(biāo)準(zhǔn)點(diǎn)的玩意唄试溯,于是就有了MPEG DASH這里有一篇綜述郊酒,寫的比我好還圖文并茂的遇绞,去那看吧~

解決方案

此處是我在項目中的理解键袱,沒查文檔,不保證正確

就接觸到的MPEG DASH和HLS來看摹闽,它們的主要想法都是把一個長視頻給切成小塊蹄咖,然后通過一個個的HTTP請求分別下載。這樣一是每次請求的數(shù)據(jù)量不是很大付鹿,二是當(dāng)用戶需要換碼率或分辨率時澜汤,在下次請求給新的視頻就好。但是兩種方法還是有些不同的舵匾,這個會在后面描述俊抵。此外,MPEG DASH還支持對于單一的媒體文件按時間戳請求坐梯,不過這次用到的不多徽诲,只會在后面介紹下生成方法。

在本文中吵血,切片出來的視頻片段被稱為Segments谎替。除了這些Segments外,還有描述這些Segments的文件蹋辅,一般稱為 Manifest 文件钱贯,但是后面也會根據(jù)文件擴(kuò)展名稱為 MPD 文件(MPEG DASH)或 M3U8 文件(HLS)。

進(jìn)行MPEG DASH切片用的工具是 MP4Box 侦另,而HLS切片的工具是 ffmpeg

需求

終于說到了這次的需求秩命。首先,是個視頻服務(wù)提供商淋肾,之前的做法就是把mp4丟s3上讓用戶自己去看硫麻。不過現(xiàn)在發(fā)現(xiàn)一是一個視頻看下來,HTTP長連接受不了樊卓,二是如果只想給用戶一段視頻小樣(切片播放)拿愧,現(xiàn)在的方案沒法實(shí)現(xiàn)。找了一圈碌尔,決定拿HTTP Streaming來試一試浇辜。

在做原型測試的時候,把HLS和DASH都嘗試了下唾戚,由于需要支持切片播放柳洋,目前的實(shí)現(xiàn)方案選擇的是HLS。

一些命令

源視頻為 foo.mp4 叹坦,就是隨便從油管找一段720p的視頻下到本地來用的

MPEG DASH

  • 切成 Segments

    $ MP4Box -dash-strict 5000 -profile dashavc264:live -rap foo.mp4#video foo.mp4#audio -out index.mpd
    
    

    命令執(zhí)行成功后會在當(dāng)前目錄下生成一個mpd文件熊镣,兩個mp4文件和一系列的m4s文件。下面分別說明:

    • index.mpd: 上面提到的 Manifest 文件,XML格式绪囱,包含對視頻的描述测蹲。至于完整的Schema介紹,我也沒找到......一點(diǎn)點(diǎn)問G吧鬼吵。
    • *_init.mp4: 初始的mp4文件扣甲,相當(dāng)于視頻頭,在這個頭文件中包含了完整的視頻元信息(moov)齿椅,具體的可以使用 MP4Box <init video> -info 查看琉挖。
    • *.m4s: 即上面提到的Segments文件,每個m4s僅包含媒體信息 (moof + mdat)涣脚,而播放器是不能直接播放這個文件的示辈,需要用支持DASH的播放器從init文件開始播放。

    關(guān)于video structure的知識涩澡,可以參考這個網(wǎng)頁

    命令行參數(shù)中顽耳,-dash 5000 表示把視頻按5s一段來切坠敷,-profile 指定一些預(yù)設(shè)的配置妙同,-rap 強(qiáng)制Segments的起始位置為random access point,這個我也不清楚具體指什么膝迎,就是網(wǎng)上抄的命令粥帚。后面列出所有要導(dǎo)入的媒體流,如果有多個碼率限次,按規(guī)則寫即可芒涡,最后在 -out 后跟上輸出的mpd文件名,m4s文件會存放在和mpd文件同級的目錄中卖漫。

    這個切片基本上相當(dāng)于把視頻從中間直接分開费尽,沒有重新編碼之類的過程,所以比較快羊始。

    注意在切片時把a(bǔ)udio和video通過上面的命令分開旱幼,因為雖然DASH協(xié)議并沒有限制一個m4s中是否可以包含多過一個moof塊,但是目前的瀏覽器如Chrome是只支持在一個 Segment 中只包含一個moof的突委。

  • 多碼率支持

    DASH中柏卤,對多碼率的支持是通過增加 <Representation> 來完成的,具體可以問Google匀油。

  • 播放

    把生成出來的所有東西放到http服務(wù)器的static目錄中缘缚,即可通過mpd播放器訪問了。除此之外敌蚜,也可以使用支持mpd的app來放桥滨。

HLS

  • 切成 Segments

    $ ffmpeg -i foo.mp4 -g 25 -hls_time 1 -hls_list_size 0 index.m3u8
    

    這個命令把視頻按1秒切成Segments。命令執(zhí)行成功后,會在當(dāng)前目錄下生成一個m3u8文件和一系列的ts文件齐媒。在HLS中酸舍,每個Segments都是可以獨(dú)立播放的MPEG-2 TS文件,而m3u8的作用就是明確這些ts文件的順序里初。m3u8文件是純文本格式啃勉,可以方便的閱讀修改。命令行參數(shù)中双妨,-g 用來指定按frame切視頻淮阐,而 -hls_time 指定Segments的長度為1s。這兩個參數(shù)可以限定切出來的Segments 基本 符合1s一段的規(guī)則刁品。所以在使用 -g 時需要先確定源視頻文件的fps后再設(shè)定泣特。不過,即便如此挑随,也有一些Segments的長度會有1s以內(nèi)的偏差状您,應(yīng)該是無法避免的了。-hls_list_size 表示最后生成的m3u8中列出的ts文件的數(shù)目兜挨,默認(rèn)是5膏孟,此處寫0表示把所有的ts文件都列上(這里是項目需求,實(shí)際使用中可以適當(dāng)設(shè)置以減少m3u8文件大邪杌恪)柒桑。

    沒有測過如果最后生成10個ts文件,但是m3u8中只有5個的情況下噪舀,能不能把視頻放完魁淳。回頭如果試了再補(bǔ)充与倡。

    由于這個命令需要使用ffmpeg對源視頻進(jìn)行重新編碼界逛,所以需要占用比較多的CPU和時間。

  • 多碼率支持

    HLS中纺座,多碼率的支持是通過 #EXT-X-STREAM-INF 標(biāo)簽指定的息拜,在此標(biāo)簽中通過設(shè)置 BANDWIDTH 參數(shù)來指定碼率,然后在接下來的一行中填寫uri來標(biāo)明此碼率對應(yīng)的m3u8比驻。

  • 播放

    如果使用Safari该溯,可以直接把m3u8的地址輸入地址欄,即可直接播放别惦。據(jù)稱Android的Chrome也支持狈茉,但是桌面的不支持,不過可以通過擴(kuò)展播放掸掸。

播放器

雖然說有些瀏覽器可以內(nèi)建支持HLS或者DASH氯庆,但是對于開發(fā)這邊而言蹭秋,有一個統(tǒng)一的播放器會更方便些。之前查的時候找到了這些播放器堤撵,有些是兩者通吃仁讨,有些是只能放一個;有些免費(fèi)实昨,有些收費(fèi)洞豁,按需取用吧~


基本上就是這些了,主要是做項目中查到的東西荒给,整理下以便查閱丈挟。如有錯誤,歡迎告知志电。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末曙咽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子挑辆,更是在濱河造成了極大的恐慌例朱,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鱼蝉,死亡現(xiàn)場離奇詭異洒嗤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蚀乔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門烁竭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吉挣,你說我怎么就攤上這事⊥竦” “怎么了睬魂?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長镀赌。 經(jīng)常有香客問我氯哮,道長,這世上最難降的妖魔是什么商佛? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任喉钢,我火速辦了婚禮,結(jié)果婚禮上良姆,老公的妹妹穿的比我還像新娘肠虽。我一直安慰自己,他們只是感情好玛追,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布税课。 她就那樣靜靜地躺著闲延,像睡著了一般。 火紅的嫁衣襯著肌膚如雪韩玩。 梳的紋絲不亂的頭發(fā)上垒玲,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機(jī)與錄音找颓,去河邊找鬼合愈。 笑死,一個胖子當(dāng)著我的面吹牛击狮,可吹牛的內(nèi)容都是我干的想暗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼帘不,長吁一口氣:“原來是場噩夢啊……” “哼说莫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起寞焙,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤储狭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后捣郊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辽狈,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年呛牲,在試婚紗的時候發(fā)現(xiàn)自己被綠了刮萌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡娘扩,死狀恐怖着茸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情琐旁,我是刑警寧澤涮阔,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站灰殴,受9級特大地震影響敬特,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜牺陶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一伟阔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧掰伸,春花似錦皱炉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奏夫。三九已至,卻和暖如春历筝,著一層夾襖步出監(jiān)牢的瞬間酗昼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工梳猪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留麻削,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓春弥,卻偏偏與公主長得像呛哟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子匿沛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容