AVI格式详解(转)
生活随笔
收集整理的這篇文章主要介紹了
AVI格式详解(转)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
AVI簡介
AVI英文全稱為
Audio Video Interleaved,即音頻視頻交錯格式。是將語音和影像同步組合在一起的文件格式。它對視頻文件采用了一種有損壓縮方式,但壓縮比較高,因此盡管面面質(zhì)量不是太好,但其應(yīng)用范圍仍然非常廣泛。AVI支持256色和RLE壓縮。AVI信息主要應(yīng)用在多媒體光盤上,用來保存電視、電影等各種影像信息。
它于1992年被 Microsoft公司推出,隨Windows3.1一起被人們所認(rèn)識和熟知。所謂“音頻視頻交錯”,就是可以將視頻和音頻交織在一起進行同步播放。這種視頻格式的優(yōu)點是圖像質(zhì)量好,可以跨多個平臺使用,其缺點是體積過于龐大,而且更加糟糕的是壓縮標(biāo)準(zhǔn)不統(tǒng)一,最普遍的現(xiàn)象就是高版本W(wǎng)indows媒體 播放器播放不了采用早期編碼編輯的AVI格式視頻,而低版本W(wǎng)indows媒體播放器又播放不了采用最新編碼編輯的AVI格式視頻,所以我們在進行一些AVI格式的視頻播放時常會出現(xiàn)由于視頻編碼問題而造成的視頻不能播放或即使能夠播放,但存在不能調(diào)節(jié)播放進度和播放時只有聲音沒有圖像等一些莫名其妙的問題,如果用戶在進行AVI格式的視頻播放時遇到了這些問題,可以通過下載相應(yīng)的解碼器來解決。是目前視頻文件的主流。 這種格式的文件隨處可見,比如一些游戲、教育軟件的片頭,多媒體光盤中,都會有不少的AVI 。
現(xiàn)在,在WINDOWS 95或98里都能直接播放AVI,而且它自己的格式也有好幾種,最常見的有 Intel Indeo(R)Video R3.2、Microsoft video 等。
avi含三部分:文件頭、數(shù)據(jù)塊和索引塊。
其中數(shù)據(jù)塊包含實際數(shù)據(jù)流,即圖像和聲音序列數(shù)據(jù)。這是文件的主體,也是決定文件容量的主要部分。視頻文件的大小等于該文件的數(shù)據(jù)率乘以該視頻播放的時間長度,索引塊包括數(shù)據(jù)塊列表和它們在文件中的位置,以提供文件內(nèi)數(shù)據(jù)隨機存取能力。文件頭包括文件的通用信息,定義數(shù)據(jù)格式,所用的壓縮算法等參數(shù)。
nAVI格式
nAVI是newAVI的縮寫,是一個名為ShadowRealm的地下組織發(fā)展起來的一種新視頻格式(與我們上面所說的AVI 格式?jīng)]有太大聯(lián)系)。它是由Microsoft ASF壓縮算法的修改而來的,但是又與下面介紹的網(wǎng)絡(luò)影像視頻中的ASF視頻格式有所區(qū)別,它以犧牲原有ASF視頻文件視頻“流”特性為代價而通過增加幀率來大幅提高ASF視頻文件的清晰度。
DV-AVI格式
DV的英文全稱是Digital Video Format,是由索尼、松下、JVC等多家廠商聯(lián)合提出的一種家用數(shù)字視頻格式。目前非常流行的數(shù)碼攝像機就是使用這種格式記錄視頻數(shù)據(jù)的。它可以通過電腦的IEEE 1394端口傳輸視頻數(shù)據(jù)到電腦,也可以將電腦中編輯好的的視頻數(shù)據(jù)回錄到數(shù)碼攝像機中。這種視頻格式的文件擴展名一般是.avi,所以也叫DV-AVI 格式。
目前(07年10月)AVI圖象反轉(zhuǎn)的原因很可能是暴風(fēng)影音和windows media player沖突,下載一個完整的DIVX解碼器可以解決。
1992年初Microsoft公司推出了AVI技術(shù)及其應(yīng)用軟件VFW(Video for Windows)。在AVI文件中,運動圖像和伴音數(shù)據(jù)是以交織的方式存儲,并獨立于硬件設(shè)備。這種按交替方式組織音頻和視像數(shù)據(jù)的方式可使得讀取視頻數(shù)據(jù)流時能更有效地從存儲媒介得到連續(xù)的信息。構(gòu)成一個AVI文件的主要參數(shù)包括視像參數(shù)、伴音參數(shù)和壓縮參數(shù)等:
AVI沒有MPEG這么復(fù)雜,從WIN3.1時代,它就已經(jīng)面世了。它最直接的優(yōu)點就是兼容好、調(diào)用方便而且圖象質(zhì)量好,因此也常常與DVD相并稱。但它的缺點也是十分明顯的:體積大。也是因為這一點,我們才看到了MPEG-1和MPEG-4的誕生。2小時影像的AVI文件的體積與MPEG-2相差無計,不過這只是針對標(biāo)準(zhǔn)分辨率而言的:根據(jù)不同的應(yīng)用要求,AVI的分辨率可以隨意調(diào)。窗口越大,文件的數(shù)據(jù)量也就越大。降低分辨率可以大幅減低它的體積,但圖象質(zhì)量就必然受損。與MPEG-2格式文件體積差不多的情況下,AVI格式的視頻質(zhì)量相對而言要差不少,但制作起來對電腦的配置要求不高,經(jīng)常有人先錄制好了AVI格式的視頻,再轉(zhuǎn)換為其他格式。
1、視窗尺寸(Video size):根據(jù)不同的應(yīng)用要求,AVI的視窗大小或分辨率可按4:3的比例或隨意調(diào)整:大到全屏640×480,小到160×120甚至更低。窗口越大,視頻文件的數(shù)據(jù)量越大。
2、 幀率(Frames per second):幀率也可以調(diào)整,而且與數(shù)據(jù)量成正比。不同的幀率會產(chǎn)生不同的畫面連續(xù)效果。
伴音參數(shù)
在AVI文件中,視像和伴音是分別存儲的,因此可以把一段視頻中的視像與另一段視頻中的伴音組合在一起。AVI 文件與WAV文件密切相關(guān),因為WAV文件是AVI文件中伴音信號的來源。伴音的基本參數(shù)也即WAV文件格式的參數(shù),除此以外,AVI文件還包括與音頻有關(guān)的其他參數(shù):
1、視像與伴音的交織參數(shù)(Interlace Audio Every X Frames)AVI格式中每X幀交織存儲的音頻信號,也即伴音和視像交替的頻率X是可調(diào)參數(shù),X的最小值是一幀,即每個視頻幀與音頻數(shù)據(jù)交織組織,這是CD-ROM上使用的默認(rèn)值。交織參數(shù)越小,回放AVI文件時讀到內(nèi)存中的數(shù)據(jù)流越少,回放越容易連續(xù)。因此,如果AVI文件的存儲平臺的數(shù)據(jù)傳輸率較大,則交錯參數(shù)可設(shè)置得高一些。當(dāng)AVI文件存儲在硬盤上時,也即從硬盤上讀AVI文件進行播放時,可以使用大一些的交織頻率,如幾幀,甚至1秒。
2、同步控制(Synchronization)
在AVI文件中,視像和伴音是同步得很好的。但在MPC中回放AVI文件時則有可能出現(xiàn)視像和伴音不同步的現(xiàn)象。
壓縮參數(shù)
在采集原始模擬視頻時可以用不壓縮的方式,這樣可以獲得最優(yōu)秀的圖像質(zhì)量。編輯后應(yīng)根據(jù)應(yīng)用環(huán)境環(huán)擇合適的壓縮參數(shù)。
一、提供無硬件視頻回放功能
AVI格式和VFW軟件雖然是為當(dāng)前的MPC設(shè)計的,但它也可以不斷提高以適應(yīng)MPC的發(fā)展。根據(jù)AVI格式的參數(shù),其視窗的大小和幀率可以根據(jù)播放環(huán)境的硬件能力和處理速度進行調(diào)整。在低檔MPC機上或在網(wǎng)絡(luò)上播放時,VFW的視窗可以很小,色彩數(shù)和幀率可以很低;而在Pentium級系統(tǒng)上,對于64K色、320×240的壓縮視頻數(shù)據(jù)可實現(xiàn)每秒25幀的回放速率。這樣,VFW就可以適用于不同的硬件平臺,使用戶可以在普通的MPC上進行數(shù)字視頻信息的編輯和重放,而不需要昂貴的專門硬件設(shè)備。
二、實現(xiàn)同步控制和實時播放
通過同步控制參數(shù),AVI可以通過自調(diào)整來適應(yīng)重放環(huán)境,如果MPC的處理能力不夠高,而AVI文件的數(shù)據(jù)率又較大,在WINDOWS環(huán)境下播放該AVI文件時,播放器可以通過丟掉某些幀,調(diào)整AVI的實際播放數(shù)據(jù)率來達到視頻、音頻同步的效果。
三、可以高效地播放存儲在硬盤和光盤上的AVI文件
由于AVI數(shù)據(jù)的交叉存儲,VFW播放AVI數(shù)據(jù)時只需占用有限的內(nèi)存空間,因為播放程序可以一邊讀取硬盤或光盤上的視頻數(shù)據(jù)一邊播放,而無需預(yù)先把容量很大的視頻數(shù)據(jù)加載到內(nèi)存中。在播放AVI視頻數(shù)據(jù)時,只需在指定的時間內(nèi)訪問少量的視頻圖像和部分音頻數(shù)據(jù)。這種方式不僅可以提高系統(tǒng)的工作效率,同時也可以實現(xiàn)迅速地加載和快速地啟動播放程序,減少播放AVI視頻數(shù)據(jù)時用戶的等待時間。
四、提供了開放的AVI數(shù)字視頻文件結(jié)構(gòu)
AVI文件結(jié)構(gòu)不僅解決了音頻和視頻的同步問題,而且具有通用和開放的特點。它可以在任何Windows環(huán)境下工作,而且還具有擴展環(huán)境的功能。用戶可以開發(fā)自己的AVI視頻文件,在Windows環(huán)境下可隨時調(diào)用。
五、AVI文件可以再編輯
AVI一般采用幀內(nèi)有損壓縮,可以用一般的視頻編輯軟件如Adobe Premiere或MediaStudio進行再編輯和處理。
先來介紹RIFF文件格式。RIFF文件使用四字符碼FOURCC(four-character code)來表征數(shù)據(jù)類型,比如‘RIFF’、‘AVI ’、‘LIST’等。注意,Windows操作系統(tǒng)使用的字節(jié)順序是little-endian,因此一個四字符碼‘a(chǎn)bcd’實際的DWORD值應(yīng)為0x64636261。另外,四字符碼中像‘AVI ’一樣含有空格也是合法的。
最開始的4個字節(jié)是一個四字符碼‘RIFF’,表示這是一個RIFF文件;緊跟著后面用4個字節(jié)表示此RIFF文件的大小;然后又是一個四字符碼說明文件的具體類型(比如AVI、WAVE等);最后就是實際的數(shù)據(jù)。注意文件大小值的計算方法為:實際數(shù)據(jù)長度 + 4(文件類型域的大小);也就是說,文件大小的值不包括‘RIFF’域和“文件大小”域本身的大小。
RIFF文件的實際數(shù)據(jù)中,通常還使用了列表(List)和塊(Chunk)的形式來組織。列表可以嵌套子列表和塊。其中,列表的結(jié)構(gòu)為:‘LIST’ listSize listType listData ——‘LIST’是一個四字符碼,表示這是一個列表;listSize占用4字節(jié),記錄了整個列表的大小;listType也是一個四字符碼,表示本列表的具體類型;listData就是實際的列表數(shù)據(jù)。注意listSize值的計算方法為:實際的列表數(shù)據(jù)長度 + 4(listType域的大小);也就是說listSize值不包括‘LIST’域和listSize域本身的大小。再來看塊的結(jié)構(gòu):ckID ckSize ckData ——ckID是一個表示塊類型的四字符碼;ckSize占用4字節(jié),記錄了整個塊的大小;ckData為實際的塊數(shù)據(jù)。注意ckSize值指的是實際的塊數(shù)據(jù)長度,而不包括ckID域和ckSize域本身的大小。(注意:在下面的內(nèi)容中,將以LIST ( listType ( listData ) )的形式來表示一個列表,以ckID ( ckData )的形式來表示一個塊,如[ optional element ]中括號中的元素表示為可選項。)
接下來介紹AVI文件格式。AVI文件類型用一個四字符碼‘AVI ’來表示。整個AVI文件的結(jié)構(gòu)為:一個RIFF頭 + 兩個列表(一個用于描述媒體流格式、一個用于保存媒體流數(shù)據(jù)) + 一個可選的索引塊。AVI文件的展開結(jié)構(gòu)大致如下:
RIFF (‘AVI ’
LIST (‘hdrl’
‘a(chǎn)vih’(主AVI信息頭數(shù)據(jù))
LIST (‘strl’
‘strh’ (流的頭信息數(shù)據(jù))
‘strf’ (流的格式信息數(shù)據(jù))
[‘strd’ (可選的額外的頭信息數(shù)據(jù)) ]
[‘strn’ (可選的流的名字) ]
...
)
...
)
LIST (‘movi’
{ SubChunk | LIST (‘rec ’
SubChunk1
SubChunk2
...
)
...
}
...
)
[‘idx1’ (可選的AVI索引塊數(shù)據(jù)) ]
)
首先,RIFF (‘AVI ’…)表征了AVI文件類型。然后就是AVI文件必需的第一個列表——‘hdrl’列表,用于描述AVI文件中各個流的格式信息(AVI文件中的每一路媒體數(shù)據(jù)都稱為一個流)。‘hdrl’列表嵌套了一系列塊和子列表——首先是一個‘a(chǎn)vih’塊,用于記錄AVI文件的全局信息,比如流的數(shù)量、視頻圖像的寬和高等,可以使用一個AVIMAINHEADER數(shù)據(jù)結(jié)構(gòu)來操作:
typedef struct _avimainheader {
FOURCC fcc; // 必須為‘a(chǎn)vih’
DWORD cb; // 本數(shù)據(jù)結(jié)構(gòu)的大小,不包括最初的8個字節(jié)(fcc和cb兩個域)
DWORD dwMicroSecPerFrame; // 視頻幀間隔時間(以毫秒為單位)
DWORD dwMaxBytesPerSec; // 這個AVI文件的最大數(shù)據(jù)率
DWORD dwPaddingGranularity; // 數(shù)據(jù)填充的粒度
DWORD dwFlags; // AVI文件的全局標(biāo)記,比如是否含有索引塊等
DWORD dwTotalFrames; // 總幀數(shù)
DWORD dwInitialFrames; // 為交互格式指定初始幀數(shù)(非交互格式應(yīng)該指定為0)
DWORD dwStreams; // 本文件包含的流的個數(shù)
DWORD dwSuggestedBufferSize; // 建議讀取本文件的緩存大小(應(yīng)能容納最大的塊)
DWORD dwWidth; // 視頻圖像的寬(以像素為單位)
DWORD dwHeight; // 視頻圖像的高(以像素為單位)
DWORD dwReserved[4]; // 保留
} AVIMAINHEADER;
然后,就是一個或多個‘strl’子列表。(文件中有多少個流,這里就對應(yīng)有多少個‘strl’子列表。)每個‘strl’子列表至少包含一個‘strh’塊和一個‘strf’塊,而‘strd’塊(保存編解碼器需要的一些配置信息)和‘strn’塊(保存流的名字)是可選的。首先是‘strh’塊,用于說明這個流的頭信息,可以使用一個AVISTREAMHEADER數(shù)據(jù)結(jié)構(gòu)來操作:
typedef struct _avistreamheader {
FOURCC fcc; // 必須為‘strh’
DWORD cb; // 本數(shù)據(jù)結(jié)構(gòu)的大小,不包括最初的8個字節(jié)(fcc和cb兩個域)
FOURCC fccType; // 流的類型:‘a(chǎn)uds’(音頻流)、‘vids’(視頻流)、
//‘mids’(MIDI流)、‘txts’(文字流)
FOURCC fccHandler; // 指定流的處理者,對于音視頻來說就是解碼器
DWORD dwFlags; // 標(biāo)記:是否允許這個流輸出?調(diào)色板是否變化?
WORD wPriority; // 流的優(yōu)先級(當(dāng)有多個相同類型的流時優(yōu)先級最高的為默認(rèn)流)
WORD wLanguage;
DWORD dwInitialFrames; // 為交互格式指定初始幀數(shù)
DWORD dwScale; // 這個流使用的時間尺度
DWORD dwRate;
DWORD dwStart; // 流的開始時間
DWORD dwLength; // 流的長度(單位與dwScale和dwRate的定義有關(guān))
DWORD dwSuggestedBufferSize; // 讀取這個流數(shù)據(jù)建議使用的緩存大小
DWORD dwQuality; // 流數(shù)據(jù)的質(zhì)量指標(biāo)(0 ~ 10,000)
DWORD dwSampleSize; // Sample的大小
struct {
short int left;
short int top;
short int right;
short int bottom;
} rcFrame; // 指定這個流(視頻流或文字流)在視頻主窗口中的顯示位置
// 視頻主窗口由AVIMAINHEADER結(jié)構(gòu)中的dwWidth和dwHeight決定
} AVISTREAMHEADER;
然后是‘strf’塊,用于說明流的具體格式。如果是視頻流,則使用一個BITMAPINFO數(shù)據(jù)結(jié)構(gòu)來描述;如果是音頻流,則使用一個WAVEFORMATEX數(shù)據(jù)結(jié)構(gòu)來描述。
當(dāng)AVI文件中的所有流都使用一個‘strl’子列表說明了以后(注意:‘strl’子列表出現(xiàn)的順序與媒體流的編號是對應(yīng)的,比如第一個‘strl’子列表說明的是第一個流(Stream 0),第二個‘strl’子列表說明的是第二個流(Stream 1),以此類推),‘hdrl’列表的任務(wù)也就完成了,隨后跟著的就是AVI文件必需的第二個列表——‘movi’列表,用于保存真正的媒體流數(shù)據(jù)(視頻圖像幀數(shù)據(jù)或音頻采樣數(shù)據(jù)等)。那么,怎么來組織這些數(shù)據(jù)呢?可以將數(shù)據(jù)塊直接嵌在‘movi’列表里面,也可以將幾個數(shù)據(jù)塊分組成一個‘rec ’列表后再編排進‘movi’列表。(注意:在讀取AVI文件內(nèi)容時,建議將一個‘rec ’列表中的所有數(shù)據(jù)塊一次性讀出。)但是,當(dāng)AVI文件中包含有多個流的時候,數(shù)據(jù)塊與數(shù)據(jù)塊之間如何來區(qū)別呢?于是數(shù)據(jù)塊使用了一個四字符碼來表征它的類型,這個四字符碼由2個字節(jié)的類型碼和2個字節(jié)的流編號組成。標(biāo)準(zhǔn)的類型碼定義如下:‘db’(非壓縮視頻幀)、‘dc’(壓縮視頻幀)、‘pc’(改用新的調(diào)色板)、‘wb’(音縮視頻)。比如第一個流(Stream 0)是音頻,則表征音頻數(shù)據(jù)塊的四字符碼為‘00wb’;第二個流(Stream 1)是視頻,則表征視頻數(shù)據(jù)塊的四字符碼為‘00db’或‘00dc’。對于視頻數(shù)據(jù)來說,在AVI數(shù)據(jù)序列中間還可以定義一個新的調(diào)色板,每個改變的調(diào)色板數(shù)據(jù)塊用‘xxpc’來表征,新的調(diào)色板使用一個數(shù)據(jù)結(jié)構(gòu)AVIPALCHANGE來定義。(注意:如果一個流的調(diào)色辦中途可能改變,則應(yīng)在這個流格式的描述中,也就是AVISTREAMHEADER結(jié)構(gòu)的dwFlags中包含一個AVISF_VIDEO_PALCHANGES標(biāo)記。)另外,文字流數(shù)據(jù)塊可以使用隨意的類型碼表征。
最后,緊跟在‘hdrl’列表和‘movi’列表之后的,就是AVI文件可選的索引塊。這個索引塊為AVI文件中每一個媒體數(shù)據(jù)塊進行索引,并且記錄它們在文件中的偏移(可能相對于‘movi’列表,也可能相對于AVI文件開頭)。索引塊使用一個四字符碼‘idx1’來表征,索引信息使用一個數(shù)據(jù)結(jié)構(gòu)來AVIOLDINDEX定義。
typedef struct _avioldindex {
FOURCC fcc; // 必須為‘idx1’
DWORD cb; // 本數(shù)據(jù)結(jié)構(gòu)的大小,不包括最初的8個字節(jié)(fcc和cb兩個域)
struct _avioldindex_entry {
DWORD dwChunkId; // 表征本數(shù)據(jù)塊的四字符碼
DWORD dwFlags; // 說明本數(shù)據(jù)塊是不是關(guān)鍵幀、是不是‘rec ’列表等信息
DWORD dwOffset; // 本數(shù)據(jù)塊在文件中的偏移量
DWORD dwSize; // 本數(shù)據(jù)塊的大小
} aIndex[]; // 這是一個數(shù)組!為每個媒體數(shù)據(jù)塊都定義一個索引信息
} AVIOLDINDEX;
注意:如果一個AVI文件包含有索引塊,則應(yīng)在主AVI信息頭的描述中,也就是AVIMAINHEADER結(jié)構(gòu)的dwFlags中包含一個AVIF_HASINDEX標(biāo)記。
還有一種特殊的數(shù)據(jù)塊,用一個四字符碼‘JUNK’來表征,它用于內(nèi)部數(shù)據(jù)的隊齊(填充),應(yīng)用程序應(yīng)該忽略這些數(shù)據(jù)塊的實際意義。
它于1992年被 Microsoft公司推出,隨Windows3.1一起被人們所認(rèn)識和熟知。所謂“音頻視頻交錯”,就是可以將視頻和音頻交織在一起進行同步播放。這種視頻格式的優(yōu)點是圖像質(zhì)量好,可以跨多個平臺使用,其缺點是體積過于龐大,而且更加糟糕的是壓縮標(biāo)準(zhǔn)不統(tǒng)一,最普遍的現(xiàn)象就是高版本W(wǎng)indows媒體 播放器播放不了采用早期編碼編輯的AVI格式視頻,而低版本W(wǎng)indows媒體播放器又播放不了采用最新編碼編輯的AVI格式視頻,所以我們在進行一些AVI格式的視頻播放時常會出現(xiàn)由于視頻編碼問題而造成的視頻不能播放或即使能夠播放,但存在不能調(diào)節(jié)播放進度和播放時只有聲音沒有圖像等一些莫名其妙的問題,如果用戶在進行AVI格式的視頻播放時遇到了這些問題,可以通過下載相應(yīng)的解碼器來解決。是目前視頻文件的主流。 這種格式的文件隨處可見,比如一些游戲、教育軟件的片頭,多媒體光盤中,都會有不少的AVI 。
現(xiàn)在,在WINDOWS 95或98里都能直接播放AVI,而且它自己的格式也有好幾種,最常見的有 Intel Indeo(R)Video R3.2、Microsoft video 等。
avi含三部分:文件頭、數(shù)據(jù)塊和索引塊。
其中數(shù)據(jù)塊包含實際數(shù)據(jù)流,即圖像和聲音序列數(shù)據(jù)。這是文件的主體,也是決定文件容量的主要部分。視頻文件的大小等于該文件的數(shù)據(jù)率乘以該視頻播放的時間長度,索引塊包括數(shù)據(jù)塊列表和它們在文件中的位置,以提供文件內(nèi)數(shù)據(jù)隨機存取能力。文件頭包括文件的通用信息,定義數(shù)據(jù)格式,所用的壓縮算法等參數(shù)。
nAVI格式
nAVI是newAVI的縮寫,是一個名為ShadowRealm的地下組織發(fā)展起來的一種新視頻格式(與我們上面所說的AVI 格式?jīng)]有太大聯(lián)系)。它是由Microsoft ASF壓縮算法的修改而來的,但是又與下面介紹的網(wǎng)絡(luò)影像視頻中的ASF視頻格式有所區(qū)別,它以犧牲原有ASF視頻文件視頻“流”特性為代價而通過增加幀率來大幅提高ASF視頻文件的清晰度。
DV-AVI格式
DV的英文全稱是Digital Video Format,是由索尼、松下、JVC等多家廠商聯(lián)合提出的一種家用數(shù)字視頻格式。目前非常流行的數(shù)碼攝像機就是使用這種格式記錄視頻數(shù)據(jù)的。它可以通過電腦的IEEE 1394端口傳輸視頻數(shù)據(jù)到電腦,也可以將電腦中編輯好的的視頻數(shù)據(jù)回錄到數(shù)碼攝像機中。這種視頻格式的文件擴展名一般是.avi,所以也叫DV-AVI 格式。
目前(07年10月)AVI圖象反轉(zhuǎn)的原因很可能是暴風(fēng)影音和windows media player沖突,下載一個完整的DIVX解碼器可以解決。
1992年初Microsoft公司推出了AVI技術(shù)及其應(yīng)用軟件VFW(Video for Windows)。在AVI文件中,運動圖像和伴音數(shù)據(jù)是以交織的方式存儲,并獨立于硬件設(shè)備。這種按交替方式組織音頻和視像數(shù)據(jù)的方式可使得讀取視頻數(shù)據(jù)流時能更有效地從存儲媒介得到連續(xù)的信息。構(gòu)成一個AVI文件的主要參數(shù)包括視像參數(shù)、伴音參數(shù)和壓縮參數(shù)等:
AVI沒有MPEG這么復(fù)雜,從WIN3.1時代,它就已經(jīng)面世了。它最直接的優(yōu)點就是兼容好、調(diào)用方便而且圖象質(zhì)量好,因此也常常與DVD相并稱。但它的缺點也是十分明顯的:體積大。也是因為這一點,我們才看到了MPEG-1和MPEG-4的誕生。2小時影像的AVI文件的體積與MPEG-2相差無計,不過這只是針對標(biāo)準(zhǔn)分辨率而言的:根據(jù)不同的應(yīng)用要求,AVI的分辨率可以隨意調(diào)。窗口越大,文件的數(shù)據(jù)量也就越大。降低分辨率可以大幅減低它的體積,但圖象質(zhì)量就必然受損。與MPEG-2格式文件體積差不多的情況下,AVI格式的視頻質(zhì)量相對而言要差不少,但制作起來對電腦的配置要求不高,經(jīng)常有人先錄制好了AVI格式的視頻,再轉(zhuǎn)換為其他格式。
[編輯本段]參數(shù)
視像參數(shù)1、視窗尺寸(Video size):根據(jù)不同的應(yīng)用要求,AVI的視窗大小或分辨率可按4:3的比例或隨意調(diào)整:大到全屏640×480,小到160×120甚至更低。窗口越大,視頻文件的數(shù)據(jù)量越大。
2、 幀率(Frames per second):幀率也可以調(diào)整,而且與數(shù)據(jù)量成正比。不同的幀率會產(chǎn)生不同的畫面連續(xù)效果。
伴音參數(shù)
在AVI文件中,視像和伴音是分別存儲的,因此可以把一段視頻中的視像與另一段視頻中的伴音組合在一起。AVI 文件與WAV文件密切相關(guān),因為WAV文件是AVI文件中伴音信號的來源。伴音的基本參數(shù)也即WAV文件格式的參數(shù),除此以外,AVI文件還包括與音頻有關(guān)的其他參數(shù):
1、視像與伴音的交織參數(shù)(Interlace Audio Every X Frames)AVI格式中每X幀交織存儲的音頻信號,也即伴音和視像交替的頻率X是可調(diào)參數(shù),X的最小值是一幀,即每個視頻幀與音頻數(shù)據(jù)交織組織,這是CD-ROM上使用的默認(rèn)值。交織參數(shù)越小,回放AVI文件時讀到內(nèi)存中的數(shù)據(jù)流越少,回放越容易連續(xù)。因此,如果AVI文件的存儲平臺的數(shù)據(jù)傳輸率較大,則交錯參數(shù)可設(shè)置得高一些。當(dāng)AVI文件存儲在硬盤上時,也即從硬盤上讀AVI文件進行播放時,可以使用大一些的交織頻率,如幾幀,甚至1秒。
2、同步控制(Synchronization)
在AVI文件中,視像和伴音是同步得很好的。但在MPC中回放AVI文件時則有可能出現(xiàn)視像和伴音不同步的現(xiàn)象。
壓縮參數(shù)
在采集原始模擬視頻時可以用不壓縮的方式,這樣可以獲得最優(yōu)秀的圖像質(zhì)量。編輯后應(yīng)根據(jù)應(yīng)用環(huán)境環(huán)擇合適的壓縮參數(shù)。
[編輯本段]數(shù)字視頻
AVI及其播放器VFW已成為了PC機上最常用的視頻數(shù)據(jù)格式,是由于其具有如下的一些顯著特點:一、提供無硬件視頻回放功能
AVI格式和VFW軟件雖然是為當(dāng)前的MPC設(shè)計的,但它也可以不斷提高以適應(yīng)MPC的發(fā)展。根據(jù)AVI格式的參數(shù),其視窗的大小和幀率可以根據(jù)播放環(huán)境的硬件能力和處理速度進行調(diào)整。在低檔MPC機上或在網(wǎng)絡(luò)上播放時,VFW的視窗可以很小,色彩數(shù)和幀率可以很低;而在Pentium級系統(tǒng)上,對于64K色、320×240的壓縮視頻數(shù)據(jù)可實現(xiàn)每秒25幀的回放速率。這樣,VFW就可以適用于不同的硬件平臺,使用戶可以在普通的MPC上進行數(shù)字視頻信息的編輯和重放,而不需要昂貴的專門硬件設(shè)備。
二、實現(xiàn)同步控制和實時播放
通過同步控制參數(shù),AVI可以通過自調(diào)整來適應(yīng)重放環(huán)境,如果MPC的處理能力不夠高,而AVI文件的數(shù)據(jù)率又較大,在WINDOWS環(huán)境下播放該AVI文件時,播放器可以通過丟掉某些幀,調(diào)整AVI的實際播放數(shù)據(jù)率來達到視頻、音頻同步的效果。
三、可以高效地播放存儲在硬盤和光盤上的AVI文件
由于AVI數(shù)據(jù)的交叉存儲,VFW播放AVI數(shù)據(jù)時只需占用有限的內(nèi)存空間,因為播放程序可以一邊讀取硬盤或光盤上的視頻數(shù)據(jù)一邊播放,而無需預(yù)先把容量很大的視頻數(shù)據(jù)加載到內(nèi)存中。在播放AVI視頻數(shù)據(jù)時,只需在指定的時間內(nèi)訪問少量的視頻圖像和部分音頻數(shù)據(jù)。這種方式不僅可以提高系統(tǒng)的工作效率,同時也可以實現(xiàn)迅速地加載和快速地啟動播放程序,減少播放AVI視頻數(shù)據(jù)時用戶的等待時間。
四、提供了開放的AVI數(shù)字視頻文件結(jié)構(gòu)
AVI文件結(jié)構(gòu)不僅解決了音頻和視頻的同步問題,而且具有通用和開放的特點。它可以在任何Windows環(huán)境下工作,而且還具有擴展環(huán)境的功能。用戶可以開發(fā)自己的AVI視頻文件,在Windows環(huán)境下可隨時調(diào)用。
五、AVI文件可以再編輯
AVI一般采用幀內(nèi)有損壓縮,可以用一般的視頻編輯軟件如Adobe Premiere或MediaStudio進行再編輯和處理。
[編輯本段]AVI文件的展開結(jié)構(gòu)
AVI(Audio Video Interleaved的縮寫)是一種RIFF(Resource Interchange File Format的縮寫)文件格式,多用于音視頻捕捉、編輯、回放等應(yīng)用程序中。通常情況下,一個AVI文件可以包含多個不同類型的媒體流(典型的情況下有一個音頻流和一個視頻流),不過含有單一音頻流或單一視頻流的AVI文件也是合法的。AVI可以算是Windows操作系統(tǒng)上最基本的、也是最常用的一種媒體文件格式。先來介紹RIFF文件格式。RIFF文件使用四字符碼FOURCC(four-character code)來表征數(shù)據(jù)類型,比如‘RIFF’、‘AVI ’、‘LIST’等。注意,Windows操作系統(tǒng)使用的字節(jié)順序是little-endian,因此一個四字符碼‘a(chǎn)bcd’實際的DWORD值應(yīng)為0x64636261。另外,四字符碼中像‘AVI ’一樣含有空格也是合法的。
最開始的4個字節(jié)是一個四字符碼‘RIFF’,表示這是一個RIFF文件;緊跟著后面用4個字節(jié)表示此RIFF文件的大小;然后又是一個四字符碼說明文件的具體類型(比如AVI、WAVE等);最后就是實際的數(shù)據(jù)。注意文件大小值的計算方法為:實際數(shù)據(jù)長度 + 4(文件類型域的大小);也就是說,文件大小的值不包括‘RIFF’域和“文件大小”域本身的大小。
RIFF文件的實際數(shù)據(jù)中,通常還使用了列表(List)和塊(Chunk)的形式來組織。列表可以嵌套子列表和塊。其中,列表的結(jié)構(gòu)為:‘LIST’ listSize listType listData ——‘LIST’是一個四字符碼,表示這是一個列表;listSize占用4字節(jié),記錄了整個列表的大小;listType也是一個四字符碼,表示本列表的具體類型;listData就是實際的列表數(shù)據(jù)。注意listSize值的計算方法為:實際的列表數(shù)據(jù)長度 + 4(listType域的大小);也就是說listSize值不包括‘LIST’域和listSize域本身的大小。再來看塊的結(jié)構(gòu):ckID ckSize ckData ——ckID是一個表示塊類型的四字符碼;ckSize占用4字節(jié),記錄了整個塊的大小;ckData為實際的塊數(shù)據(jù)。注意ckSize值指的是實際的塊數(shù)據(jù)長度,而不包括ckID域和ckSize域本身的大小。(注意:在下面的內(nèi)容中,將以LIST ( listType ( listData ) )的形式來表示一個列表,以ckID ( ckData )的形式來表示一個塊,如[ optional element ]中括號中的元素表示為可選項。)
接下來介紹AVI文件格式。AVI文件類型用一個四字符碼‘AVI ’來表示。整個AVI文件的結(jié)構(gòu)為:一個RIFF頭 + 兩個列表(一個用于描述媒體流格式、一個用于保存媒體流數(shù)據(jù)) + 一個可選的索引塊。AVI文件的展開結(jié)構(gòu)大致如下:
RIFF (‘AVI ’
LIST (‘hdrl’
‘a(chǎn)vih’(主AVI信息頭數(shù)據(jù))
LIST (‘strl’
‘strh’ (流的頭信息數(shù)據(jù))
‘strf’ (流的格式信息數(shù)據(jù))
[‘strd’ (可選的額外的頭信息數(shù)據(jù)) ]
[‘strn’ (可選的流的名字) ]
...
)
...
)
LIST (‘movi’
{ SubChunk | LIST (‘rec ’
SubChunk1
SubChunk2
...
)
...
}
...
)
[‘idx1’ (可選的AVI索引塊數(shù)據(jù)) ]
)
首先,RIFF (‘AVI ’…)表征了AVI文件類型。然后就是AVI文件必需的第一個列表——‘hdrl’列表,用于描述AVI文件中各個流的格式信息(AVI文件中的每一路媒體數(shù)據(jù)都稱為一個流)。‘hdrl’列表嵌套了一系列塊和子列表——首先是一個‘a(chǎn)vih’塊,用于記錄AVI文件的全局信息,比如流的數(shù)量、視頻圖像的寬和高等,可以使用一個AVIMAINHEADER數(shù)據(jù)結(jié)構(gòu)來操作:
typedef struct _avimainheader {
FOURCC fcc; // 必須為‘a(chǎn)vih’
DWORD cb; // 本數(shù)據(jù)結(jié)構(gòu)的大小,不包括最初的8個字節(jié)(fcc和cb兩個域)
DWORD dwMicroSecPerFrame; // 視頻幀間隔時間(以毫秒為單位)
DWORD dwMaxBytesPerSec; // 這個AVI文件的最大數(shù)據(jù)率
DWORD dwPaddingGranularity; // 數(shù)據(jù)填充的粒度
DWORD dwFlags; // AVI文件的全局標(biāo)記,比如是否含有索引塊等
DWORD dwTotalFrames; // 總幀數(shù)
DWORD dwInitialFrames; // 為交互格式指定初始幀數(shù)(非交互格式應(yīng)該指定為0)
DWORD dwStreams; // 本文件包含的流的個數(shù)
DWORD dwSuggestedBufferSize; // 建議讀取本文件的緩存大小(應(yīng)能容納最大的塊)
DWORD dwWidth; // 視頻圖像的寬(以像素為單位)
DWORD dwHeight; // 視頻圖像的高(以像素為單位)
DWORD dwReserved[4]; // 保留
} AVIMAINHEADER;
然后,就是一個或多個‘strl’子列表。(文件中有多少個流,這里就對應(yīng)有多少個‘strl’子列表。)每個‘strl’子列表至少包含一個‘strh’塊和一個‘strf’塊,而‘strd’塊(保存編解碼器需要的一些配置信息)和‘strn’塊(保存流的名字)是可選的。首先是‘strh’塊,用于說明這個流的頭信息,可以使用一個AVISTREAMHEADER數(shù)據(jù)結(jié)構(gòu)來操作:
typedef struct _avistreamheader {
FOURCC fcc; // 必須為‘strh’
DWORD cb; // 本數(shù)據(jù)結(jié)構(gòu)的大小,不包括最初的8個字節(jié)(fcc和cb兩個域)
FOURCC fccType; // 流的類型:‘a(chǎn)uds’(音頻流)、‘vids’(視頻流)、
//‘mids’(MIDI流)、‘txts’(文字流)
FOURCC fccHandler; // 指定流的處理者,對于音視頻來說就是解碼器
DWORD dwFlags; // 標(biāo)記:是否允許這個流輸出?調(diào)色板是否變化?
WORD wPriority; // 流的優(yōu)先級(當(dāng)有多個相同類型的流時優(yōu)先級最高的為默認(rèn)流)
WORD wLanguage;
DWORD dwInitialFrames; // 為交互格式指定初始幀數(shù)
DWORD dwScale; // 這個流使用的時間尺度
DWORD dwRate;
DWORD dwStart; // 流的開始時間
DWORD dwLength; // 流的長度(單位與dwScale和dwRate的定義有關(guān))
DWORD dwSuggestedBufferSize; // 讀取這個流數(shù)據(jù)建議使用的緩存大小
DWORD dwQuality; // 流數(shù)據(jù)的質(zhì)量指標(biāo)(0 ~ 10,000)
DWORD dwSampleSize; // Sample的大小
struct {
short int left;
short int top;
short int right;
short int bottom;
} rcFrame; // 指定這個流(視頻流或文字流)在視頻主窗口中的顯示位置
// 視頻主窗口由AVIMAINHEADER結(jié)構(gòu)中的dwWidth和dwHeight決定
} AVISTREAMHEADER;
然后是‘strf’塊,用于說明流的具體格式。如果是視頻流,則使用一個BITMAPINFO數(shù)據(jù)結(jié)構(gòu)來描述;如果是音頻流,則使用一個WAVEFORMATEX數(shù)據(jù)結(jié)構(gòu)來描述。
當(dāng)AVI文件中的所有流都使用一個‘strl’子列表說明了以后(注意:‘strl’子列表出現(xiàn)的順序與媒體流的編號是對應(yīng)的,比如第一個‘strl’子列表說明的是第一個流(Stream 0),第二個‘strl’子列表說明的是第二個流(Stream 1),以此類推),‘hdrl’列表的任務(wù)也就完成了,隨后跟著的就是AVI文件必需的第二個列表——‘movi’列表,用于保存真正的媒體流數(shù)據(jù)(視頻圖像幀數(shù)據(jù)或音頻采樣數(shù)據(jù)等)。那么,怎么來組織這些數(shù)據(jù)呢?可以將數(shù)據(jù)塊直接嵌在‘movi’列表里面,也可以將幾個數(shù)據(jù)塊分組成一個‘rec ’列表后再編排進‘movi’列表。(注意:在讀取AVI文件內(nèi)容時,建議將一個‘rec ’列表中的所有數(shù)據(jù)塊一次性讀出。)但是,當(dāng)AVI文件中包含有多個流的時候,數(shù)據(jù)塊與數(shù)據(jù)塊之間如何來區(qū)別呢?于是數(shù)據(jù)塊使用了一個四字符碼來表征它的類型,這個四字符碼由2個字節(jié)的類型碼和2個字節(jié)的流編號組成。標(biāo)準(zhǔn)的類型碼定義如下:‘db’(非壓縮視頻幀)、‘dc’(壓縮視頻幀)、‘pc’(改用新的調(diào)色板)、‘wb’(音縮視頻)。比如第一個流(Stream 0)是音頻,則表征音頻數(shù)據(jù)塊的四字符碼為‘00wb’;第二個流(Stream 1)是視頻,則表征視頻數(shù)據(jù)塊的四字符碼為‘00db’或‘00dc’。對于視頻數(shù)據(jù)來說,在AVI數(shù)據(jù)序列中間還可以定義一個新的調(diào)色板,每個改變的調(diào)色板數(shù)據(jù)塊用‘xxpc’來表征,新的調(diào)色板使用一個數(shù)據(jù)結(jié)構(gòu)AVIPALCHANGE來定義。(注意:如果一個流的調(diào)色辦中途可能改變,則應(yīng)在這個流格式的描述中,也就是AVISTREAMHEADER結(jié)構(gòu)的dwFlags中包含一個AVISF_VIDEO_PALCHANGES標(biāo)記。)另外,文字流數(shù)據(jù)塊可以使用隨意的類型碼表征。
最后,緊跟在‘hdrl’列表和‘movi’列表之后的,就是AVI文件可選的索引塊。這個索引塊為AVI文件中每一個媒體數(shù)據(jù)塊進行索引,并且記錄它們在文件中的偏移(可能相對于‘movi’列表,也可能相對于AVI文件開頭)。索引塊使用一個四字符碼‘idx1’來表征,索引信息使用一個數(shù)據(jù)結(jié)構(gòu)來AVIOLDINDEX定義。
typedef struct _avioldindex {
FOURCC fcc; // 必須為‘idx1’
DWORD cb; // 本數(shù)據(jù)結(jié)構(gòu)的大小,不包括最初的8個字節(jié)(fcc和cb兩個域)
struct _avioldindex_entry {
DWORD dwChunkId; // 表征本數(shù)據(jù)塊的四字符碼
DWORD dwFlags; // 說明本數(shù)據(jù)塊是不是關(guān)鍵幀、是不是‘rec ’列表等信息
DWORD dwOffset; // 本數(shù)據(jù)塊在文件中的偏移量
DWORD dwSize; // 本數(shù)據(jù)塊的大小
} aIndex[]; // 這是一個數(shù)組!為每個媒體數(shù)據(jù)塊都定義一個索引信息
} AVIOLDINDEX;
注意:如果一個AVI文件包含有索引塊,則應(yīng)在主AVI信息頭的描述中,也就是AVIMAINHEADER結(jié)構(gòu)的dwFlags中包含一個AVIF_HASINDEX標(biāo)記。
還有一種特殊的數(shù)據(jù)塊,用一個四字符碼‘JUNK’來表征,它用于內(nèi)部數(shù)據(jù)的隊齊(填充),應(yīng)用程序應(yīng)該忽略這些數(shù)據(jù)塊的實際意義。
總結(jié)
以上是生活随笔為你收集整理的AVI格式详解(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QQ第三方登陆的那些坑(不同应用的用户o
- 下一篇: 程序员的九阳真经