摘 要: MP4共享FLV數(shù)據(jù)的研究旨在以極小存儲(chǔ)空間高效方便地實(shí)現(xiàn)MP4文件與FLV文件的數(shù)據(jù)共享,,滿足主流移動(dòng)平臺(tái)的在線視頻播放。通過研究發(fā)現(xiàn),,只需要利用FLV文件1%左右的存儲(chǔ)空間,,就可以支持移動(dòng)設(shè)備觀看FLV視頻內(nèi)容。MP4共享FLV數(shù)據(jù)具有很高的理論價(jià)值和現(xiàn)實(shí)意義,。
關(guān)鍵詞: 視頻網(wǎng)站,;MP4,;FLV;移動(dòng)設(shè)備,;數(shù)據(jù)共享
進(jìn)入Web 2.0時(shí)代后,,國外的Youtube,國內(nèi)的優(yōu)酷,、土豆網(wǎng)等視頻分享網(wǎng)站快速發(fā)展,,F(xiàn)LV因?yàn)檎加玫拇鎯?chǔ)空間小、加載速度快,,已經(jīng)成為各主流視頻網(wǎng)站存儲(chǔ)視頻的主要格式,。隨著移動(dòng)互聯(lián)網(wǎng)的發(fā)展,越來越多的人喜歡在移動(dòng)設(shè)備上觀看在線視頻,,而MP4格式[1]則是IOS,、Android等主流移動(dòng)智能操作系統(tǒng)原生支持的視頻格式。將FLV視頻轉(zhuǎn)化為MP4視頻,,是視頻網(wǎng)站為支持這些移動(dòng)設(shè)備在線觀看的傳統(tǒng)方法,。這種方法的缺點(diǎn)是對(duì)于每個(gè)FLV視頻需要轉(zhuǎn)化出一個(gè)大小相當(dāng)?shù)腗P4文件,占用服務(wù)器巨大的存儲(chǔ)空間[2-3],,同時(shí)需要耗費(fèi)較多的轉(zhuǎn)化時(shí)間。現(xiàn)在越來越多的公司采用HTTP Live Streaming(HLS)[4]將流媒體切分為若干Transport Stream(TS)片段,,然后通過一個(gè)擴(kuò)展的m3u8播放列表文件將這些TS片段集中起來供客戶端播放器接收,。其優(yōu)點(diǎn)是用戶切換進(jìn)度更快,臨時(shí)文件??;缺點(diǎn)是生成和分發(fā)比較復(fù)雜,生成高清視頻TS片段時(shí)服務(wù)器負(fù)載較高,。MP4格式共享FLV格式數(shù)據(jù)的優(yōu)勢(shì)是它能以極小存儲(chǔ)空間高效方便地滿足主流移動(dòng)平臺(tái)的在線視頻播放,。
1 相關(guān)技術(shù)
1.1 FLV視頻格式簡(jiǎn)介
Flash Video(FLV)[5]流媒體格式是隨著Flash MX的推出而發(fā)展而來的視頻格式。FLV文件占用的存儲(chǔ)空間非常小,。FLV還有解碼效率高和視頻清晰等優(yōu)點(diǎn),。因此,主要的在線視頻網(wǎng)站均使用FLV格式文件存儲(chǔ)視頻,,為用戶提供優(yōu)質(zhì)的在線視頻服務(wù),。
FLV是一種全新的流媒體視頻格式,它利用了網(wǎng)頁中廣泛使用的Flash Player平臺(tái),,將FLV視頻整合到Flash動(dòng)畫中,。只要訪問者能夠正常觀看Flash動(dòng)畫,就能觀看FLV格式視頻,,而無需再額外安裝其他視頻插件,。因此,,F(xiàn)LV格式的使用給視頻的傳播帶來了極大便利。
FLV是一個(gè)二進(jìn)制文件,,文件符合流式傳輸?shù)奶攸c(diǎn),,由文件頭(FLV Header)和文件體(FLV Body)組成。FLV文件結(jié)構(gòu)圖如圖1所示,。文件頭定義了Flash文檔的版本,、是否壓縮、文件大小,、場(chǎng)景大小,、幀率和總幀數(shù)[6]。文件體由大量的標(biāo)簽(Tag)組成,,文件體的最后是一個(gè)結(jié)束標(biāo)簽,。Tag又可以分成Audio和Video和Script 3類,分別代表音頻流,、視頻流和腳本流,。每一個(gè)Tag都包括一個(gè)標(biāo)簽頭(Header)和一個(gè)數(shù)據(jù)體(Body)。
通過解析FLV格式而得到的Tag內(nèi)容里的音視頻數(shù)據(jù)就是MP4文件格式所需要共享的FLV文件格式的內(nèi)容,。
由于主流移動(dòng)平臺(tái)對(duì)Flash Player支持不夠,,存儲(chǔ)為FLV格式的視頻不能有效滿足移動(dòng)平臺(tái)觀看,而MP4格式卻是可以得到廣泛支持的視頻格式,,因此將這些FLV視頻轉(zhuǎn)化成MP4格式是視頻網(wǎng)站的傳統(tǒng)做法,。
1.2 MP4視頻格式簡(jiǎn)介
MP4[7],全稱MPEG-4 Part 14[8],,是一種使用MPEG-4的多媒體電腦檔案格式,,后綴名為.mp4。
MP4視頻文件封裝格式是基于QuickTime[8]容器格式定義的,。MP4文件格式是一個(gè)十分開放的容器,,幾乎可以用來描述所有的媒體結(jié)構(gòu),MP4文件中的媒體描述與媒體數(shù)據(jù)是分開的,,并且媒體數(shù)據(jù)的組織也很自由,,不一定要按照時(shí)間順序排列。
MP4文件格式是以面向?qū)ο蟮募軜?gòu)來描述文件的,,對(duì)象被稱為box,。MP4文件中的所有數(shù)據(jù)都裝在box中,也就是說,,MP4文件由若干個(gè)box組成,。每個(gè)box的結(jié)構(gòu)都由大小、類型和內(nèi)容組成。一個(gè)box還可以包含別的box,,這種分層結(jié)構(gòu)以及box的自身結(jié)構(gòu)使得box的插入和刪除十分方便,。
同時(shí),MP4也支持流媒體[9],。MP4目前被廣泛用于封裝H.264[10]視頻和Advanced Audio Coding(AAC)音頻,,是高清視頻的代表。
通過對(duì)FLV和MP4的介紹可知,,如果能將FLV轉(zhuǎn)化MP4的傳統(tǒng)方法加以創(chuàng)新,,使MP4共享FLV數(shù)據(jù),不僅能在存儲(chǔ)空間上大大節(jié)省成本,,計(jì)算效率也能大幅度提高,,具有很高的研究?jī)r(jià)值和現(xiàn)實(shí)意義。
2 MP4文件共享FLV文件媒體數(shù)據(jù)
2.1 MP4格式特點(diǎn)
MP4由一系列的box組成,,box是一種獨(dú)特類型的由識(shí)別符和長(zhǎng)度構(gòu)成的面向?qū)ο蟮慕ㄖK,,也稱為atom。表2列出了常見的box類型,。
通常來說,,一個(gè)MP4文件主要包含兩個(gè)atom,分別是存儲(chǔ)元數(shù)據(jù)的Movie atom(moov)和存儲(chǔ)媒體數(shù)據(jù)的Media Data atom(mdat)[11-14],。
一個(gè)MP4文件由一個(gè)ftyp類型的box開始,,ftyp包含關(guān)于文件的一些信息。ftyp之后有且只有一個(gè)moov類型的box,,它是一種容器box,,子box包含了媒體的元數(shù)據(jù)信息。MP4文件的媒體數(shù)據(jù)包含在mdat類型的box中,,該類型的box也是容器box,可以有多個(gè)子box,。圖2展示了MP4文件的結(jié)構(gòu)樹,。
moov包含了文件媒體的所有元數(shù)據(jù)信息,moov容器box通常在靠近該文件的開頭或結(jié)尾地方,。
trak是一個(gè)container box,,其子box包含了該軌道的媒體數(shù)據(jù)引用和描述。一個(gè)MP4文件中的媒體可以包含多個(gè)track,,并且至少有一個(gè)軌道,,這些軌道之間彼此獨(dú)立,有各自的時(shí)間和空間信息,。
mdia容器的軌道媒體信息定義了軌道媒體類型,。
minf容器包含了所有關(guān)于軌道媒體中定義特征信息的對(duì)象。
stbl樣品表box包含了軌道里所有媒體樣本的時(shí)間和數(shù)據(jù)索引信息,。通過樣本表,,可以定位樣本的時(shí)間,,確定它們的類型(例如I-幀),并確定它們的大小以及文件中的偏移量,。
stsc提供樣本塊的部分?jǐn)?shù)據(jù)的偏移信息表,。媒體數(shù)據(jù)里的樣本被分組為塊。塊可以是不同的大小,,塊內(nèi)的樣本可以具有不同的尺寸,。這個(gè)表可以用于找到塊的位置以及相關(guān)的樣本描述。偏移信息表是緊湊的編碼,。每個(gè)條目給出運(yùn)行塊的第一個(gè)塊的索引,。
stsz包含樣本數(shù)和一張描述各個(gè)樣本大小(以字節(jié)為單位)的表,。
stso,、co64對(duì)象包含一張塊的偏移表,表里給出了文件中每個(gè)塊的索引,,允許使用32位或64位偏移,,64位偏移在文件超過4 GB時(shí)使用。
2.2 MP4文件共享FLV文件數(shù)據(jù)
MP4文件中的媒體描述與媒體數(shù)據(jù)是分開的[6],,MP4的媒體數(shù)據(jù)的組織也很自由,,可以不用按照時(shí)間順序排列。MP4文件共享FLV文件媒體數(shù)據(jù)關(guān)鍵就在于生成一個(gè)共享FLV媒體數(shù)據(jù)的MP4文件頭部,,稱為共享MP4頭部,。
共享MP4頭部在媒體描述中的stco box記錄每個(gè)媒體數(shù)據(jù)數(shù)據(jù)塊在完整MP4文件中位置,完整MP4文件由共享MP4頭部和對(duì)應(yīng)的FLV文件組成,。即在原有FLV文件的基礎(chǔ)上,,再增加一個(gè)只有FLV文件1%左右大小的共享MP4頭部,就可以共享FLV文件的視頻內(nèi)容,。
對(duì)于在線視頻網(wǎng)站,,可以不用在視頻服務(wù)器里為每個(gè)FLV視頻轉(zhuǎn)化一個(gè)完整的MP4視頻,視頻網(wǎng)站可以通過生成共享MP4頭部共享FLV視頻數(shù)據(jù),,節(jié)省巨大的存儲(chǔ)空間,。
對(duì)于一個(gè)已經(jīng)存在FLV文件格式的視頻,只需要用共享工具生成對(duì)應(yīng)的共享MP4頭部,,就可以同時(shí)滿足對(duì)這個(gè)視頻的FLV和MP4兩種格式的訪問需求,。
當(dāng)用戶通過移動(dòng)設(shè)備觀看某個(gè)視頻時(shí),視頻網(wǎng)絡(luò)的服務(wù)器只需要順序返回這個(gè)視頻的共享MP4頭部和FLV視頻文件即可,。
MP4文件共享FLV文件數(shù)據(jù)方案以極小的存儲(chǔ)代價(jià)和計(jì)算代價(jià),,滿足了移動(dòng)設(shè)備觀看已經(jīng)存在的海量FLV視頻文件的需求。
2.3 基于FFMPEG庫的共享工具簡(jiǎn)介
MP4文件共享FLV文件數(shù)據(jù)的共享工具主要是在開源項(xiàng)目FFMPEG的基礎(chǔ)上實(shí)現(xiàn)的。
FFMPEG是一個(gè)非常優(yōu)秀的開源免費(fèi)跨平臺(tái)的視頻和音頻流方案,,屬于自由軟件,,采用LGPL或GPL許可證(依據(jù)所選擇的組件)。它提供了錄制,、轉(zhuǎn)換以及流化音視頻的完整解決方案,。
FFMPEG是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻,、視頻,,并能將其轉(zhuǎn)化為流的開源計(jì)算機(jī)程序。它包括了目前領(lǐng)先的音/視頻編碼庫libavcodec等,。
共享工具主要使用了FFMPEG庫里的libavformat,、libavcodec和ffmpeg項(xiàng)目。libavformat用于各種音視頻封裝格式的生成和解析,,包括獲取解碼所需信息以生成解碼上下文結(jié)構(gòu)和讀取音視頻幀等功能,;libavcodec用于各種類型聲音/圖像編解碼;ffmpeg項(xiàng)目提供的一個(gè)工具可用于格式轉(zhuǎn)換,、解碼等,。
2.4 共享工具生成共享MP4文件
共享工具生成共享MP4文件,首先需要將FLV文件解封裝提取出FLV文件中的視頻信息,,然后將這些視頻描述信息寫入共享MP4文件中,。
在FLV文件中解析出的每個(gè)標(biāo)簽里,數(shù)據(jù)區(qū)的內(nèi)容是需要共享的內(nèi)容,,也是FLV文件里的最主要組成部分,。將FLV文件中每個(gè)標(biāo)簽的數(shù)據(jù)區(qū)在FLV文件中的偏移值記錄在共享MP4文件的stco對(duì)象中,將FLV的每個(gè)標(biāo)簽的數(shù)據(jù)區(qū)長(zhǎng)度記錄在共享MP4文件的stsz對(duì)象中,。
共享MP4文件的mdat對(duì)象的大小就是FLV文件的大小,,mdat對(duì)象的內(nèi)容則不需要寫入共享MP4文件,因?yàn)閙dat對(duì)象內(nèi)容正是對(duì)應(yīng)的整個(gè)FLV文件,。共享MP4文件和對(duì)應(yīng)的FLV文件可以組成一個(gè)完整的MP4文件,。
共享工具需要生成的共享MP4文件是一個(gè)除去mdat對(duì)象內(nèi)容的MP4文件。在初始生成共享MP4文件過程中,,需要在共享MP4文件的stco對(duì)象中記錄對(duì)應(yīng)FLV中每個(gè)音視頻標(biāo)簽的內(nèi)容數(shù)據(jù)在FLV文件的位置,,即共享MP4文件stco對(duì)象存儲(chǔ)著FLV文件中標(biāo)簽的內(nèi)容的偏移值,,如圖3所示,。
2.5 修正共享MP4文件
共享工具初始生成的共享MP4文件中的stco對(duì)象記錄的偏移值是在FLV文件中的偏移值,不是共享MP4文件和FLV文件組合成的完整MP4文件中的偏移值,,因此需要修正共享MP4文件的stco對(duì)象中記錄的原始偏移值,。需要將共享MP4文件的stco對(duì)象中的原始偏移值加上共享MP4文件的大小,如圖4所示,這樣得出的位置值才是共享MP4文件和對(duì)應(yīng)FLV文件組合成的完整MP4文件里的真實(shí)偏移值,。
本文主要研究了一種傳統(tǒng)流媒體文件FLV在適應(yīng)移動(dòng)設(shè)備上播放的一種高效,、節(jié)約成本的可行性方案。MP4共享FLV數(shù)據(jù)利用MP4和FLV兩種格式的特點(diǎn)達(dá)到數(shù)據(jù)共享的目的,,從而滿足了移動(dòng)設(shè)備在線觀看的需求,。
相對(duì)于直接轉(zhuǎn)換MP4文件的方式,MP4文件共享FLV文件數(shù)據(jù)方案節(jié)約了近一半的存儲(chǔ)空間,,并且對(duì)于計(jì)算的消耗極小,。對(duì)于擁有上千萬部FLV視頻內(nèi)容的視頻網(wǎng)站,利用共享數(shù)據(jù)方案可節(jié)省上千萬元的存儲(chǔ)成本,,且維護(hù)起來非常方便,、可靠。相對(duì)于TS流方案,,MP4文件共享FLV文件數(shù)據(jù)方案對(duì)源服務(wù)器的負(fù)載壓力小很多,,且生成、分發(fā)以及維護(hù)也簡(jiǎn)單很多,。
由于MP4文件播放前需要加載完整個(gè)頭部才能播放,,因此對(duì)于低質(zhì)量的長(zhǎng)視頻文件,利用HLS協(xié)議提供服務(wù)體驗(yàn)會(huì)更好,;對(duì)于高清短視頻,,使用MP4文件共享FLV文件數(shù)據(jù)方案是最佳選擇。
參考文獻(xiàn)
[1] SINGER D,, BELKNAP W,, FRANCESCHINI G. ISO media file format specif ication[R]. ISO/IEC JTC1/SC29/WG11 MPEG01/N4270-1, 2001.
[2] 陳利,,呂格莉,,潘正清.流媒體視頻存儲(chǔ)服務(wù)器設(shè)計(jì)與研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2010,,31(4):903-906
[3] 謝建國,,陳松喬.視頻存儲(chǔ)技術(shù)發(fā)展綜述[J].計(jì)算機(jī)工程與應(yīng)用,2002,,38(9):17-19.
[4] 維基百科.http://zh.wikipedia.org/wiki/HTTP_ Live_Streaming,,2013-03-14.
[5] Adobe Macromedia video file format specification version10.http://download.macromedia.com/f4v/video_file_format_spec_v10_ 1.pdf,2013-04.
[6] 王奎澎,,劉建輝.Flv文件格式及其嵌入式應(yīng)用[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,,2010,19(3):190-191.
[7] ISO/IEC 14496-14,, information technology-coding of audio-visual objects-part 14: MP4 file format[S].
[8] ISO/IEC 14496-10,, information technology-coding of audio-visual objects-part 10: Advanced video coding[S].
[9] Apple. QuickTime file format specification[S].
[10] THOMAS W,, GARY S, GISLE B,, et al. Overview of the H.264 PAVC video coding standard[J]. IEEE Transactions on Circuits and Systems for Video Technology,, 2003(7):560-576.
[11] ISMA. Internet streaming media alliance implementation specification(Version 2.0)[M].
[12] 周瑾,支琤,,宋利.流媒體應(yīng)用TS和MP4格式分析[J].信息技術(shù),,2007(7):16-18.
[13] 趙麗娜,韓冬梅,,薛華成.一種有效加密MP4文件的方法[J].計(jì)算機(jī)應(yīng)用與軟件,,2010,10(10):22-23.
[14] 鄭翔,,周秉峰,,葉志遠(yuǎn),等.流文件MP4文件的核心技術(shù)[J].計(jì)算機(jī)應(yīng)用,,2004(5):76-78.