RIFF(Resource Interchange File Format),资源交互文件格式,是由微软提出的一种多媒体文件存储方式。不同编码的视频、音频文件按照RIFF保存,当提取文件时,可以根据RIFF的规则解析文件。常见的RIFF文件包括:
RIFF格式是一种树状结构,主要由FOURCC, CHUNK,LIST组成:
AVI的全称为Audio Video Interleaved,即视音频交织,可见AVI文件的音频和视频是交织放置的。举例说明:
在Visual Studio中使用二进制格式打开一个AVI文件,可以看到用十六进制显示的文件信息。
AVI文件的数据块使用四字符码来表征类型,该四字符码由两个字节的流编号和两个字节的类型码组成。标准的类型码定义如下:①‘db’指非压缩视频帧;②‘dc’指压缩视频帧;③‘pc’指改用新的调色板;④‘wb’指音缩视频。如第一个流(Stream 0)是音频,则表征音频数据块的四字符码为‘00wb’;第二个流(Stream 1)是视频,则表征视频数据块的四字符码为‘01db’或‘01dc’。
在AVI文件中查找,可以看到第一个数据块为“01wb”即音频数据块,第二个数据块为“00dc”即压缩视频数据块。
下图可以说明AVI文件中音频和视频的数据是交织的:
AVI文件的视频帧占据字节数不确定;AVI文件一个音频数据块大约占用418字节。
WAV的英文全称是Waveform Audio File Format ,是微软专门为Windows开发的一种标准数字音频文件,该文件能记录各种单声道或立体声的声音信息,并能保证声音不失真,所以通常被称为无损音频。但是严格意义上来讲,WAV也可以存储其它压缩格式的音频数据。
WAV文件以小端形式来进行数据存储,即数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中,但是数据块中的标识符仍以大端形式存储。
WAV文件采用的是RIFF格式结构,一个RIFF格式文档本身就是一个块,其区块图表如下:
在Visual Studio中使用二进制格式打开一个WAV文件用于解释说明:
① 绿色框部分是RIFF的块标识,同时也是文档标识“RIFF”,标明该文档是一个有效的RIFF文档;
② RIFF的块长度指文件的数据长度,其数值为“00 03 C0 46”,转换为十进制为245830。由文件属性可以看到文件大小为245838字节,证明了文件的数据长度为文件长度-8;
③ 后面的部分都是RIFF的块数据,其中,前4个字节为文件格式类型标识,说明此文件是WAV文件,之后其它部分为RIFF块的子块。
RIFF格式结构至少由3个块构成,分别是RIFF、fmt 和Data,此外,所有基于压缩编码的WAV文件必须含有fact块。块fmt,Data及fact均为RIFF块的子块。
除确定项外,其余观察可得:
① 声道数值为2,说明是双声道;
② 采样频率为“00 00 BB 80”,转换为十进制为48000,说明采样频率为48KHz;
③ 每秒数据字节数为“00 02 EE 00”,转换为十进制为192000,等于采样率×声道数×采样位数 / 8,即48000×2×16/8=192000;
④ 采样帧大小为4,等于声道数×采样位数 / 8,即2×16/8=4;
⑤ 采样位数为“00 10”,转换为十进制为16,说明采样位数是16bit。
WAV文件的data区块部分内容如下:
可以得到音频数据长度为“00 03 C0 00”,转换为十进制为245760字节,从而可计算得到该WAV文件时长为245760/192000=1.28s。该音频时长的确约为1秒: