摘 要: MP4共享FLV數(shù)據(jù)的研究旨在以極小存儲空間高效方便地實(shí)現(xiàn)MP4文件與FLV文件的數(shù)據(jù)共享,,滿足主流移動平臺的在線視頻播放。通過研究發(fā)現(xiàn),,只需要利用FLV文件1%左右的存儲空間,,就可以支持移動設(shè)備觀看FLV視頻內(nèi)容。MP4共享FLV數(shù)據(jù)具有很高的理論價值和現(xiàn)實(shí)意義,。
關(guān)鍵詞: 視頻網(wǎng)站,;MP4;FLV,;移動設(shè)備,;數(shù)據(jù)共享
進(jìn)入Web 2.0時代后,國外的Youtube,,國內(nèi)的優(yōu)酷,、土豆網(wǎng)等視頻分享網(wǎng)站快速發(fā)展,F(xiàn)LV因?yàn)檎加玫拇鎯臻g小,、加載速度快,,已經(jīng)成為各主流視頻網(wǎng)站存儲視頻的主要格式,。隨著移動互聯(lián)網(wǎng)的發(fā)展,越來越多的人喜歡在移動設(shè)備上觀看在線視頻,,而MP4格式[1]則是IOS,、Android等主流移動智能操作系統(tǒng)原生支持的視頻格式。將FLV視頻轉(zhuǎn)化為MP4視頻,,是視頻網(wǎng)站為支持這些移動設(shè)備在線觀看的傳統(tǒng)方法。這種方法的缺點(diǎn)是對于每個FLV視頻需要轉(zhuǎn)化出一個大小相當(dāng)?shù)腗P4文件,,占用服務(wù)器巨大的存儲空間[2-3],,同時需要耗費(fèi)較多的轉(zhuǎn)化時間。現(xiàn)在越來越多的公司采用HTTP Live Streaming(HLS)[4]將流媒體切分為若干Transport Stream(TS)片段,,然后通過一個擴(kuò)展的m3u8播放列表文件將這些TS片段集中起來供客戶端播放器接收,。其優(yōu)點(diǎn)是用戶切換進(jìn)度更快,臨時文件??;缺點(diǎn)是生成和分發(fā)比較復(fù)雜,生成高清視頻TS片段時服務(wù)器負(fù)載較高,。MP4格式共享FLV格式數(shù)據(jù)的優(yōu)勢是它能以極小存儲空間高效方便地滿足主流移動平臺的在線視頻播放,。
1 相關(guān)技術(shù)
1.1 FLV視頻格式簡介
Flash Video(FLV)[5]流媒體格式是隨著Flash MX的推出而發(fā)展而來的視頻格式。FLV文件占用的存儲空間非常小,。FLV還有解碼效率高和視頻清晰等優(yōu)點(diǎn),。因此,主要的在線視頻網(wǎng)站均使用FLV格式文件存儲視頻,,為用戶提供優(yōu)質(zhì)的在線視頻服務(wù),。
FLV是一種全新的流媒體視頻格式,它利用了網(wǎng)頁中廣泛使用的Flash Player平臺,,將FLV視頻整合到Flash動畫中,。只要訪問者能夠正常觀看Flash動畫,就能觀看FLV格式視頻,,而無需再額外安裝其他視頻插件,。因此,F(xiàn)LV格式的使用給視頻的傳播帶來了極大便利,。
FLV是一個二進(jìn)制文件,,文件符合流式傳輸?shù)奶攸c(diǎn),由文件頭(FLV Header)和文件體(FLV Body)組成,。FLV文件結(jié)構(gòu)圖如圖1所示,。文件頭定義了Flash文檔的版本、是否壓縮,、文件大小,、場景大小,、幀率和總幀數(shù)[6]。文件體由大量的標(biāo)簽(Tag)組成,,文件體的最后是一個結(jié)束標(biāo)簽,。Tag又可以分成Audio和Video和Script 3類,分別代表音頻流,、視頻流和腳本流,。每一個Tag都包括一個標(biāo)簽頭(Header)和一個數(shù)據(jù)體(Body)。
通過解析FLV格式而得到的Tag內(nèi)容里的音視頻數(shù)據(jù)就是MP4文件格式所需要共享的FLV文件格式的內(nèi)容,。
由于主流移動平臺對Flash Player支持不夠,,存儲為FLV格式的視頻不能有效滿足移動平臺觀看,而MP4格式卻是可以得到廣泛支持的視頻格式,,因此將這些FLV視頻轉(zhuǎn)化成MP4格式是視頻網(wǎng)站的傳統(tǒng)做法,。
1.2 MP4視頻格式簡介
MP4[7],全稱MPEG-4 Part 14[8],,是一種使用MPEG-4的多媒體電腦檔案格式,,后綴名為.mp4。
MP4視頻文件封裝格式是基于QuickTime[8]容器格式定義的,。MP4文件格式是一個十分開放的容器,,幾乎可以用來描述所有的媒體結(jié)構(gòu),MP4文件中的媒體描述與媒體數(shù)據(jù)是分開的,,并且媒體數(shù)據(jù)的組織也很自由,,不一定要按照時間順序排列。
MP4文件格式是以面向?qū)ο蟮募軜?gòu)來描述文件的,,對象被稱為box,。MP4文件中的所有數(shù)據(jù)都裝在box中,也就是說,,MP4文件由若干個box組成,。每個box的結(jié)構(gòu)都由大小、類型和內(nèi)容組成,。一個box還可以包含別的box,,這種分層結(jié)構(gòu)以及box的自身結(jié)構(gòu)使得box的插入和刪除十分方便。
同時,,MP4也支持流媒體[9],。MP4目前被廣泛用于封裝H.264[10]視頻和Advanced Audio Coding(AAC)音頻,是高清視頻的代表,。
通過對FLV和MP4的介紹可知,,如果能將FLV轉(zhuǎn)化MP4的傳統(tǒng)方法加以創(chuàng)新,使MP4共享FLV數(shù)據(jù),,不僅能在存儲空間上大大節(jié)省成本,,計(jì)算效率也能大幅度提高,,具有很高的研究價值和現(xiàn)實(shí)意義。
2 MP4文件共享FLV文件媒體數(shù)據(jù)
2.1 MP4格式特點(diǎn)
MP4由一系列的box組成,,box是一種獨(dú)特類型的由識別符和長度構(gòu)成的面向?qū)ο蟮慕ㄖK,,也稱為atom。表2列出了常見的box類型,。
通常來說,,一個MP4文件主要包含兩個atom,分別是存儲元數(shù)據(jù)的Movie atom(moov)和存儲媒體數(shù)據(jù)的Media Data atom(mdat)[11-14],。
一個MP4文件由一個ftyp類型的box開始,,ftyp包含關(guān)于文件的一些信息。ftyp之后有且只有一個moov類型的box,,它是一種容器box,子box包含了媒體的元數(shù)據(jù)信息,。MP4文件的媒體數(shù)據(jù)包含在mdat類型的box中,,該類型的box也是容器box,可以有多個子box,。圖2展示了MP4文件的結(jié)構(gòu)樹,。
moov包含了文件媒體的所有元數(shù)據(jù)信息,moov容器box通常在靠近該文件的開頭或結(jié)尾地方,。
trak是一個container box,,其子box包含了該軌道的媒體數(shù)據(jù)引用和描述。一個MP4文件中的媒體可以包含多個track,,并且至少有一個軌道,,這些軌道之間彼此獨(dú)立,有各自的時間和空間信息,。
mdia容器的軌道媒體信息定義了軌道媒體類型,。
minf容器包含了所有關(guān)于軌道媒體中定義特征信息的對象。
stbl樣品表box包含了軌道里所有媒體樣本的時間和數(shù)據(jù)索引信息,。通過樣本表,,可以定位樣本的時間,確定它們的類型(例如I-幀),,并確定它們的大小以及文件中的偏移量,。
stsc提供樣本塊的部分?jǐn)?shù)據(jù)的偏移信息表。媒體數(shù)據(jù)里的樣本被分組為塊,。塊可以是不同的大小,,塊內(nèi)的樣本可以具有不同的尺寸。這個表可以用于找到塊的位置以及相關(guān)的樣本描述,。偏移信息表是緊湊的編碼,。每個條目給出運(yùn)行塊的第一個塊的索引,。
stsz包含樣本數(shù)和一張描述各個樣本大小(以字節(jié)為單位)的表,。
stso,、co64對象包含一張塊的偏移表,表里給出了文件中每個塊的索引,,允許使用32位或64位偏移,,64位偏移在文件超過4 GB時使用。
2.2 MP4文件共享FLV文件數(shù)據(jù)
MP4文件中的媒體描述與媒體數(shù)據(jù)是分開的[6],,MP4的媒體數(shù)據(jù)的組織也很自由,,可以不用按照時間順序排列。MP4文件共享FLV文件媒體數(shù)據(jù)關(guān)鍵就在于生成一個共享FLV媒體數(shù)據(jù)的MP4文件頭部,,稱為共享MP4頭部,。
共享MP4頭部在媒體描述中的stco box記錄每個媒體數(shù)據(jù)數(shù)據(jù)塊在完整MP4文件中位置,完整MP4文件由共享MP4頭部和對應(yīng)的FLV文件組成,。即在原有FLV文件的基礎(chǔ)上,,再增加一個只有FLV文件1%左右大小的共享MP4頭部,就可以共享FLV文件的視頻內(nèi)容,。
對于在線視頻網(wǎng)站,,可以不用在視頻服務(wù)器里為每個FLV視頻轉(zhuǎn)化一個完整的MP4視頻,視頻網(wǎng)站可以通過生成共享MP4頭部共享FLV視頻數(shù)據(jù),,節(jié)省巨大的存儲空間,。
對于一個已經(jīng)存在FLV文件格式的視頻,只需要用共享工具生成對應(yīng)的共享MP4頭部,,就可以同時滿足對這個視頻的FLV和MP4兩種格式的訪問需求,。
當(dāng)用戶通過移動設(shè)備觀看某個視頻時,視頻網(wǎng)絡(luò)的服務(wù)器只需要順序返回這個視頻的共享MP4頭部和FLV視頻文件即可,。
MP4文件共享FLV文件數(shù)據(jù)方案以極小的存儲代價和計(jì)算代價,,滿足了移動設(shè)備觀看已經(jīng)存在的海量FLV視頻文件的需求。
2.3 基于FFMPEG庫的共享工具簡介
MP4文件共享FLV文件數(shù)據(jù)的共享工具主要是在開源項(xiàng)目FFMPEG的基礎(chǔ)上實(shí)現(xiàn)的,。
FFMPEG是一個非常優(yōu)秀的開源免費(fè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)目提供的一個工具可用于格式轉(zhuǎn)換,、解碼等,。
2.4 共享工具生成共享MP4文件
共享工具生成共享MP4文件,首先需要將FLV文件解封裝提取出FLV文件中的視頻信息,,然后將這些視頻描述信息寫入共享MP4文件中,。
在FLV文件中解析出的每個標(biāo)簽里,數(shù)據(jù)區(qū)的內(nèi)容是需要共享的內(nèi)容,,也是FLV文件里的最主要組成部分,。將FLV文件中每個標(biāo)簽的數(shù)據(jù)區(qū)在FLV文件中的偏移值記錄在共享MP4文件的stco對象中,將FLV的每個標(biāo)簽的數(shù)據(jù)區(qū)長度記錄在共享MP4文件的stsz對象中,。
共享MP4文件的mdat對象的大小就是FLV文件的大小,,mdat對象的內(nèi)容則不需要寫入共享MP4文件,因?yàn)閙dat對象內(nèi)容正是對應(yīng)的整個FLV文件,。共享MP4文件和對應(yīng)的FLV文件可以組成一個完整的MP4文件,。
共享工具需要生成的共享MP4文件是一個除去mdat對象內(nèi)容的MP4文件,。在初始生成共享MP4文件過程中,,需要在共享MP4文件的stco對象中記錄對應(yīng)FLV中每個音視頻標(biāo)簽的內(nèi)容數(shù)據(jù)在FLV文件的位置,即共享MP4文件stco對象存儲著FLV文件中標(biāo)簽的內(nèi)容的偏移值,,如圖3所示,。
2.5 修正共享MP4文件
共享工具初始生成的共享MP4文件中的stco對象記錄的偏移值是在FLV文件中的偏移值,不是共享MP4文件和FLV文件組合成的完整MP4文件中的偏移值,,因此需要修正共享MP4文件的stco對象中記錄的原始偏移值,。需要將共享MP4文件的stco對象中的原始偏移值加上共享MP4文件的大小,如圖4所示,,這樣得出的位置值才是共享MP4文件和對應(yīng)FLV文件組合成的完整MP4文件里的真實(shí)偏移值,。
本文主要研究了一種傳統(tǒng)流媒體文件FLV在適應(yīng)移動設(shè)備上播放的一種高效、節(jié)約成本的可行性方案,。MP4共享FLV數(shù)據(jù)利用MP4和FLV兩種格式的特點(diǎn)達(dá)到數(shù)據(jù)共享的目的,,從而滿足了移動設(shè)備在線觀看的需求。
相對于直接轉(zhuǎn)換MP4文件的方式,,MP4文件共享FLV文件數(shù)據(jù)方案節(jié)約了近一半的存儲空間,,并且對于計(jì)算的消耗極小。對于擁有上千萬部FLV視頻內(nèi)容的視頻網(wǎng)站,利用共享數(shù)據(jù)方案可節(jié)省上千萬元的存儲成本,,且維護(hù)起來非常方便,、可靠。相對于TS流方案,,MP4文件共享FLV文件數(shù)據(jù)方案對源服務(wù)器的負(fù)載壓力小很多,,且生成、分發(fā)以及維護(hù)也簡單很多,。
由于MP4文件播放前需要加載完整個頭部才能播放,,因此對于低質(zhì)量的長視頻文件,利用HLS協(xié)議提供服務(wù)體驗(yàn)會更好,;對于高清短視頻,,使用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] 陳利,,呂格莉,,潘正清.流媒體視頻存儲服務(wù)器設(shè)計(jì)與研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2010,,31(4):903-906
[3] 謝建國,,陳松喬.視頻存儲技術(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.