AVI文件格式
什么是AVI
AVI是音频视频交错(Audio Video Interleaved)的英文缩写,它是Microsoft公司开发的一种符合RIFF文件规范的数字音频与视频文件格式。AVI格式允许视频和音频交错在一起同步播放,支持256色和RLE压缩,但AVI文件并未限定压缩标准,因此,AVI文件格式只是作为控制界面上的标准,不具备兼容性,用不同压缩算法生成的AVI文件,必须使用相应的解压缩算法才能播放出来。
RIFF文件结构
AVI文件采用的是RIFF文件结构方式,所以我们先来看看RIFF文件结构。
“RIFF”表示字符串(4字节) | RIFF文件大小(4字节) | 文件类型(4字节) | RIFF数据 |
由上图可知(52 49 46 46)为“RIFF”,(E2 37 D1 01)表示文件大小,(41 56 49 20)表示文件类型为AVI文件。
整个RIFF文件可以看成一个数据块,其数据块ID为RIFF,称为RIFF块。一个RIFF文件中只允许存在一个RIFF块。RIFF块中包含一系列 的子块,其中有一种字块的ID为"LIST",称为LIST,LIST块中可以再包含一系列的子块,但除了LIST块外的其他所有的子块都不能再包含子块。
AVI文件结构
AVI文件是目前使用的最复杂的RIFF文件,它能同时存储同步表现的音频视频数据。AVI的RIFF块的形式类型是AVI,它包含3个子块,如下所述:
信息块 | 一个ID为“hdrl”的LIST块 | 定义AVI文件的数据格式 |
数据块 | 一个ID为“movi”的LIST块 | 包含AVI的音视频序列数据 |
索引块 | ID为“idxl”的子块 | 定义“movi”LIST块的索引数据,是可选块 |
问题1:AVI文件中的各子块都存储那些信息?数据流如何存储?
信息块:包含两个子块,即一个ID为avih的子块和一个ID为strl的LIST块。
1、“avih”子块包含内容:
2、"strl" LIST块用于记录AVI数据流,每一种数据流都在该LIST块中占有3个子块,他们的ID分别是"strh","strf", "strd";
①“strh”子块定义内容:
②"strf"子块紧跟在"strh"子块之后,其结构视"strh"子块的类型而定,如下所述;
如果 strh子块是视频数据流,则 strf子块的内容是一个与windows设备无关位图的BIMAPINFO结构,如下:
如果 strh子块是音频数据流,则strf子块的内容是一个WAVEFORMAT结构,如下:
③"strd"子块紧跟在strf子块后,存储供压缩驱动程序使用的参数,不一定存在,也没有固定结构。
"strl" LIST块定义的AVI数据流依次将 "hdrl " LIST 块中的数据流头结构与"movi" LIST块中的数据联系在一起,第一个数据流头结构用于数据流0,第二个用于数据流1,依次类推。
数据块:存储视频和音频数据流,数据可直接存于 "movi" LIST块中。数据块中音视频数据按不同的字块存放,其结构如下所述,
音频字块
"##wb"
Wave 数据流
视频子块中存储DIB数据,又分为压缩或者未压缩DIB,
"##db"
RGB数据流
"##dc"
压缩的图像数据流
索引块:索引快包含数据块在文件中的位置索引,能提高avi文件的读写速度,其中存放着一组AVIINDEXENTRY结构数据。如下,这个块并不是必需的,也许不存在。
问题2 :AVI文件中如何实现视音频同步?
在AVI文件中,音频参数中设有同步控制(Synchronization)。在AVI文件中,图像和音频是同步的很好的。但实际上由于CPU处理能力不够,回放AVI时有可能出现图像和音频不同步的现象。当AVI文件的数据率较高,而MPC的处理速度不够时,容易出现图像和音频不同步的现象。如视频中人张嘴说话,但声音没出来。设置同步控制可保证在不同的MPC环境下播放该AVI文件时都能同步。此时播放程序自动地丢掉一些中间帧以保证视频和音频的同步。
WAV文件格式分析
wav概念
WAV(波形声音文件)是最常见的声音文件格式之一,是微软公司专门为Windows开发的一种标准数字音频文件,该文件能记录各种单声道或立体声的声音信息,并能保证声音不失真。但WAV文件有一个致命的缺点,就是它所占用的磁盘空间太大(每分钟的音乐大约需要12兆磁盘空间)。它符合资源互换文件格式(RIFF)规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持。Wave格式支持MSADPCM、CCITT A律、CCITT μ律和其他压缩算法,支持多种音频位数、采样频率和声道,是PC机上最为流行的声音文件格式;但其文件尺寸较大,多用于存储简短的声音片段。
wav文件结构
WAV文件采用的是RIFF格式结构。至少是由3个块构成,分别是RIFF、fmt 和Data。所有基于压缩编码的WAV文件必须含有fact块。此外所有其它块都是可选的。块fmt,Data及fact均为RIFF块的子块。WAV文件的文件格式类型标识符为“WAVE”。
WAV文件结构 |
RIFF块 |
文件格式类型“WAVE” |
fmt块 |
fact块(压缩编码格式要含有该块) |
data块 |
偏移地址 | 字节数 | 名称 | 内容 |
00H | 4 | ChunkID | “RIFF” |
04H | 4 | ChunkSize | 文件大小 |
08H | 4 | Format | “WAVE” |
0CH | 4 | Subchunk1ID | “fmt” |
10H | 4 | SubchunkSize | 过度字节(不定) |
14H | 2 | AudioFormat | PCM=1(即线性量化)除1之外的值表示某种形式的压缩 |
16H | 2 | NumChannels | 通道数,单声道为1,双声道为2 |
18H | 4 | SampleRate | 采样率 |
1CH | 4 | ByteRate | 波形音频数据传送速率 =通道数*采样率*每样本数据位数/8 |
20H | 2 | BlockAlign | 数据块的调整数=通道数*每样本数据位数/8 |
22H | 2 | BitsPerSample | 每样本的数据位数,表示每个声道中各样本的数据位数。8bits=8,16bits=16 |
24H | 4 | Subchunk2ID | 数据标记符“data” |
28H | 4 | Subchunk2Size | 语音数据的长度 =样本数*通道数*每样本数据位数/8 |
2CH | * | Data | 实际的声音数据 |
以实例分析 
52 49 46 46为RIFF固定字头
由上面的十六进制数可以算出文件大小=(00 01 B8 24)H+8=(112684)D 字节
与查看文件属性所得出文件大小一致
文件格式为WAVE
“fmt”和过度字节
红框:压缩方式为1:表示为PCM压缩
绿框:通道数为2:表示为双声道
黄框:采样率为:(00 00 AC 44)H=44100Hz
蓝框:波形音频数据传送速率(00 02 B1 10)H
=通道数*采样率*每样本数据位数/8=2*44100*16/8=176400字节/s
红框: 数据块的调整数=通道数*每样本数据位数/8=(00 04)H=2*16/8=4字节
绿框:每样本的数据位数:(00 01)H=16bits
数据标记符“data”
参考文献
avi文件格式详解【转】 - IT小菜鸟 - 博客园 (cnblogs.com)
AVI文件格式详解.docx (book118.com)
WAV_百度百科 (baidu.com)
wav文件格式解析 - longRookie - 博客园 (cnblogs.com)