avi(關(guān)于avi的基本詳情介紹)

從照相機、留聲機誕生,解決了人們記錄影像、聲音的需求以來,人們就不斷地追求著在有限的條件下盡可能地提高這些記錄的品質(zhì),而從模擬時代過渡到數(shù)字時代以后,這方面的追求有一部分變成了在盡可能小的空間中提供盡可能好的內(nèi)容質(zhì)量,這就催生出了一系列不斷演進(jìn)著的媒體壓縮技術(shù)。

不過這期課堂的主題尚未來到媒體編碼的歷史,在講音視頻圖像的壓縮算法進(jìn)化之路前,我們先來了解一下這些媒體內(nèi)容的載體——容器格式的進(jìn)化歷程。

首先需要區(qū)分清楚的,就是容器格式與媒體編碼格式。

何為容器(Container)

對于數(shù)字媒體數(shù)據(jù)來說,容器就是一個可以將多媒體數(shù)據(jù)混在一起存放的東西,就像是一個包裝箱,它可以對音視頻數(shù)據(jù)進(jìn)行打包裝箱,將原來的兩塊數(shù)據(jù)整合到一起,也可以單單只存放一種類型的媒體數(shù)據(jù)。它就像電影膠片一樣,中央是一幀一幀的圖像,而兩旁則印有對應(yīng)的音軌。

舉個簡單的例子,常見的MP4就是一種媒體容器格式而不是編碼格式,它里面的視頻編碼可以是現(xiàn)在最常見的AVC/H.264,也可以是它的前任H.263或者下一任——HEVC,音頻編碼可以是常見的AAC也可以是AC-3。

另一個生僻點的例子:最常見的圖片格式——JPEG,它其實只是一種壓縮方式,而它的存放方式其實叫做JFIF(JPEGFileInterchangeFormat),雖然在JPEG標(biāo)準(zhǔn)中定義了一種名為JIF(JPEGInterchangeFormat)的容器格式,但是因為其缺乏某些關(guān)鍵要素,造成了使用的不便而被后來第三方開發(fā)出來的JFIF容器給取代了,今天我們能夠看到的JPEG文件幾乎都是裝在JFIF容器中的。

雖然今天我們能夠直接拿到的MP4文件里面裝的幾乎都是AVC+AAC的組合,但還是不能混淆了兩者的概念,容器就是個容器,它沒得靈魂。

AVI: 老而彌堅

AVI可能是和筆者年齡相仿的朋友最早接觸的一個格式。確實,它推出的時間相對較早,也是許久以前最為常見的一種容器格式。它全稱叫做音頻視頻交錯(AudioVideoInterleave),顧名思義,它就是簡單地將視頻與音頻交錯在一起,幾幀視頻之后就是對應(yīng)的音頻段,這樣重復(fù),直到結(jié)束。

AVI文件的結(jié)構(gòu)示意圖

它由三部分組成,頭部、主體以及位于文件尾部的索引。頭部中含有文件的元數(shù)據(jù)(metadata),比如視頻的分辨率、碼率總幀數(shù)等信息。主體部分是媒體數(shù)據(jù)的存放區(qū),它使用了塊(chunk)的概念,將原本的視頻流和音頻流分成塊狀進(jìn)行交錯放置,就是上面講的一段視頻一段音頻交錯放置,而尾部則是用來放置索引,它用來記錄每個數(shù)據(jù)塊在文件中的偏移位置。

紅框標(biāo)注為對軌道的標(biāo)識

講到AVI,還可以聯(lián)動一下WAV和蘋果那邊的AIFF,這些容器格式其實是同源的,來自于EA(對,就是現(xiàn)在那個做游戲的EA)為了讓不同公司開發(fā)出來的軟件之間進(jìn)行數(shù)據(jù)交換而在1985年開發(fā)出來的IFF(Interchange File Format)格式。蘋果在IFF的基礎(chǔ)上開發(fā)出了AIFF,而微軟與IBM將IFF格式使用的大端序改成小端序就成了RIFF(Resource Interchange File Format),也就是AVI、WAV這兩個容器的基本原型。

AVI雖然老,但是因為它以幀為單位把數(shù)據(jù)切成塊來存放的特性,使得它幾乎支持市面上幾乎所有的音視頻編碼。而它的缺點也有很多,首先因為索引在文件尾部的關(guān)系,所以它并不適合用來流傳輸;另外在容器中也沒有時間戳,只能通過幀數(shù)和幀率信息來進(jìn)行計算,在索引里面并沒有寫明時間戳—媒體位置的數(shù)據(jù),所以要在播放AVI時進(jìn)行快速跳轉(zhuǎn)還需要額外的技術(shù)手段;而媒體數(shù)據(jù)分塊存放也使得它對很多使用運動預(yù)測特性的視頻編碼的支持并不是太好,因為這些幀,比如P幀和B幀,都是通過I幀進(jìn)行計算得到的,這就需要訪問當(dāng)前幀以外的數(shù)據(jù)了。

MPEG-PS:VCD、DVD的功臣

用電腦播放過VCD的朋友一定還記得會在目錄里尋找那個最大的.DAT文件來播放,而DVD則是找那個最大的.VOB。其實這兩個格式都是MPEG-PS容器規(guī)范的一種,此PS非彼Photoshop,而是指Program Stream,是MPEG組織在1993年發(fā)布的一個容器標(biāo)準(zhǔn),并且隨后寫入ISO/IEC國際標(biāo)準(zhǔn),除了以上兩種后綴名之外,還有.mpg也用的是這個標(biāo)準(zhǔn)。

MPEG-PS標(biāo)準(zhǔn)中引入了包的概念,整個文件由一個個包組成,每個包的大小并不相等,包里面含有這個包的時間碼以及對應(yīng)的音視頻數(shù)據(jù)。

MPEG-PS已經(jīng)隨著時代的進(jìn)步被廢棄了,它只能存放MPEG-1、MPEG-2、MPEG-4這些出自同門的視頻編碼,限制性較大。但因為VCD和DVD的廣泛流行,實際上它還是被用的相當(dāng)多的。

MPEG-TS:專為流傳輸而生

MPEG組織不僅僅為音視頻文件的存儲制定了容器標(biāo)準(zhǔn),還早早地順應(yīng)時代潮流,為它們的傳輸準(zhǔn)備了相應(yīng)的容器。我們的數(shù)字電視和IPTV用的就是MPEG組織在1995年制定的Transport Stream,也就是TS容器,當(dāng)然它也并不限于這兩個場景,在現(xiàn)在的低延時直播系統(tǒng)中,MPEG-TS仍然占據(jù)了絕對主流的地位,原因就是它的整個結(jié)構(gòu)就是為了流傳輸而設(shè)計的。

從IP層到TS包內(nèi)部的結(jié)構(gòu)

一個TS文件中可以容納多個TS流,不同的流上面可以帶有不同的音視頻數(shù)據(jù),這樣通過接收一個TS文件,用戶方面可以自由地在這個TS文件中的多個子TS流之間進(jìn)行切換,非常適合用于傳輸電視節(jié)目。而它同時針對復(fù)雜的傳輸環(huán)境進(jìn)行了針對性的優(yōu)化,TS流的基礎(chǔ)單位是一個個大小僅為188字節(jié)的包,每個包都有自己的獨立時基,并且由于采用了固定大小,所以在傳輸過程中即使遭遇丟包也很快就可以恢復(fù)正常播放。

發(fā)展到今天,TS仍然在網(wǎng)絡(luò)流傳輸時代中發(fā)揮著自己重要的作用,在蘋果主導(dǎo)的HLS(Http Live Streaming)協(xié)議中使用的就是TS流,它比MPEG-DASH更加通用,因為后者對于MP4文件進(jìn)行了一定的修改,在老平臺上面支持不太好,而HLS使用的TS仍然是規(guī)范中的,可以被大多數(shù)設(shè)備兼容。

不過也因為TS分包較多的特性,會產(chǎn)生一些數(shù)據(jù)冗余,所以在存儲場景中一般不會使用TS作為容器。

M2TS:專為高清時代而生

M2TS多見于Blu-ray光盤和高清錄像(AVCHD)中,它由MPEG-TS修改而來,加入了對于高清時代新的音視頻編解碼支持。

一張Blu-ray視頻光盤中的M2TS

并且由于TS文件的特性,每一個小片上都有自己的獨立時間戳,這使得文件中一部分?jǐn)?shù)據(jù)即使遭到破壞也不會影響到其他部分的正常播放,而且可以從中隨意的進(jìn)行切片操作。

ASF:先進(jìn)卻早夭

見過ASF格式視頻的朋友我想應(yīng)該不會太多,但是見過WMV和WMA這兩個微軟以前主推的媒體編碼格式的朋友肯定有很多。其實WMV和WMA就是存放在ASF容器之中的,它全稱高級系統(tǒng)格式(AdvancedSystemsFormat),微軟原本計劃是用它來作為AVI容器的后繼者的,它具有諸多先進(jìn)的特性,比如說它可以包含視頻除了規(guī)格以外的元數(shù)據(jù),如導(dǎo)演、電影名這些,它也可以提供數(shù)字版權(quán)管理(DRM),還有非常好的流傳輸支持——僅需要加載文件的最小部分即可開始播放,這點小編感受過一次。

ASF文件開頭會用這32個字節(jié)來標(biāo)識自己是個ASF文件

ASF身上的這些特性在當(dāng)時還算是比較先進(jìn)的,但不過這于事無補,微軟建立它那套封閉媒體格式體系的做法并沒有得到太多廠商和用戶的支持,大家仍然更喜歡用其他更為開放一點的標(biāo)準(zhǔn),比如MP3就是一個很好的例子。ASF容器也隨著微軟媒體格式的衰亡而漸漸消失了,我們今天已經(jīng)幾乎看不到WMV、WMA這兩個曾經(jīng)還很常見的格式的影子了。

RM:昔日王者,如今不見蹤影

與ASF差不多同時代流行的就是RM和RMVB了,在那個AVC尚未開始普及,DivX和XviD應(yīng)用較少的年代中,RMVB在國內(nèi)的各大下載站中都占據(jù)了絕對主流的地位,很多視頻站也大多使用RM來提供網(wǎng)絡(luò)視頻點播的服務(wù)。

RM容器的內(nèi)部結(jié)構(gòu)

不過RM容器本身并不出彩,索引仍然位于文件尾部,不過由于數(shù)據(jù)段里面有加入時間戳,所以在流傳輸時還是可以應(yīng)付用戶的跳轉(zhuǎn)操作的。因為這個容器本身與RM編碼息息相關(guān)的原因,它本身也只能容納RM編碼的視頻流,所以在RM編碼沒落之后我們就很少再看到這些昔日王者了,一個容器格式想要長存,要么在設(shè)計上有其獨到之處,要么就是要開放,在眾多平臺上面提供支持。而RM兩個理由都不占,效果又比不過新興的AVC,所以它的沒落也是必然了。

FLV:前高清時代的寵兒

還記得十年前的土豆網(wǎng)嗎?彼時它還被稱為國內(nèi)的Youtube,當(dāng)時視頻網(wǎng)站普遍都還在用Flash寫播放器實現(xiàn)流視頻播放,而自然而然地,Adobe制定的Flash Video格式就成了這些視頻網(wǎng)站主要使用的容器格式,也就是我們熟知的FLV。

FLV格式是在Flash Player 6中引入的,當(dāng)時更多的是被存放在SWF文件的內(nèi)部,不過后來因為體積越來越大而直接獨立了出來,它的結(jié)構(gòu)相對而言比較簡單,主要分為兩塊,位于文件頭部的元數(shù)據(jù)信息和后面的音視頻數(shù)據(jù)。不過在數(shù)據(jù)的存放上面,F(xiàn)LV是將數(shù)據(jù)分為多個標(biāo)簽進(jìn)行存儲的,每個標(biāo)簽都帶有自己的時間戳,所以這就保證了流傳輸時的音畫同步。

由于FLV結(jié)構(gòu)簡單但是功能足夠用,并且被Flash Player天然支持,所以在當(dāng)時的視頻網(wǎng)站上面普遍都使用它作為容器,直到今天還有很多網(wǎng)站沒有放棄它,雖然其中的視頻編碼早已升級,它也有衍生出來的F4V作為后繼者,雖然后者的血統(tǒng)已經(jīng)不是Flash家族的了。

F4V:換了血的繼任者

小編還記得土豆網(wǎng)在2009、2010年左右在國內(nèi)率先開始使用H.264編碼,當(dāng)時如果將清晰度切換到高清就會播放這些用H.264編碼的視頻。而用飛速土豆加速會緩存到一些.f4v擴展名的文件,乍一看還以為它就是FLV,但其實不然,F(xiàn)4V其實是MP4所在的ISO標(biāo)準(zhǔn)容器家族的,但也是Adobe搞出來的FLV的后繼者。關(guān)于后者的詳情,請往下看。

MOV:蘋果向業(yè)界作出的貢獻(xiàn)

MOV格式的正式名字叫QuickTime File Format。看到這個QuickTime第一反應(yīng)肯定是哦,這是蘋果的東西。確實,QuickTime File Format是由蘋果在1998年推出的,它引入了原子(atom)的概念,在QTFF格式中,atom是基本的數(shù)據(jù)單元,它可以用來容納實際的音視頻數(shù)據(jù),也可以放置元數(shù)據(jù)和字幕等文本信息,atom中所容納的數(shù)據(jù)類型和大小在每個atom的頭部進(jìn)行描述,經(jīng)過一層層的嵌套之后,整個數(shù)據(jù)文件呈現(xiàn)了一種樹狀的結(jié)構(gòu),并且保留了強大的可擴展性。

MOV和MP4這些ISO標(biāo)準(zhǔn)容器格式的開頭都有一個ftyp用于標(biāo)記格式

MOV作為蘋果QuickTime編碼的成員,在目前仍然被蘋果設(shè)備廣泛使用著,并且對于它的支持非常好。1998年推出QTFF的同時,蘋果將這個格式交給了ISO組織,后者將它標(biāo)準(zhǔn)化為國際通用容器格式,而基于這個標(biāo)準(zhǔn)衍生出來的容器,又可以叫做ISO/IEC base media file format,同時被MPEG組織采納,寫入MPEG-4 Part 12標(biāo)準(zhǔn)中。

ISO標(biāo)準(zhǔn)容器格式

ISO標(biāo)準(zhǔn)容器格式是一個規(guī)范,它代表符合這個規(guī)范的容器類型,而不是特指某個格式。它是由蘋果的QuickTime File Format發(fā)展而來的,在MPEG-4 Part 12中被最終確定并被ISO/IEC組織寫入標(biāo)準(zhǔn)。它雖然沒有具體實現(xiàn),但是它定義了基于時間碼的多媒體文件的通用結(jié)構(gòu),并由此成為了MP4、3GP等格式的基礎(chǔ)。

3GP、MP4與ISO標(biāo)準(zhǔn)容器格式的關(guān)系

MP4:標(biāo)準(zhǔn),泛用

MP4肯定是現(xiàn)在最通用最流行的媒體容器,甚至可以說沒有之一。但其實現(xiàn)在的MP4和早期的并不是同一個標(biāo)準(zhǔn),目前常見的MP4標(biāo)準(zhǔn)是在2003年完整的的MPEG-4 Part 14規(guī)范中制定的,到今天為止也經(jīng)過了多次的修訂。它其實與MOV之間并沒有太大的區(qū)別,基本上就是把MOV的atom改了個名字,叫成box,然后加了一點別的佐料。

MP4的內(nèi)部結(jié)構(gòu)

蘋果建立iTunes Store賣數(shù)字音樂的時候選擇了AAC-LC作為他們的音頻編碼格式,而容器格式上面他們并沒有選擇與AAC-LC處于同一時代(MPEG-2)的ADTS,而是選擇了比AAC-LC大一輩的MPEG-4標(biāo)準(zhǔn)容器,也就是MP4,不過因為它只含音頻所以我們看到的擴展名就是.m4a,iTunes Store還賣一種只有視頻沒有音頻的MV,它用的也是MP4,擴展名為.m4v,本質(zhì)上它們就是同一種東西。

目前很多視頻網(wǎng)站已經(jīng)從FLV切換到MP4上面了,而且還有一種新的MPEG-DASH格式就是借助于MP4可分割的特性實現(xiàn)的,它將一整段視頻切成許多段小塊,方便瀏覽器進(jìn)行加載,減少HTTP長連接對服務(wù)器的壓力。

這里說一句題外話,當(dāng)年某站剛上HTML5播放器的時候,因為他們原來的視頻幾乎全部都用的是FLV存儲的,而HTML5標(biāo)準(zhǔn)并不支持它,所以要進(jìn)行一個容器轉(zhuǎn)換,某站當(dāng)時一位非常年輕的程序員寫出了一個在瀏覽器內(nèi)實時將FLV文件轉(zhuǎn)成MP4并喂給瀏覽器的媒體播放器的腳本,名為flv.js,這個腳本可能給某站省下了非常大的格式轉(zhuǎn)換成本。不久之后這位程序員因為受不了某站的低薪而離職。這件事曾經(jīng)引起了很多社區(qū)的熱烈討論,因為今天是程序員日所以特地寫了這么一段。

3GP:精簡小巧,手機最愛

3GP是MP4的同族兄弟,一樣是基于ISO標(biāo)準(zhǔn)容器格式,用過3GP的兄弟肯定還記得這格式最多出現(xiàn)的地方是哪里——以諾基亞為代表的前智能手機時代,手機錄像出來的文件大多都是3GP格式的。

3GP這個容器格式標(biāo)準(zhǔn)其實不是由以往的MPEG啊這類專注于多媒體編碼的組織搞出來的,而是3GPP,對沒錯就是制定通信行業(yè)標(biāo)準(zhǔn)的那個組織制定的。它在容器支持的格式上進(jìn)行了精簡,只面向于手機可以進(jìn)行的編碼,比如MPEG-4 Visual、H.263這些比較老的視頻編碼和AMR、AAC這兩種前智能手機時代使用較多的音頻編碼。

因為前智能手機時代的手機性能并不強大,一般也不需要支持很多種格式,不用像MP4那么全面,所以3GP最終成為了一種被廣泛支持的格式,不過也因為它支持的格式過于有限,最終在智能手機時代被同門大哥MP4給取代了。

MPEG-DASH

面對時下流行的流媒體,MPEG組織對MP4文件進(jìn)行了魔改,由于MP4天生可以進(jìn)行無損切割的特性,DASH方式將原本媒體文件中完整的文件頭的元數(shù)據(jù)信息和片段Box中的信息抽取出來單獨寫在一個文件(MPD)中,同時還包含了片段的URL等信息,播放器可以自適應(yīng)選擇需要的片段進(jìn)行播放,在自適應(yīng)程度上面比HLS更強一些。(其實MPEG-DASH也可以用TS作為容器,但用MP4更多一些)

目前MPEG-DASH已經(jīng)成為了一項國際標(biāo)準(zhǔn),人們比較熟悉的應(yīng)用平臺就是Youtube和Netflix,在這些平臺上面你會發(fā)現(xiàn)瀏覽器在不斷地加載一些小的視頻文件,但是視頻的播放是連續(xù)的。

MKV:強大無需多言,免費讓它受愛

說到MKV,喜歡收藏高清電影的朋友肯定不會陌生,這種容器格式大概是和高清時代一起發(fā)展起來的,但其實它在2002年底就已經(jīng)完成制定了,不過推廣的很緩慢,到了高清時代和UHD時代人們才開始發(fā)現(xiàn)這種容器的強大,并用的越來越多,連微軟都在Windows 10的初始版本中加入了對它的支持。

MKV的內(nèi)部結(jié)構(gòu)

MKV全名Matroska,它身上最大的特點就是開放標(biāo)準(zhǔn)、免費使用,而且它可能是目前地球上最強大的數(shù)字媒體容器格式,一個文件中可以放音頻、視頻、字幕、字體還有章節(jié)信息等等等等,前面東西都是不限數(shù)量任你放多少都可以吃得下的,而且它是目前唯一一個支持封裝ASS字幕的格式。

值得一提的是,這玩意兒是俄羅斯組織матрёшка搞出來的,其實本身是用于盜版的,俄羅斯的網(wǎng)絡(luò)情況跟我們挺像的,網(wǎng)絡(luò)上盜版橫行,而MKV也幫助了文件的傳播,目前來看,MKV可能是眾多容器格式里面最好用的,無論是編輯元數(shù)據(jù)還是抽取軌道重新封裝都有GUI工具支持,不過可惜的是眾多視頻編輯剪輯軟件還是沒有提供對它的支持。

總結(jié)

其實讀到最后你會發(fā)現(xiàn),這些容器格式內(nèi)部對于音視頻數(shù)據(jù)的處理都是大同小異的,區(qū)別點其實并不大。更多的差距在于它們對于不同編碼格式的支持程度、元數(shù)據(jù)的詳細(xì)程度以及對于是否能夠支持音視頻以外的數(shù)據(jù)。

而發(fā)展到至今,MP4仍然夠用,在互聯(lián)網(wǎng)時代扮演著非常重要的角色;MKV在下載黨那里被奉為圭臬;而TS格式仍然在數(shù)字電視系統(tǒng)中被廣泛使用。但在他們之前的格式也不是說非常弱或者不好,只不過可能是他們支持的那些格式?jīng)]落了順帶著把它們也帶沒了,真正像AVI那樣確實在技術(shù)規(guī)格上落伍的容器并不多。

而對于各種容器之間無損互轉(zhuǎn)的事情,小編這里推薦mp4box、mkvtoolnix和強大的ffmpeg這些工具。下一篇系列課堂,我們會轉(zhuǎn)向在如今多媒體領(lǐng)域中扮演無可替代角色的視頻編碼的變遷史,并且會看一看未來的AV1和VVC這兩種對于大眾來說還很陌生的下一代視頻編碼。

轉(zhuǎn)載注明出處:華峰博客網(wǎng)

內(nèi)容版權(quán)聲明:除非注明,否則皆為本站原創(chuàng)文章。