AVI文件規范

AVI文件規范
PeterLee 2007-10-14

?

一、AVI文件簡介

AVI的英文全稱為Audio Video Interleaved,即音頻視頻交錯格式,是將語音和影像同步組合在一起的文件格式。AVI于1992年被Microsoft公司推出,隨Windows3.1一起被人們所認識和熟知。AVI文件格式多用于音視頻捕捉、編輯、回放等應用程序中。通常情況下,一個AVI文件可以包含多個不同類型的媒體流(典型的情況下有一個音頻流和一個視頻流),不過含有單一音頻流或單一視頻流的AVI文件也是合法的。AVI可以算是Windows操作系統上最基本的、也是最常用的一種媒體文件格式。

Note: 本文介紹的是基本的AVI文件格式規范,至于newAVI等一些AVI擴展格式,請關注筆者后續文章。

?

二、RIFF文件規范

AVI文件屬于一種RIFF(Resource Interchange File Format的縮寫)文件格式,與此同類的還有常見的WAV文件。RIFF是Microsoft提出的一種多媒體文件的存儲方式,不同編碼的音頻、視頻文件,可以按照它定義的存儲規則保存、記錄各自不同的數據。如果讀者不熟悉RIFF文件規范,閱讀下面章節前,建議先閱讀《RIFF文件規范》這篇文章:http://blog.csdn.net/sunshine1314/archive/2007/10/10/1817991.aspx

?

三、AVI文件結構實例分析

1、AVI文件結構示例

?????? 圖1所示為windows系統目錄下的clock.avi的文件結構圖,其結構是用RIFFspot程序解析得到的,關于RIFFspot程序,感興趣的讀者可以到下面的網址中下載:http://blog.csdn.net/sunshine1314/archive/2007/09/22/1795739.aspx

?


圖1 clock.avi文件結構

?

2、AVI文件全局結構說明

?????? 如圖1所示,整個AVI文件的結構為:一個RIFF頭 + 兩個列表(一個用于描述媒體流格式、一個用于保存媒體流數據) + 一個可選的索引塊 + 一個JUNK塊。

首先,RIFF (‘AVI ’…)表征了AVI文件類型。然后就是AVI文件必需的第一個列表——‘hdrl’列表,用于描述AVI文件中各個流的格式信息(AVI文件中的每一路媒體數據都稱為一個流)。‘hdrl’列表嵌套了一系列塊和子列表——首先是一個‘avih’塊,用于記錄AVI文件的全局信息。然后,就是一個或多個‘strl’子列表。文件中有多少個流,這里就對應有多少個‘strl’子列表,示例clock.avi文件有兩路流,既音頻流和視頻流。

當AVI文件中的所有流都使用一個‘strl’子列表說明了以后(注意:‘strl’子列表出現的順序與媒體流的編號是對應的,比如第一個‘strl’子列表說明的是第一個流(Stream 0),第二個‘strl’子列表說明的是第二個流(Stream 1),以此類推),‘hdrl’列表的任務也就完成了,隨后跟著的就是AVI文件必需的第二個列表——‘movi’列表,用于保存真正的媒體流數據(視頻圖像幀數據或音頻采樣數據等)。

最后,緊跟在‘hdrl’列表和‘movi’列表之后的,就是AVI文件可選的索引塊。這個索引塊為AVI文件中每一個媒體數據塊進行索引,并且記錄它們在文件中的偏移(可能相對于‘movi’列表,也可能相對于AVI文件開頭)。

圖1中還有一種特殊的數據塊,用一個四字符碼‘JUNK’來表征,它用于內部數據的隊齊(填充),應用程序應該忽略這些數據塊的實際意義。

?

3、’avih’塊

‘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;

?

4、’strl’子列表

每個‘strl’子列表至少包含一個‘strh’塊和一個‘strf’塊,而‘strd’塊(保存編解碼器需要的一些配置信息)和‘strn’塊(保存流的名字)是可選的。首先是‘strh’塊,用于說明這個流的頭信息,可以使用一個AVISTREAMHEADER數據結構來操作:

typedef struct _avistreamheader {
???? FOURCC fcc;? // 必須為‘strh’
???? DWORD? cb;?? // 本數據結構的大小,不包括最初的8個字節(fcc和cb兩個域)
???? 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? dwSuggestedBufferSize; // 讀取這個流數據建議使用的緩存大小
???? DWORD? dwQuality;??? // 流數據的質量指標(0 ~ 10,000)
???? DWORD? dwSampleSize; // Sample的大小
???? struct {
???????? short int left;
???????? short int top;
???????? short int right;
???????? short int bottom;
}? rcFrame;? // 指定這個流(視頻流或文字流)在視頻主窗口中的顯示位置
???????????? // 視頻主窗口由AVIMAINHEADER結構中的dwWidth和dwHeight決定
} AVISTREAMHEADER;

?

然后是‘strf’塊,用于說明流的具體格式。如果是視頻流,則使用一個BITMAPINFO數據結構來描述;如果是音頻流,則使用一個WAVEFORMATEX數據結構來描述。

?

5、‘movi’列表

‘movi’列表保存的是真正的媒體流數據,其數據組織方式有兩種。可以將數據塊直接嵌在‘movi’列表里面,也可以將幾個數據塊分組成一個‘rec ’列表后再編排進‘movi’列表。

當AVI文件中包含有多個流的時候,數據塊與數據塊之間如何來區別呢?數據塊使用了一個四字符碼來表征它的類型,這個四字符碼由2個字節的類型碼和2個字節的流編號組成。標準的類型碼定義如下:‘db’(非壓縮視頻幀)、‘dc’(壓縮視頻幀)、‘pc’(改用新的調色板)、‘wb’(音縮視頻)。比如第一個流(Stream 0)是音頻,則表征音頻數據塊的四字符碼為‘00wb’;第二個流(Stream 1)是視頻,則表征視頻數據塊的四字符碼為‘00db’或‘00dc’。對于視頻數據來說,在AVI數據序列中間還可以定義一個新的調色板,每個改變的調色板數據塊用‘xxpc’來表征,新的調色板使用一個數據結構AVIPALCHANGE來定義。(注意:如果一個流的調色板中途可能改變,則應在這個流格式的描述中,也就是AVISTREAMHEADER結構的dwFlags中包含一個AVISF_VIDEO_PALCHANGES標記)。另外,文字流數據塊可以使用隨意的類型碼表征。

?

6、AVI索引塊

索引塊使用一個四字符碼‘idx1’來表征,索引信息使用一個數據結構來AVIOLDINDEX定義。

typedef struct _avioldindex {
?? FOURCC? fcc;? // 必須為‘idx1’
?? DWORD?? cb;?? // 本數據結構的大小,不包括最初的8個字節(fcc和cb兩個域)
?? struct _avioldindex_entry {
????? DWORD?? dwChunkId;?? // 表征本數據塊的四字符碼
????? DWORD?? dwFlags;???? // 說明本數據塊是不是關鍵幀、是不是‘rec ’列表等信息
????? DWORD?? dwOffset;??? // 本數據塊在文件中的偏移量
????? DWORD?? dwSize;????? // 本數據塊的大小
? } aIndex[]; // 這是一個數組!為每個媒體數據塊都定義一個索引信息
} AVIOLDINDEX;

?注意:如果一個AVI文件包含有索引塊,則應在主AVI信息頭的描述中,也就是AVIMAINHEADER結構的dwFlags中包含一個AVIF_HASINDEX標記。

?

四、后記

?????? 大家應該都聽過“AVI文件不適合用于流媒體傳輸”這樣的說法,通過本文對AVI文件結構的解析,相信大家對這種說法有更清晰的驗證,因為AVI文件結構中置于文件尾部的索引塊、頭部信息中規定的文件長度等過多的選項都是不適合流媒體應用的。

?

Note: 本文內容節選自 AVI文件格式----摘自《DirectShow實務精選》 作者:陸其明, 并作了整理。

?


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/sunshine1314/archive/2007/10/14/1824432.aspx

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456097.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456097.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456097.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python中的流程控制

流程控制 流程: 計算機執行代碼的順序,就是流程。 流程控制: 對計算機代碼執行順序的控制,就是流程控制。 流程分類: 流程控制一共分為三類,分別是 順序結構、分支(選擇)結構、循環結構。 順序結構 順序…

tomcat jdbc SlowQueryReport的實現解讀

為什么80%的碼農都做不了架構師?>>> ##序 tomcat提供了JdbcInterceptor可以用來監控jdbc的執行情況,默認提供了好幾個現成的interceptor可以用,SlowQueryReport以及SlowQueryReportJmx就是其中的兩個。 ##JdbcInterceptor的基本原…

【機器學習】Bagging和Boosting的區別(面試準備)

Baggging 和Boosting都是模型融合的方法,可以將弱分類器融合之后形成一個強分類器,而且融合之后的效果會比最好的弱分類器更好。 Bagging: 先介紹Bagging方法: Bagging即套袋法,其算法過程如下: 從原始樣本集中抽取訓…

python中的循環結構

循環結構 循環結構可以減少源程序重復書寫的工作量(代碼量),用來描述重復執行某段算法的問題,這是程序設計中最能發揮計算機特長的程序結構。 Python中循環結構分為兩類,分別是 while 和 for .. in while 格式1: num1,num2 3…

線性判別結合源碼分析LDA原理

1. LDA的思想 LDA線性判別分析也是一種經典的降維方法,LDA是一種監督學習的降維技術,也就是說它的數據集的每個樣本是有類別輸出的。這點和PCA不同。PCA是不考慮樣本類別輸出的無監督降維技術。LDA的思想可以用一句話概括,就是“投影后類內方…

RIFF文件規范

RIFF文件規范Peter Lee 2007-10-02 摘要:RIFF全稱為資源互換文件格式(Resources Interchange File Format),RIFF文件是windows環境下大部分多媒體文件遵循的一種文件結構,常見的如WAV文件、AVI文件等。RIFF可以看成一種…

FB宣布將回購60億美元股票 首席會計官將離職

11月19日消息,據美國媒體報道,Facebook宣布將回購60億美元股票,回購計劃將在明年第一季度開始實施。另外,該公司還宣布首席會計官賈斯艾特瓦爾將離職。 短期回購股票可使Facebook贏得時間,緩解投資長期項目如Instagram…

2017小目標

最美人間四月天,沒有三月的傲寒,沒有五月的燥熱,桃花剛偷去了紅,楊柳在風中扭著腰,櫻花正開的爛漫。工作繁忙之余。做一下深呼吸,沾衣欲濕杏花雨,吹面不含楊柳風。不知不覺2017第一季度已經結束…

【機器學習】feature_importances_ 參數源碼解析

在用sklearn的時候經常用到feature_importances_ 來做特征篩選,那這個屬性到底是啥呢。 分析源碼發現來源于每個base_estimator的決策樹的 feature_importances_ 由此發現計算邏輯來源于cython文件,這個文件可以在其github上查看源代碼 而在DecisionTree…

流行視頻格式講解

轉自 豪杰技術 http://www.herosoft.com 流行視頻格式講解 *. MPEG/.MPG/.DAT MPEG也是Motion Picture Experts Group 的縮寫。這類格式包括了 MPEG-1, MPEG-2 和 MPEG-4在內的多種視頻格式。MPEG-1相信是大家接觸得最多的了,因為目前其正在被廣泛地應用在 VCD…

歐盟通過最新《數據保護法》

歐洲議會近日通過了最新的《數據保護法》,用以保護消費者的數據和隱私。該法案是數字時代的首個新規,取代了一套20年前的、在互聯網發展初期階段構想的規則。新規規定,當企業所擁有的消費者相關數據遭遇黑客攻擊等泄露事件后,消費…

ajax 長輪詢

未完成,因為需要換成webscoket來做,該ajax長輪詢有待完善 function poll(){$.ajax({type:"POST",url:"ajax",async:true,data:{"receiverType":"single","receiverId":"${receiverId}",&qu…

python中變量的作用域

變量的作用域 變量的作用域就是指變量的有效范圍。 變量按照作用范圍分為兩類,分別是 全局變量 和 局部變量。 全局變量:在函數外部聲明的變量就是全局變量 有效范圍:全局變量在函數外部可以正常使用。全局變量在函數內部也可以正常使用(需要…

【機器學習】 關聯規則Apriori和mlxtend——推薦算法

引入: 啤酒與尿布的故事 關聯規律挖掘:從交易數據中發現:買了X 還會買Y 的規則 關聯規律挖掘‘購物籃分析’Market Basket Analysis(MBA) 關聯規律->應用于推薦系統 1. 關聯規則代碼演示 使用的是mlxtend.frequent…

預防和檢測如日中天?事件響應表示不服

近些年,企業安全工作的關注點,一直聚焦在如何預防黑客攻擊。但是,頻發的大型跨國企業的數據泄露事件表明,即使是對網絡安全更為重視,同時也投入了更多成本的金融業,也明白了“無論做了怎樣的安全防護&#…

python中的內部函數和閉包函數

內部函數 在函數內部聲明的函數就是內部函數。 格式: def 函數名():局部變量...def 內部函數名():Python功能代碼...示例: def funName():name dragon#定義一個內部函數def inner():print(我是內部函數)‘’‘注釋: 1.內部函數的本質就是局…

【機器學習】K-Means(非監督學習)學習及實例使用其將圖片壓縮

非監督學習之k-means K-means通常被稱為勞埃德算法,這在數據聚類中是最經典的,也是相對容易理解的模型。算法執行的過程分為4個階段。 1、從數據中選擇k個對象作為初始聚類中心; 2、計算每個聚類對象到聚類中心的距離來劃分; 3、再次計算…

CloudCC CRM:物聯網必將成為CRM的推動力

CRM熱門話題背后的主要推動力包括云、社交、移動和大數據,CloudCC CRM認為物聯網必將成為CRM的推動力,也就是傳感器將事物連接到互聯網,創建之前我們從未想到的新型服務。 社交:在銷售、市場和客戶服務部門,營銷人員正…

關于Video Renderer和Overlay Mixer

原文作者: 陸其明 整理日期: 2004/12/27 大家知道,Video Renderer (VR)是接收RGB/YUV裸數據,然后在顯示器上顯示的Filter。為提高計算機畫圖性能,根據你計算機顯卡的能力,VR會優先使用DirectDraw以及Overlay表面;如果…

【tensorflow】tensorflow -gpu安裝及jupyter環境更改

tensorflow -gpu安裝 首先,安裝Anoconda 1. 官網下載點我:2.安裝 點擊 python 3.6 version自動下載x64版,下載好之后,然后安裝。 如圖,打上勾之后,一路next3.打開終端 1)輸入conda –-version …