發展歷程 它於1992年被
Microsoft 公司推出,隨
Windows 3.1 一起被人們所認識和熟知。所謂“音頻視頻交錯”,就是可以將視頻和音頻交織在一起進行同步播放。這種
視頻格式 的優點是可以跨多個平台使用,其缺點是體積過於龐大,而且更加糟糕的是
壓縮標準 不統一,最普遍的現象就是高版本Windows
媒體播放器 播放不了採用早期編碼編輯的AVI格式視頻,而低版本Windows媒體播放器又播放不了採用最新編碼編輯的AVI格式視頻,所以我們在進行一些AVI格式的視頻播放時常會出現由於
視頻編碼 問題而造成的視頻不能播放或即使能夠播放,但存在不能調節播放進度和播放時只有聲音沒有圖像等一些莫名其妙的問題,如果用戶在進行AVI格式的視頻播放時遇到了這些問題,可以通過下載相應的
解碼器 來解決。AVI是視頻檔案的常見
封裝格式 ,比如一些遊戲、教育軟體的片頭,
多媒體光碟 中,都會有不少的AVI。在Windows各版本作業系統里都能直接播放AVI,而且它自己的格式也有好幾種,最常見的有Intel Indeo(R)Video R3.2.Microsoft video 等。
AⅥ
其中數據塊包含實際
數據流 ,即圖像和聲音
序列數據 。這是檔案的主體,也是決定檔案容量的主要部分。視頻檔案的大小等於該檔案的
數據率 乘以該視頻播放的時間長度,索引塊包括數據塊列表和它們在檔案中的位置,以提供檔案內數據隨機存取能力。檔案頭包括檔案的通用信息,定義
數據格式 ,所用的
壓縮算法 等參數。
nAVI 格式
nAVI 是newAVI的縮寫,是一個名為ShadowRealm的地下
組織發展 起來的一種新視頻格式(與我們上面所說的AVI格式沒有太大聯繫)。它是由Microsoft
ASF 壓縮算法的修改而來的,但是又與下面介紹的
網路影像視頻 中的
ASF視頻格式 有所區別,它以犧牲原有ASF視頻檔案視頻“流”特性為代價而通過增加
幀率 來大幅提高ASF視頻檔案的
清晰度 。
DV-AVI格式
1992年初
Microsoft 公司推出了AVI技術及其套用軟體
VFW (Video for Windows)。在AVI檔案中,
運動圖像 和伴音數據是以交織的方式存儲,並獨立於硬體設備。這種按交替方式組織音頻和視像數據的方式可使得讀取視頻數據流時能更有效地從存儲媒介得到連續的信息。構成一個AVI檔案的主要參數包括視像參數、伴音參數和壓縮參數等:
AⅥ參數調節
AVI沒有
MPEG 這么複雜,從
Windows 3.1 時代,它就已經面世了。它最直接的優點就是兼容好、調用方便而且圖象質量好,因此也常常與
DVD 相併稱。但它的缺點也是十分明顯的:體積大。也是因為這一點,我們才看到了
MPEG-1 和
MPEG-4 的誕生。2小時影像的AVI檔案的體積與
MPEG-2 相差無幾,不過這只是針對
標準解析度 而言的:根據不同的套用要求,AVI的解析度可以隨意調。視窗越大,檔案的數據量也就越大。降低解析度可以大幅減低它的體積,但圖象質量就必然受損。與MPEG-2格式檔案體積差不多的情況下,AVI格式的
視頻質量 相對而言要差不少,但製作起來對電腦的配置要求不高,經常有人先錄製好了AVI格式的視頻,再轉換為其他格式。
數字視頻 AVI及其播放器
VFW 已成為了PC機上最常用的視頻
數據格式 ,是由於其具有如下的一些顯著特點:
一、提供無硬體視頻回放功能
AVI格式和VFW軟體雖然是為當前的
MPC 設計的,但它也可以不斷提高以適應MPC的發展。根據AVI格式的參數,其視窗的大小和
幀率 可以根據播放環境的硬體能力和
處理速度 進行調整。在低檔MPC機上或在網路上播放時,VFW的視窗可以很小,色彩數和幀率可以很低;而在
Pentium 級系統上,對於64K色、320×240的壓縮
視頻數據 可實現每秒25幀的回放速率。這樣,VFW就可以適用於不同的硬體平台,使用戶可以在普通的MPC上進行
數字視頻 信息的編輯和重放,而不需要昂貴的專門硬體設備。
AⅥ檔案
通過同步控制參數,AVI可以通過
自調整 來適應重放環境,如果MPC的處理能力不夠高,而AVI檔案的
數據率 又較大,在
Windows 環境下播放該AVI檔案時,播放器可以通過丟掉某些幀,調整AVI的實際播放數據率來達到視頻、音頻同步的效果。
三、可以高效地播放存儲在硬碟和 光碟上的AVI檔案
由於AVI數據的交叉存儲,
VFW 播放AVI數據時只需占用有限的
記憶體空間 ,因為播放程式可以一邊讀取硬碟或光碟上的視頻數據一邊播放,而無需預先把容量很大的視頻數據載入到記憶體中。在播放AVI視頻數據時,只需在指定的時間內訪問少量的視頻圖像和部分
音頻數據 。這種方式不僅可以提高系統的
工作效率 ,同時也可以實現迅速地載入和快速地啟動播放程式,減少播放AVI視頻數據時用戶的
等待時間 。
AVI檔案結構不僅解決了音頻和視頻的同步問題,而且具有通用和開放的特點。它可以在任何Windows環境下工作,而且還具有擴展環境的功能。用戶可以開發自己的AVI
視頻檔案 ,在Windows環境下可隨時調用。
五、AVI檔案可以再編輯
六.AVI大致分為4種類型
1:H.264/MPEG-4AVC VideoFormat(*.avi) 是
MPEG4 視頻格式 的擴展。具有更高的
壓縮率 。
2:AVI —Audio-Video.lnterleaved(*.avi) 是將與語言同步組成在一起的格式。
3:Lossless.uncompressed.AVI(*.avi ) 是主要用於用戶
視頻編輯 。
4:AVI:with DVcodec(*.avi) 是主要用於用戶視頻編輯格式,也是比較老的格式。
相關參數 視像參數 1.視窗尺寸(Video size):根據不同的套用要求,AVI的視窗大小或解析度可按4:3的比例或隨意調整:大到全螢幕720×576,小到160×120甚至更低。視窗越大,
視頻檔案 的數據量越大。
2.
幀率 (Frames Per Second,即fps):幀率也可以調整,而且與數據量成正比。不同的幀率會產生不同的畫面連續效果。
伴音參數 在AVI檔案中,視像和伴音是分別存儲的,因此可以把一段視頻中的視像與另一段視頻中的伴音組合在一起。AVI檔案與
WAV 檔案密切相關,因為WAV檔案是AVI檔案中伴音信號的來源。伴音的
基本參數 也即WAV
檔案格式 的參數,除此以外,AVI檔案還包括與音頻有關的其他參數:
AⅥ數字視頻截圖
1.視像與伴音的交織參數(Interlace Audio Every X Frames)AVI格式中每X幀交織存儲的
音頻信號 ,也即伴音和視像交替的頻率X是
可調參數 ,X的
最小值 是一幀,即每個
視頻幀 與
音頻數據 交織組織,這是
CD-ROM 上使用的
默認值 。交織參數越小,回放AVI檔案時讀到記憶體中的
數據流 越少,回放越容易連續。因此,如果AVI檔案的
存儲平台 的
數據傳輸率 較大,則交錯參數可設定得高一些。當AVI檔案存儲在硬碟上時,也即從硬碟上讀AVI檔案進行播放時,可以使用大一些的交織頻率,如幾幀,甚至1秒。
在AVI檔案中,視像和伴音是同步得很好的。但在
MPC 中回放AVI檔案時則有可能出現視像和伴音不同步的現象。
壓縮參數 在採集原始
模擬視頻 時可以用不壓縮的方式,這樣可以獲得最優秀的質量。編輯後應根據套用
環境選擇 合適的壓縮參數。
展開結構 AVI(Audio Video Interleaved的縮寫)是一種
RIFF (Resource Interchange File Format的縮寫)
檔案格式 ,多用於音視頻捕捉、編輯、回放等
應用程式 中。通常情況下,一個AVI檔案可以包含多個不同類型的
媒體流 (典型的情況下有一個
音頻流 和一個
視頻流 ),不過含有單一音頻流或單一視頻流的AVI檔案也是合法的。AVI可以算是
Windows作業系統 上最基本的、也是最常用的一種媒體檔案格式。
先來介紹RIFF檔案格式。RIFF檔案使用四字元碼
FOURCC (four-character code)來表征
數據類型 ,比如‘RIFF’、‘AVI’、‘LIST’等。注意,Windows作業系統使用的
位元組順序 是
little-endian ,DWORD類型0xA8B9C0D1在檔案(或記憶體)中存儲順序為: D1 C0 B9 A8。另外,四字元碼中像‘AVI ’一樣含有空格也是合法的。
最開始的4個位元組是一個四字元碼‘RIFF’,表示這是一個RIFF檔案;緊跟著後面用4個位元組表示此RIFF檔案的大小;然後又是一個四字元碼說明檔案的具體類型(比如AVI、
WAVE 等);最後就是實際的數據。注意
檔案大小 值的計算方法為:實際數據長度 +4(檔案類型域的大小);也就是說,檔案大小的值不包括‘RIFF’域和“檔案大小”域本身的大小。RIFF檔案的實際數據中,通常還使用了列表(List)和塊(Chunk)的形式來組織。列表可以嵌套子列表和塊。其中,列表的結構為:‘LIST’ listSize listType listData ——‘LIST’是一個四字元碼,表示這是一個列表;listSize占用4位元組,記錄了整個列表的大小;listType也是一個四字元碼,表示本列表的具體類型;listData就是實際的列表數據。注意listSize值的計算方法為:實際的列表數據長度 +4(listType域的大小);也就是說listSize值不包括‘LIST’域和listSize域本身的大小。再來看塊的結構:ckID ckSize ckData ——ckID是一個表示塊類型的四字元碼;ckSize占用4位元組,記錄了整個塊的大小;ckData為實際的
塊數據 。注意ckSize值指的是實際的塊數據長度,而不包括ckID域和ckSize域本身的大小。(注意:在下面的內容中,將以LIST (listType) (listData)的形式來表示一個列表,以ckID (ckData)的形式來表示一個塊,如[ optional element ]
中括弧 中的元素表示為可選項。)
檔案格式
接下來介紹AVI
檔案格式 。AVI檔案類型用一個四字元碼‘AVI ’來表示。整個AVI檔案的結構為:一個RIFF頭 + 兩個列表(一個用於描述媒體
流格式 、一個用於保存媒體
流數據 ) + 一個可選的索引塊。AVI檔案的展開結構大致如下:
/* * heres the general layout of an AVI riff file (new format) * * RIFF (3F??????) AVI <- not more than 1 GB in size * LIST (size) hdrl * avih (0038) * LIST (size) strl * strh (0038) * strf (????) * indx (3ff8) <- size may vary,should be sector sized * LIST (size) strl * strh (0038) * strf (????) * indx (3ff8) <- size may vary,should be sector sized * LIST (size) odml * dmlh (????) * JUNK (size) <- fill to align to sector - 12 * LIST (7f??????) movi <- aligned on sector - 12 * 00dc (size) <- sector aligned * 01wb (size) <- sector aligned * ix00 (size) <- sector aligned * idx1 (00??????) <- sector aligned * RIFF (7F??????) AVIX * JUNK (size) <- fill to align to sector -12 * LIST (size) movi * 00dc (size) <- sector aligned * RIFF (7F??????) AVIX <- not more than 2GB in size * JUNK (size) <- fill to align to sector - 12 * LIST (size) movi * 00dc (size) <- sector aligned * *-===================================================================*/ 'hdrl'
首先,RIFF ('AVI'…)表征了AVI檔案類型。然後就是AVI檔案必需的第一個列表——'hdrl'列表,用於描述AVI檔案中各個流的格式信息(AVI檔案中的每一路媒體
數據都 稱為一個流)。'hdrl'列表嵌套了一系列塊和子列表——首先是一個'avih'塊,用於記錄AVI檔案的全局信息,比如流的數量、視頻圖像的寬和高等,可以使用一個AVIMAINHEADER數據結構來操作:
typedef struct _avimainheader { FOURCC fcc; // 必須為‘avih’ DWORD cb; // 本數據結構的大小,不包括最初的8個位元組(fcc和cb兩個域) DWORD dwMicroSecPerFrame; //視頻幀間隔時間(以微秒為單位) DWORD dwMaxBytesPerSec; // 這個AVI檔案的最大數據率 DWORD dwPaddingGranularity; // 數據填充的粒度 DWORD dwFlags; // AVI檔案的全局標記,比如是否含有索引塊等 DWORD dwTotalFrames; // 總幀數 DWORD dwInitialFrames; // 為互動格式指定初始幀數(非互動格式應該指定為0) DWORD dwStreams; // 本檔案包含的流的個數 DWORD dwSuggestedBufferSize; // 建議讀取本檔案的快取大小(應能容納最大的塊) DWORD dwWidth; //視頻圖像的寬(以像素為單位) DWORD dwHeight; //視頻圖像的高(以像素為單位) DWORD dwReserved[4]; // 保留 } AVIMAINHEADER; 'strl'
然後,就是一個或多個'strl'子列表。(檔案中有多少個流,這裡就對應有多少個'strl'子列表。)每個'strl'子列表至少包含一個'strh'塊和一個'strf'塊,而'strd'塊(保存
編解碼器 需要的一些配置信息)和'strn'塊(保存流的名字)是可選的。首先是'strh'塊,用於說明這個流的頭信息,可以使用一個AVISTREAMHEADER
數據結構 來操作:
typedef struct _avistreamheader { FOURCC fcc; // 必須為‘strh’ FOURCC fccType; // 流的類型:‘auds’(音頻流)、‘vids’(視頻流)、 //‘mids’(MIDI流)、‘txts’(文字流) FOURCC fccHandler; // 指定流的處理者,對於音視頻來說就是解碼器 DWORD dwFlags; // 標記:是否允許這個流輸出?調色板是否變化? WORD wPriority; // 流的優先權(當有多個相同類型的流時優先權最高的為默認流) WORD wLanguage; DWORD dwInitialFrames; // 為互動格式指定初始幀數 DWORD dwScale; // 這個流使用的時間尺度 DWORD dwRate; DWORD dwStart; // 流的開始時間 DWORD dwLength; // 流的長度(單位與dwScale和dwRate的定義有關) 讀取這個流數據建議使用的快取大小 DWORD dwQuality; // 流數據的質量指標(0 ~ 10,000) DWORD dwSampleSize; // Sample的大小 struct { short int left; short int top; short int right; short int bottom; } rcFrame; // 指定這個流(視頻流或文字流)在視頻主視窗中的顯示位置 //視頻主視窗由AⅥMAINHEADER結構中的dwWidth和dwHeight決定 } AVISTREAMHEADER; 'strf'
然後是'strf'塊,用於說明流的具體格式。如果是視頻流,則使用一個BITMAPINFO數據結構來描述;如果是音頻流,則使用一個WAVEFORMATEX數據結構來描述。
當AVI檔案中的所有流都使用一個'strl'子列表說明了以後(注意:'strl'子列表出現的順序與媒體流的編號是對應的,比如第一個'strl'子列表說明的是第一個流(Stream 0),第二個'strl'子列表說明的是第二個流(Stream 1),以此類推),'hdrl'列表的任務也就完成了,隨後跟著的就是AVI檔案必需的第二個列表——'movi'列表,用於保存真正的媒體流數據(視頻
圖像幀 數據或音頻
採樣數據 等)。那么,怎么來組織這些數據呢?可以將
數據塊 直接嵌在'movi'列表裡面,也可以將幾個數據塊分組成一個'rec'列表後再編排進'movi'列表。(注意:在讀取AVI檔案內容時,建議將一個'rec'列表中的所有數據塊一次性讀出。)但是,當AVI檔案中包含有多個流的時候,數據塊與數據塊之間如何來區別呢?於是數據塊使用了一個四字元碼來表征它的類型,這個四字元碼由2個位元組的類型碼和2個位元組的流編號組成。標準的類型碼定義如下:'db'(非壓縮視頻幀)、'dc'(壓縮視頻幀)、'pc'(改用新的
調色板 )、'wb'(音縮視頻)。比如第一個流(Stream 0)是音頻,則表征音頻
數據塊 的四字元碼為'00wb';第二個流(Stream 1)是視頻,則表征視頻數據塊的四字元碼為'01db'或'01dc'。對於視頻數據來說,在AVI數據序列中間還可以定義一個新的調色板,每個改變的調色板數據塊用‘xxpc’來表征,新的調色板使用一個數據結構AVIPALCHANGE來定義。(注意:如果一個流的調色辦中途可能改變,則應在這個流格式的描述中,也就是AVISTREAMHEADER結構的dwFlags中包含一個AVISF_VIDEO_PALCHANGES標記。)另外,文字流數據塊可以使用隨意的類型
碼錶 征。
最後,緊跟在'hdrl'列表和'movi'列表之後的,就是AVI檔案可選的索引塊。這個索引塊為AVI檔案中每一個媒體數據塊進行索引,並且記錄它們在檔案中的偏移(可能相對於'movi'列表,也可能相對於AVI檔案開頭)。索引塊使用一個四字元碼'idx1'來表征,索引
信息使用 一個數據結構來AVIOLDINDEX定義。
typedef struct _avioldindex { FOURCC fcc; // 必須為‘idx1’ struct _avioldindex_entry { DWORD dwChunkId; // 表征本數據塊的四字元碼 DWORD dwFlags; // 說明本數據塊是不是關鍵幀、是不是‘rec ’列表等信息 DWORD dwOffset; // 本數據塊在檔案中的偏移量 DWORD dwSize; // 本數據塊的大小 } aIndex[]; // 這是一個數組!為每個媒體數據塊都定義一個索引信息 } AVIOLDINDEX; 注意:如果一個AVI
檔案包含 有索引塊,則應在主AVI信息頭的描述中,也就是AVIMAINHEADER結構的dwFlags中包含一個AVIF_HASINDEX標記。
還有一種特殊的
數據塊 ,用一個四字元碼'JUNK'來表征,它用於內部數據的隊齊(填充),應用程式應該忽略這些數據塊的實際意義。