AVI文件格式概述
AVI(Audio Video Interleaved),即音频视频交错格式。是将语音和影像同步组合在一起的文件格式。它对视频文件采用了一种有损压缩方式,但压缩比较高,因此尽管画面质量不是太好,但其应用范围仍然非常广泛。AVI支持256色和RLE压缩。AVI信息主要应用在多媒体光盘上,用来保存电视、电影等各种影像信息。
AVI是一种RIFF(Resource Interchange File Format的缩写)文件格式,多用于音视频捕捉、编辑、回放等应用程序中。通常情况下,一个AVI文件可以包含多个不同类型的媒体流(典型的情况下有一个音频流和一个视频流),不过含有单一音频流或单一视频流的AVI文件也是合法的。AVI可以算是Windows操作系统上最基本的、也是最常用的一种媒体文件格式。
RIFF(Resource Interchange File Format,资源互换文件格式)是微软公司定义的一种用户管理Windows环境中多媒体数据的文件格式,波形音频wave,MIDI和数字视频AVI都采用这种格式存储。RIFF文件的实际数据中,使用了列表(List)和块(Chunk)的形式来组织。列表可以嵌套列表和块。整个RIFF文件可以看成一个数据库,其数据块ID为RIFF ,称为RIFF块。一个RIFF文件中只允许存在一个RIFF块。RIFF块中包含一系列的子块,其中有一种子块的ID为“List”,称为LIST块,LIST块中可以再包含一系列的子块,但除了LIST块外的其他所有的子块都不能再包含子块。
RIFF和LIST块分别比普通的数据块多了一个被称为形式类型(Form Type)或者列表类型(List Type)的数据域。
AVI文件格式结构
RIFF块:
52 49 46 46 Chunk ID(字符串“ RIFF”)
E2 37 D1 01 Chunk Len (文件大小 )
41 56 49 20 Chunk type( 文件类型“AVI”)
AVI文件大小(RIFF块大小 ) = Chunk Len (值)+ 4字节(Chunk ID)+ 4字节(Chunk Len)
LIST块:
4c 49 53 54 Chunk ID(字符串“LIST”)
24 01 00 00 Chunk Len(LIST数据长度),从Chunk type开始算
68 64 72 6C Chunk type (“hdrl”)
61 76 69 68…78 FE 36 17(LIST实际数据)
LIST块大小 = Chunk Len (值)+ 4字节(Chunk ID)+ 4字节(Chunk Len)
Chunk块(普通块avih strh strf idxl)
61 76 69 68 Chunk ID(字符串“avih”)
38 00 00 00 Chunk Len (文件大小 = 50)
56 82 00 00…78 FE 36 17 Chunk data(数据)
Chunk 块大小 = 实际的实况数据长度,而不包括Chunk ID域和Chunk Len域本身的大小。
AVI文件层次划分
avih 列表
typedef struct{
DWORD Chunk ID; // 必须为‘avih’
DWORD Chunk Len; // 本数据结构的大小,不包括最初的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;
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子块是视频数据流)
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;
idxl列表
typedef struct _avioldindex {
DWOED Chunk ID; // 必须为‘idxl’
DWORD Chunk Len; // 本数据结构的大小,不包括最初的8个字节(fcc和cb两个域)
struct _avioldindex_entry {
DWORD dwChunkId; // 表征本数据块的四字符码
DWORD dwFlags; // 说明本数据块是不是关键帧、是不是‘rec ’列表等信息
DWORD dwOffset; // 本数据块在文件中的偏移量
DWORD dwSize; // 本数据块的大小
} aIndex[]; // 这是一个数组!为每个媒体数据块都定义一个索引信息
} AVIOLDINDEX;
一、WAV文件格式概述
WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持,该格式也支持MSADPCM,CCITT A LAW等多种压缩运算法,支持多种音频数字,取样频率和声道,标准格式化的WAV文件和CD格式一样,也是44.1K的取样频率,16位量化数字,因此在声音文件质量和CD相差无几! WAV打开工具是WINDOWS的媒体播放器.
二、WAV文件格式结构
WAV文件的文件头
偏移地址 | 大小 字节 | 数据块 类型 | 内容 |
00H~03H | 4 | 4字符 | 资源交换文件标志(RIFF) |
04H~07H | 4 | 长整数 | 从下个地址开始到文件尾的总字节数 |
08H~0BH | 4 | 4字符 | WAV文件标志(WAVE) |
0CH~0FH | 4 | 4字符 | 波形格式标志(fmt ),最后一位空格。 |
10H~13H | 4 | 整数 | 过滤字节(一般为00000010H) |
14H~15H | 2 | 整数 | 格式种类(值为1时,表示数据为线性PCM编码) |
16H~17H | 2 | 整数 | 通道数,单声道为1,双声道为2 |
18H~1BH | 4 | 长整数 | 采样频率 |
1CH~1FH | 4 | 长整数 | 波形数据传输速率(每秒平均字节数) |
20H~21H | 2 | 整数 | DATA数据块长度,字节。 |
22H~23H | 2 | 整数 | PCM位宽 |
24H~27H | 4 | 4字符 | "fact",该部分一下是可选部分,即可能有,可能没有,一般到WAV文件由某些软件转换而成时,包含这部分。 |
28H~2BH | 4 | 长整数 | size,数值为4 |
WAV声音文件的数据块
偏移地址 | 字节数 | 类型 | 内容 |
24H~27H | 4 | 4字符 | 数据标志符(data) |
28H~2BH | 4 | 长整型 | DATA总数据长度字节 |
2CH... | ... | DATA数据块 |
1.WAV文件结构层次
RIFF WAVE Chunk、Format Chunk、Fact Chunk(可选)、Data Chunk
2.WAV文件格式实例分析
偏移地址 | 字节数 | 数据类型 | 内容 |
00H | 4 | char | “RIFF”; RIFF标志 |
04H | 4 | long int | 0x00 06 D0 92 (注意数据存储顺序); 文件长度 |
08H | 4 | char | “WAVE”; WAVE标志 |
0CH | 4 | char | “fmt ”; fmt标志,最后一位为空 |
10H | 4 | long int | 0x12; sizeof(PCMWAVEFORMAT) |
14H | 2 | int | 1(WAVE_FORMAT_PCM); 格式类别,1表示为PCM形式的声音数据 |
16H | 2 | int | 2; 通道数,单声道为1,双声道为2 |
18H | 4 | int | 48000; 采样频率(每秒样本数) |
1CH | 4 | long int | 每秒数据量;其值为通道数×每秒数据位数×每样本的数据位数/8。播放软件利用此值可以估计缓冲区的大小。 |
20H | 2 | int | 数据块的调整数(按字节算的),其值为通道数×每样本的数据位值/8。播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。 |
22H | 2 | int | 每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多个声道,对每个声道而言,样本大小都一样。 |
24H | 4 | char | “data”; 数据标记符 |
28H | 4 | long int | 0x00 00 00 00; 语音数据大小 |
参考:
avi文件格式简介_Gorgr的博客-CSDN博客
WAV文件格式分析_pyundeng的博客-CSDN博客