[黃潤懷 陳戈]
MP4文件格式是目前各大影音網(wǎng)站使用的主流格式,客戶端從服務(wù)器逐步獲取MP4文件并進(jìn)行播放。MP4文件有一個(gè)最重要的組成部分稱為MP4BOX,MP4BOX中不包含具體媒體數(shù)據(jù),但包含MP4文件中所有媒體數(shù)據(jù)的宏觀描述信息,記錄了創(chuàng)建時(shí)間、修改時(shí)間、時(shí)間度量標(biāo)尺、可播放時(shí)長等,以及文件中每個(gè)媒體軌道的具體信息。MP4文件需要通過配合MP4BOX中的信息才能夠進(jìn)行播放。
在現(xiàn)有技術(shù)中,播放器要播放一個(gè)MP4格式的內(nèi)容,就首先需要下載MP4BOX,只有下載完MP4BOX后,才能獲得播放的必要信息,播放器播放啟動(dòng)等待時(shí)間長。為優(yōu)化MP4播放等待時(shí)長問題,業(yè)界在編碼時(shí),即對MP4BOX進(jìn)行優(yōu)化,如把MP4切成小分片,每個(gè)小分片有一個(gè)MP4BOX,或直接使用DASH等MP4分片新格式。
對于CDN已經(jīng)存儲(chǔ)的海量MP4文件而言,對其進(jìn)行重編碼和重新注入是一件極為費(fèi)時(shí)費(fèi)力的工作。本文提出了一種CDN存量MP4視頻播放優(yōu)化方法,并在實(shí)際應(yīng)用取得了較好的效果。
為優(yōu)化CDN MP4存量內(nèi)容的播放速度,可在現(xiàn)有MP4文件的基本上為其增加相應(yīng)索引,如圖1所示。
圖1 CDN對MP4文件虛擬分片的交互架構(gòu)
CDN掃描存量的MP4文件,并成生一個(gè)外部索引文件頭,其中,MP4文件被虛擬切分為多個(gè)分片,索引文件頭包括各個(gè)分片的分片文件頭索引。播放器可根據(jù)分片文件頭索引獲取分片文件頭,并根據(jù)分片文件頭獲取并播放分片。
分片文件頭索引為分片文件頭的地址索引或存儲(chǔ)分片文件頭地址的路徑索引。為支持拖動(dòng)、快進(jìn)等損傷,索引文件頭還包括各分片的時(shí)間范圍,播放器在響應(yīng)用戶的拖動(dòng)操作時(shí),根據(jù)分片文件頭索引確定拖動(dòng)位置所在的分片,并向CDN服務(wù)器發(fā)送獲取分片請求,獲取分片請求包含對應(yīng)分片和用戶拖動(dòng)位置信息的請求。
MP4索引文件頭可以是Json格式的文件,索引文件頭中可以包含表1所示的關(guān)鍵字。
表1 MP4索引文件頭信息
根據(jù)索引文件頭中的URL信息可以得到分片文件頭的地址。分片文件頭可以與MP4文件分片分離存儲(chǔ),同一個(gè)MP4文件的分片文件頭可以存儲(chǔ)在一起。同一個(gè)MP4文件的分片文件頭以一個(gè)結(jié)構(gòu)體與所有的分片文件頭連續(xù)存儲(chǔ)而成,其中存儲(chǔ)在分片文件頭之前的結(jié)構(gòu)體的定義如下:
在結(jié)構(gòu)體MP4ClipHeader中定義了分片的數(shù)目mdwClipCount,和與分片數(shù)目相等的MP4ClipInfo結(jié)構(gòu)體。每個(gè)MP4ClipInfo結(jié)構(gòu)體對應(yīng)一個(gè)分片的分片文件頭和分片內(nèi)容信息,其中,mdwHeaderStartPos為分片頭在頭文件中的起始位置,mdwHeaderLength為分片頭的長度,mllContentStartPos為分片內(nèi)容在原始文件中的起始位置,mdwContentLength為分片內(nèi)容的長度。
索引文件頭中的分片文件頭索引中包含MP4ClipHeader結(jié)構(gòu)體的地址信息,由于每個(gè)MP4ClipInfo所占用空間相同,因此可以用MP4ClipInfo占用的空間×(分片序號(hào)-1)+4的計(jì)算式獲得對應(yīng)分片的MP4ClipInfo地址,從而獲得對應(yīng)分片文件頭的地址,確定分片文件的地址。
為支持虛擬MP4分片,播放器也需要進(jìn)行升級(jí),升級(jí)后的播放器需支持MP4虛擬分片的外部索引,并根據(jù)索引信息進(jìn)行相應(yīng)的播放操作。播放器支持的分片文件頭索引內(nèi)容簡單,只需MP4ClipHeader結(jié)構(gòu)體的地址信息、每個(gè)MP4ClipInfo所占用空間和分片序號(hào)即能計(jì)算得到分片文件頭地址的存儲(chǔ)路徑。這種方式能夠有效縮小索引文件頭,簡短客戶端從服務(wù)器獲取索引文件頭的時(shí)間。
播放器訪問虛擬分片的業(yè)務(wù)流程如圖2所示。
圖2 升級(jí)后的播放器訪問虛擬分片的業(yè)務(wù)流程
如圖2所示的業(yè)務(wù)流程,CDN可通過判斷客戶端的版本,為播放器提供不同的流服務(wù)。對于未升級(jí)不支持虛擬分片的播放器,CDN為其提供原有的流服務(wù),對于已升級(jí)的播放器,CDN為其提供如圖2所示的流服務(wù)。
CDN服務(wù)器接收到播放器獲取分片請求消息之后的處理流程可以如圖3所示。
如圖3所示的CDN處理流程中可以看出,虛擬分片的處理工作,大部分交由了CDN來進(jìn)行處理,播放器升級(jí)的地方很少。
服務(wù)器接收到客戶端的獲取分片請求后,服務(wù)器判斷請求中是否含有查詢字符串,如果不含查詢字符串,判斷該請求不是MP4分片請求;否則服務(wù)器解析請求,獲取請求的分片序號(hào)。服務(wù)器計(jì)算請求的分片文件頭的地址信息的存放位置。服務(wù)器讀取分片文件頭存儲(chǔ)的地址信息。服務(wù)器根據(jù)分片文件頭的地址讀取分片文件頭的內(nèi)容。經(jīng)過以上的步驟,服務(wù)器根據(jù)收到的獲取分片請求讀取到了分片文件頭信息。
圖3 CDN響應(yīng)客戶端的處理流程示意
服務(wù)器判斷獲取分片請求中是否含有定位信息。定位信息是用戶拖動(dòng)分片,并且拖動(dòng)點(diǎn)不在分片的起始位置的標(biāo)識(shí),如果含有定位信息,則服務(wù)器讀取原分片文件頭和分片的信息,根據(jù)定位信息構(gòu)造新的分片文件頭。如果不含有定位信息,則服務(wù)器讀取分片文件頭對應(yīng)的分片。對于請求中有定位信息的情況,服務(wù)器讀取的是根據(jù)定位信息構(gòu)造的新的分片。
服務(wù)器根據(jù)定位信息,計(jì)算新的分片的起始地址,構(gòu)造新的分片。在MP4文件的分片為邏輯分片,分片文件頭單獨(dú)存儲(chǔ)的情況下,新的分片的起始地址=原分片的起始地址+拖動(dòng)位置的媒體內(nèi)容在所處分片的相對地址;在MP4文件的分片與對應(yīng)的分片文件頭連續(xù)存儲(chǔ),且分片文件頭存儲(chǔ)在對應(yīng)分片之前的情況下,新的分片的起始地址=原分片的起始地址+拖動(dòng)位置的媒體內(nèi)容在所處分片的相對地址-原分片的分片文件頭長。
本文方案由于無需對CDN存量內(nèi)容進(jìn)行重編碼、重注入,同時(shí),播放器升級(jí)改造簡單,也兼容客戶端不升級(jí)方案,因此,在實(shí)際應(yīng)用中,大大提升了用戶MP4視頻的播放速度,取得了較好的應(yīng)用效果。