日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

avi 文件头分析

發(fā)布時間:2024/3/24 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 avi 文件头分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

AVI詳解

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 ’一樣含有空格也是合法的。

RIFF 文件首先含有一個文件頭結(jié)構(gòu)。其中,最開始的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ù)都稱為一個流)?!甴drl’列表嵌套了一系列塊和子列表——首先是一個‘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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩精品久久 | 在线免费av片 | 亚洲精品中文字幕乱码三区91 | 天天干国产 | 日韩美女中文字幕 | 免费看欧美一级片 | 天天想你免费观看完整版高清电影 | 三级免费黄 | 亚洲成人日韩在线 | 伊人成长网 | 精品乱码一区内射人妻无码 | 欧美天天视频 | 在线国产视频一区 | 亚洲美女av在线 | 中文字幕色片 | 国产高清视频在线播放 | 国产精品综合久久久久久 | 成人四色 | 天天久久久 | 毛片传媒 | 色久综合 | 少妇资源 | 美女黄页在线观看 | 成人黄色网页 | 免费日批网站 | 99久久黄色 | 亚洲色成人一区二区三区小说 | 亚洲欧洲在线播放 | 中国三级黄色 | 黄色网免费看 | 少妇诱惑av | 久久久久久国产精品三区 | 亚洲精品一区二区三区在线 | 国产精品一区二区麻豆 | 欧洲女性下面有没有毛发 | 久久久久九九 | 国产成人久久精品77777综合 | 69堂在线观看 | 久久久wwww| 免费在线毛片 | 三级视频网 | 亚洲日本中文字幕 | a级片网站 | 日本极品少妇 | 男人天堂成人网 | 亚洲第一成人在线 | 在线观看中文字幕第一页 | 日本少妇激情视频 | 亚洲av成人无码一区二区三区在线观看 | 一个人看的www视频在线观看 | 久久99网| 亚洲第一福利网站 | 国产一区二区免费在线 | 精品久久一二三区 | 中出少妇 | 亚洲欧美在线播放 | 99有精品| 97色在线视频| 特级免费毛片 | 乱子伦一区二区 | www四虎 | 欧美美女性生活视频 | 91久久国产综合久久91精品网站 | 国产良妇出轨视频在线观看 | youjizz中国少妇 | 91av视频免费观看 | 九色在线播放 | 聚色av | 免费黄色看片网站 | 天堂网在线观看视频 | 永久免费视频网站 | 深夜激情影院 | 妻子的性幻想 | 啪啪免费视频网站 | 国产一区二区三区四区在线观看 | 超碰在线91| 伊人影院在线观看 | 伊人欧美在线 | 97欧美| 中文字幕91爱爱 | 精品无码av一区二区三区不卡 | 热久久在线 | 国产三级a | 欧美不卡一区 | 超碰日韩| 日韩欧美一级在线 | 一级片免费在线播放 | 777欧美| 成人免费毛片高清视频 | 精品少妇人妻av免费久久洗澡 | 黑人精品xxx一区一二区 | 日本一道本在线 | 鲁啊鲁在线视频 | 中文字幕一区二区三区夫目前犯 | 欧美人与按摩师xxxx | av小片 | av在线网址观看 | 四虎影院免费视频 | 欧美美女性生活视频 |