好久沒(méi)有更新了多矮,這次來(lái)簡(jiǎn)單的介紹一下自適應(yīng)視頻播放的相關(guān)技術(shù)。
說(shuō)到自適應(yīng)視頻播放(Adaptive Streaming)哈打,網(wǎng)上的資料不多塔逃,可以供大家測(cè)試的視頻播放器也沒(méi)有多少,所以很多朋友都無(wú)從下手學(xué)習(xí)料仗。這次來(lái)給大家分享一下自適應(yīng)視頻播放技術(shù)的基礎(chǔ)原理湾盗,具體實(shí)現(xiàn)可以參考Exoplayer的源碼,這篇文章也會(huì)稍微介紹一下格粪。
1.自適應(yīng)視頻播放技術(shù)的原理
首先,我們所謂的自適應(yīng)視頻播放技術(shù)中的自適應(yīng)颜阐,適應(yīng)的到底是什么呢平窘?
在在線視頻播放中凳怨,最重要的一個(gè)要素應(yīng)該就屬于客戶端的網(wǎng)絡(luò)狀況了瑰艘,如果網(wǎng)絡(luò)狀況很差,俗稱的網(wǎng)速很慢肤舞,那么大家一般的體驗(yàn)都是視頻很卡拇泛,看一會(huì)就停一會(huì)。那么有沒(méi)有可能讓我們的播放器自動(dòng)檢測(cè)網(wǎng)絡(luò)狀況拌禾,在網(wǎng)絡(luò)差的情況下播放清晰度較差,數(shù)據(jù)量較小的視頻,當(dāng)網(wǎng)絡(luò)情況變得好的時(shí)候播放清晰度好嘁捷,但是數(shù)據(jù)量大的視頻呢?
哈哈答案是肯定的现诀,自適應(yīng)視頻播放技術(shù)就解決了這個(gè)問(wèn)題。先給大家看一個(gè)前端播放器的示意圖。
![](https://github.com/richardissuperman/videoconcepts/blob/master/image4/1.png?raw=true)
通常來(lái)講,自適應(yīng)播放技術(shù)一般包括前端的支持還有后臺(tái)的支持奴艾,后臺(tái)提供一個(gè)索引表(Manifest)潭苞,上面記錄了同一個(gè)視頻不同清晰度的版本的Url(比如視頻的240p,480p秀菱,720p不同的版本文件)衍菱。前端的播放器在拿到這個(gè)索引表之后,會(huì)根據(jù)自身的網(wǎng)絡(luò)狀態(tài)肩豁,在不同清晰度直接的視頻文件轉(zhuǎn)換脊串。
就如上圖所示辫呻,橫軸是時(shí)間,豎軸是清晰度琼锋。在示例里面放闺,我們有三種不同清晰度的視頻文件,同時(shí)每個(gè)視頻文件一般是切割成以五秒或者十秒為一個(gè)單位的塊(Chunk)缕坎,每次播放器加載播放都是以塊為單位怖侦。
所以說(shuō)到底,自適應(yīng)視頻并不是同一個(gè)容器文件(container)里面封裝了所有視頻軌道數(shù)據(jù)(當(dāng)然理論上來(lái)說(shuō)也不是不行),而是根據(jù)索引表的內(nèi)容谜叹,和自身網(wǎng)絡(luò)的下載速度決定播放哪一個(gè)具體的容器文件罷了匾寝。
2.自適應(yīng)視頻播放的規(guī)范
現(xiàn)在市面上的Adaptive Streaming肯定以??的HLS,還有另一個(gè)叫DASH的規(guī)范最為流行荷腊,我們這次以DASH這個(gè)規(guī)范來(lái)深入了解一下自適應(yīng)視頻播放的一些細(xì)節(jié)艳悔。
2.1 DASH里面的MPD文件
MPD文件格式,就是我們?cè)诘谝徊糠种姓f(shuō)到的索引表Manifest了(HLS對(duì)應(yīng)的索引表格式叫M3u8),它包含了所有DASH自適應(yīng)視頻的信息女仰。
我們以一個(gè)mpd為例子猜年,點(diǎn)擊這里下載。
讓我們用xml reader來(lái)看看具體里面有什么內(nèi)容:
2.1.1 adaptionset
![](https://github.com/richardissuperman/videoconcepts/blob/master/image4/2.png?raw=true)
每個(gè)mpd文件都會(huì)有至少一個(gè)adaptionset,用來(lái)記錄音頻/視頻文件們的位置疾忍,如上圖所示乔外,該MPd有兩組數(shù)據(jù),一組是視頻一罩,一組是音頻
2.1.2 representation
![](https://github.com/richardissuperman/videoconcepts/blob/master/image4/3.png?raw=true)
每個(gè)adaptionset里面又會(huì)有多個(gè)representation杨幼,每一個(gè)representation其實(shí)就是代表了一個(gè)分辨率的視頻(或者音頻,這里主要以視頻講解為主)擒抛。最重要的三個(gè)參數(shù)我都打上了注解推汽,注意到視頻的url是相對(duì)Url补疑,也就是相對(duì)于該mpd文件的位置歧沪。比如第一個(gè)mp4文件絕對(duì)地址就是mpd的path+file name = http://yt-dash-mse-test.commondatastorage.googleapis.com/media/car-20120827-88.mp4
2.2 DASH對(duì)播放器行為的規(guī)范
mpd文件相信大家也有大致的了解了,那么播放器既然有了mpd文件莲组,那怎么進(jìn)行視頻文件的選擇呢诊胞?
其實(shí)很簡(jiǎn)單,大家都看到了不同的representation都有一個(gè)bandwith的參數(shù)锹杈,這個(gè)參數(shù)規(guī)定了要使用該視頻文件的最低帶寬(如果沒(méi)記錯(cuò)應(yīng)該是以bit為單位撵孤。
以上述mpd為例竭望,視頻分辨率由高到低的bandwith排列是:4190760 bit(4.2MB/s) ,2073921 bit(2.1 MB/s) , 869460 bit(0.9MB/s)....... 播放器每下載一些內(nèi)容邪码,都會(huì)計(jì)算當(dāng)前的下載速度,然后根據(jù)當(dāng)前的下載速度咬清,從最高的分辨率開(kāi)始闭专,一路遍歷直到找到合適的視頻文件奴潘。
這里附上一段ExoPlayer的源代碼,可以更加清晰的了解播放器怎么選擇不同分辨率(其實(shí)代碼非常的簡(jiǎn)單)
![](https://github.com/richardissuperman/videoconcepts/blob/master/image4/6.png?raw=true)
2.3 DASH - Fragmented MP4
我們?cè)诘谝徊糠终f(shuō)過(guò)影钉,自適應(yīng)視頻的文件會(huì)被切割成塊画髓,但是貌似我們看到的都是完整的mp4文件呀,說(shuō)好的切割呢平委?
在DASH規(guī)范中奈虾,每個(gè)mp4都不是普通的mp4,而是一種叫Fragmented Mp4廉赔,中文可以翻譯為分段式MP4文件肉微。它的特殊之處在于,一般的mp4視頻都是一個(gè)moov header昂勉,后面跟上一組mdat數(shù)據(jù)(不清楚文件結(jié)構(gòu)可以參考我的第一篇文章)浪册,而fragmented MP4則會(huì)將視頻數(shù)據(jù)分為多個(gè)mdat塊。
我們用mp4 parser 來(lái)分析一下
![](https://github.com/richardissuperman/videoconcepts/blob/master/image4/5.png?raw=true)
上圖是一個(gè)普通的mp4文件
![](https://github.com/richardissuperman/videoconcepts/blob/master/image4/4.png?raw=true)
上圖則是一個(gè)分段式的mp4文件岗照,我們可以看到文件的mdat被分為了若干塊村象,同時(shí)還有多一個(gè)sdix header,這個(gè)header記錄了每個(gè)mdat的位置和相應(yīng)的大小攒至,和時(shí)間的長(zhǎng)度(一般每個(gè)mdat的時(shí)間長(zhǎng)度都一樣厚者,為若干秒)
3.播放器對(duì)應(yīng)的細(xì)節(jié)
![](http://q.qqbiaoqing.com/q/2016/12/16/716a321e12edcfab54528a7e7bf1a9f9.gif)
(略)。迫吐。库菲。
這次就稍微分享一下自適應(yīng)視頻的大概原理,具體的技術(shù)志膀,例如播放器如何進(jìn)行下載的控制熙宇,下載單位是什么,等等會(huì)在之后對(duì)ExoPlayer源碼的分析中分享溉浙,如果有著急的問(wèn)題可以留言烫止。