最近做了點(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)時是 RTSP
和 MMS
(暴露年齡了哇~)宋雏,自己架好后去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)洞豁,按需取用吧~
- http://demo.theoplayer.com/test-hls-mpeg-dash-stream
- http://bitmovin.com/hls-mpeg-dash-test-player/
- http://dash-mse-test.appspot.com/dash-player.html
- http://shaka-player-demo.appspot.com/demo/
- http://dashif.org/reference/players/javascript/1.4.0/samples/dash-if-reference-player/
基本上就是這些了,主要是做項目中查到的東西荒给,整理下以便查閱丈挟。如有錯誤,歡迎告知志电。