摘 要: MP4共享FLV數(shù)據(jù)的研究旨在以極小存儲空間高效方便地實(shí)現(xiàn)MP4文件與FLV文件的數(shù)據(jù)共享,滿足主流移動(dòng)平臺的在線視頻播放。通過研究發(fā)現(xiàn),只需要利用FLV文件1%左右的存儲空間,就可以支持移動(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)檎加玫拇鎯臻g小、加載速度快,已經(jīng)成為各主流視頻網(wǎng)站存儲視頻的主要格式。隨著移動(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)是對于每個(gè)FLV視頻需要轉(zhuǎn)化出一個(gè)大小相當(dāng)?shù)腗P4文件,占用服務(wù)器巨大的存儲空間[2-3],同時(shí)需要耗費(fèi)較多的轉(zhuǎn)化時(shí)間?,F(xiàn)在越來越多的公司采用HTTP Live Streaming(HLS)[4]將流媒體切分為若干Transport Stream(TS)片段,然后通過一個(gè)擴(kuò)展的m3u8播放列表文件將這些TS片段集中起來供客戶端播放器接收。其優(yōu)點(diǎn)是用戶切換進(jìn)度更快,臨時(shí)文件?。蝗秉c(diǎn)是生成和分發(fā)比較復(fù)雜,生成高清視頻TS片段時(shí)服務(wù)器負(fù)載較高。MP4格式共享FLV格式數(shù)據(jù)的優(yōu)勢是它能以極小存儲空間高效方便地滿足主流移動(dòng)平臺的在線視頻播放。
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動(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文檔的版本、是否壓縮、文件大小、場景大小、幀率和總幀數(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)平臺對Flash Player支持不夠,存儲為FLV格式的視頻不能有效滿足移動(dòng)平臺觀看,而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文件格式是一個(gè)十分開放的容器,幾乎可以用來描述所有的媒體結(jié)構(gòu),MP4文件中的媒體描述與媒體數(shù)據(jù)是分開的,并且媒體數(shù)據(jù)的組織也很自由,不一定要按照時(shí)間順序排列。
MP4文件格式是以面向?qū)ο蟮募軜?gòu)來描述文件的,對象被稱為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)音頻,是高清視頻的代表。
通過對FLV和MP4的介紹可知,如果能將FLV轉(zhuǎn)化MP4的傳統(tǒng)方法加以創(chuàng)新,使MP4共享FLV數(shù)據(jù),不僅能在存儲空間上大大節(jié)省成本,計(jì)算效率也能大幅度提高,具有很高的研究價(jià)值和現(xiàn)實(shí)意義。
2 MP4文件共享FLV文件媒體數(shù)據(jù)
2.1 MP4格式特點(diǎn)
MP4由一系列的box組成,box是一種獨(dú)特類型的由識別符和長度構(gòu)成的面向?qū)ο蟮慕ㄖK,也稱為atom。表2列出了常見的box類型。
通常來說,一個(gè)MP4文件主要包含兩個(gè)atom,分別是存儲元數(shù)據(jù)的Movie atom(moov)和存儲媒體數(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)于軌道媒體中定義特征信息的對象。
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對象包含一張塊的偏移表,表里給出了文件中每個(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頭部和對應(yīng)的FLV文件組成。即在原有FLV文件的基礎(chǔ)上,再增加一個(gè)只有FLV文件1%左右大小的共享MP4頭部,就可以共享FLV文件的視頻內(nèi)容。
對于在線視頻網(wǎng)站,可以不用在視頻服務(wù)器里為每個(gè)FLV視頻轉(zhuǎn)化一個(gè)完整的MP4視頻,視頻網(wǎng)站可以通過生成共享MP4頭部共享FLV視頻數(shù)據(jù),節(jié)省巨大的存儲空間。
對于一個(gè)已經(jīng)存在FLV文件格式的視頻,只需要用共享工具生成對應(yīng)的共享MP4頭部,就可以同時(shí)滿足對這個(gè)視頻的FLV和MP4兩種格式的訪問需求。
當(dāng)用戶通過移動(dòng)設(shè)備觀看某個(gè)視頻時(shí),視頻網(wǎng)絡(luò)的服務(wù)器只需要順序返回這個(gè)視頻的共享MP4頭部和FLV視頻文件即可。
MP4文件共享FLV文件數(shù)據(jù)方案以極小的存儲代價(jià)和計(jì)算代價(jià),滿足了移動(dòng)設(shè)備觀看已經(jīng)存在的海量FLV視頻文件的需求。
2.3 基于FFMPEG庫的共享工具簡介
MP4文件共享FLV文件數(shù)據(jù)的共享工具主要是在開源項(xiàng)目FFMPEG的基礎(chǔ)上實(shí)現(xiàn)的。
FFMPEG是一個(gè)非常優(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)目提供的一個(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對象中,將FLV的每個(gè)標(biāo)簽的數(shù)據(jù)區(qū)長度記錄在共享MP4文件的stsz對象中。
共享MP4文件的mdat對象的大小就是FLV文件的大小,mdat對象的內(nèi)容則不需要寫入共享MP4文件,因?yàn)閙dat對象內(nèi)容正是對應(yīng)的整個(gè)FLV文件。共享MP4文件和對應(yīng)的FLV文件可以組成一個(gè)完整的MP4文件。
共享工具需要生成的共享MP4文件是一個(gè)除去mdat對象內(nèi)容的MP4文件。在初始生成共享MP4文件過程中,需要在共享MP4文件的stco對象中記錄對應(yīng)FLV中每個(gè)音視頻標(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)移動(dòng)設(shè)備上播放的一種高效、節(jié)約成本的可行性方案。MP4共享FLV數(shù)據(jù)利用MP4和FLV兩種格式的特點(diǎn)達(dá)到數(shù)據(jù)共享的目的,從而滿足了移動(dòng)設(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文件播放前需要加載完整個(gè)頭部才能播放,因此對于低質(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.