wordpress 分类目录代码,北京网站设计制作关键词优化微信小程序开发推广,淘宝客建立网站,中国域名注册中心avi文件格式详解 AVI是音频视频交错(Audio Video Interleaved)的英文缩写#xff0c;它是Microsoft公司开发的一种符合RIFF文件规范的数字音频与视频文件格式#xff0c;原先用于Microsoft Video for Windows (简称VFW)环境#xff0c;现在已被Windows 95/98、OS/2等多数操作…avi文件格式详解 AVI是音频视频交错(Audio Video Interleaved)的英文缩写它是Microsoft公司开发的一种符合RIFF文件规范的数字音频与视频文件格式原先用于Microsoft Video for Windows (简称VFW)环境现在已被Windows 95/98、OS/2等多数操作系统直接支持。AVI格式允许视频和音频交错在一起同步播放支持256色和RLE压缩但AVI文件并未限定压缩标准 因此AVI文件格式只是作为控制界面上的标准不具有兼容性用不同压缩算法生成的AVI文件必须使用相应的解压缩算法才能播放出来。常用的AVI播 放驱动程序主要是Microsoft Video for Windows或Windows 95/98中的Video 1以及Intel公司的Indeo Video。 在介绍AVI文件前我们要先来看看RIFF文件结构。AVI文件采用的是RIFF文件结构方式RIFFResource Interchange File Format资源互换文件格式是微软公司定义的一种用于管理windows环境中多媒体数据的文件格式波形音频waveMIDI和数字视频AVI 都采用这种格式存储。构造RIFF文件的基本单元叫做数据块Chunk每个数据块包含3个部分 1、4字节的数据块标记或者叫做数据块的ID 2、数据块的大小 3、数据 整个RIFF文件可以看成一个数据块其数据块ID为RIFF称为RIFF块。一个RIFF文件中只允许存在一个RIFF块。RIFF块中包含一系列 的子块其中有一种字块的ID为LIST称为LISTLIST块中可以再包含一系列的子块但除了LIST块外的其他所有的子块都不能再包含子 块。 RIFF和LIST块分别比普通的数据块多一个被称为形式类型Form Type和列表类型List Type的数据域其组成如下 1、4字节的数据块标记Chunk ID 2、数据块的大小 3、4字节的形式类型或者列表类型 4、数据 下面我们看看AVI文件的结构。AVI文件是目前使用的最复杂的RIFF文件它能同时存储同步表现的音频视频数据。AVI的RIFF块的形式类型是AVI它包含3个子块如下所述 1、信息块一个ID为hdrl的LIST块定义AVI文件的数据格式。 2、数据块一个ID为 movi的LIST块包含AVI的音视频序列数据。 3、索引块ID为 idxl的子块定义 moviLIST块的索引数据是可选块。 AVI文件的结构如下图所示下面将具体介绍AVI文件的各子块构造。 1、信息块信息块包含两个子块即一个ID为 avih 的子块和一个ID 为 strl 的LIST块。 avih子块的内容可由如下的结构定义 typedef struct { DWORD dwMicroSecPerFrame ; //显示每桢所需的时间ns定义avi的显示速率 DWORD dwMaxBytesPerSec; // 最大的数据传输率 DWORD dwPaddingGranularity; //记录块的长度需为此值的倍数通常是2048 DWORD dwFlages; //AVI文件的特殊属性如是否包含索引块音视频数据是否交叉存储 DWORD dwTotalFrame; //文件中的总桢数 DWORD dwInitialFrames; //说明在开始播放前需要多少桢 DWORD dwStreams; //文件中包含的数据流种类 DWORD dwSuggestedBufferSize; //建议使用的缓冲区的大小 //通常为存储一桢图像以及同步声音所需要的数据之和 DWORD dwWidth; //图像宽 DWORD dwHeight; //图像高 DWORD dwReserved[4]; //保留值 }MainAVIHeader; strl LIST块用于记录AVI数据流每一种数据流都在该LIST块中占有3个子块他们的ID分别是strh,strf, strd strh子块由如下结构定义。 typedef struct { FOURCC fccType; //4字节表示数据流的种类 vids 表示视频数据流 //auds 音频数据流 FOURCC fccHandler;//4字节 表示数据流解压缩的驱动程序代号 DWORD dwFlags; //数据流属性 WORD wPriority; //此数据流的播放优先级 WORD wLanguage; //音频的语言代号 DWORD dwInitalFrames;//说明在开始播放前需要多少桢 DWORD dwScale; //数据量视频每桢的大小或者音频的采样大小 DWORD dwRate; //dwScale /dwRate 每秒的采样数 DWORD dwStart; //数据流开始播放的位置以dwScale为单位 DWORD dwLength; //数据流的数据量以dwScale为单位 DWORD dwSuggestedBufferSize; //建议缓冲区的大小 DWORD dwQuality; //解压缩质量参数值越大质量越好 DWORD dwSampleSize; //音频的采样大小 RECT rcFrame; //视频图像所占的矩形 }AVIStreamHeader; strf子块紧跟在strh子块之后其结构视strh子块的类型而定如下所述如果 strh子块是视频数据流则 strf子块的内容是一个与windows设备无关位图的BIMAPINFO结构如下 typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1]; //颜色表 }BITMAPINFO; typedef struct tagBITMAPINFOHEADER { DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; }BITMAPINFOHEADER; 如果 strh子块是音频数据流则strf子块的内容是一个WAVEFORMAT结构如下 typedef struct { WORD wFormatTag; WORD nChannels; //声道数 DWORD nSamplesPerSec; //采样率 DWORD nAvgBytesPerSec; //WAVE声音中每秒的数据量 WORD nBlockAlign; //数据块的对齐标志 WORD biSize; //此结构的大小 }WAVEFORMAT strd子块紧跟在strf子块后存储供压缩驱动程序使用的参数不一定存在也没有固定的结构。 strl LIST块定义的AVI数据流依次将 hdrl LIST 块中的数据流头结构与movi LIST块中的数据联系在一起第一个数据流头结构用于数据流0第二个用于数据流1依次类推。 数据块中存储视频和音频数据流数据可直接存于 movi LIST块中。数据块中音视频数据按不同的字块存放其结构如下所述 音频字块 ##wb Wave 数据流 视频子块中存储DIB数据又分为压缩或者未压缩DIB ##db RGB数据流 ##dc 压缩的图像数据流 (如果第一个流是音频则4字符码为‘00wb’第二个流是视频则4字符码为‘00db’或‘00dc’) ..... (网上原话可能是01db或01dc) 看到了吧avi文件的图像数据可以是压缩的和非压缩格式的。对于压缩格式来说也可采用不同的编码也许你曾经遇到有些avi没法识别就是因为编 码方式不一样如果没有相应的解码你就没法识别视频数据。AVI的编码方式有很多种比较常见的有 mpeg2mpeg4divx等。 索引块索引快包含数据块在文件中的位置索引能提高avi文件的读写速度其中存放着一组AVIINDEXENTRY结构数据。如下这个块并不是必需的也许不存在。 typedef struct { DWORD ckid; //记录数据块中子块的标记 DWORD dwFlags; //表示chid所指子块的属性 DWORD dwChunkOffset; //子块的相对位置 DWORD dwChunkLength; //子块长度 };