WAV文件格式分析

来源:互联网 发布:ios 淘宝下拉刷新 编辑:程序博客网 时间:2024/06/05 19:37

一、RIFF格式与WAVE格式的关系

RIFF格式(Resources Interchange File Format),也称为资源互换文件格式。Wav文件和Avi文件都是由此格式衍生出来的文件格式。

1、RIFF究竟是长什么样子,是一种什么样的存在呢?

RIFF的基本单位是Chunk,如下图所示,一个最基本的Chunk由三个部分组成:“辨别码”、“数据大小”、“数据”。辨别码就相当于一个Chunk的名字或者身份证明,长度占用4字节。数据大小,顾名思义就是表示这一块Chunk里真正的数据部分的大小:sizeof(data)本身也占用四字节的大小。所以SIZE的值应该等于整个Chunk的大小减去8字节。数据部分,存放数据,长度根据数据量而不同。此处提一点,辨别码也就是标志符的RIFF四个字母是以ASCII码方式存在该位置的。详见后面的结构定义。


2,RIFF和WAVE是怎么样的关系?

WAVE格式是一种简单的RIFF,保留着RIFF的数据构成,然后存储声波信息。参考了各种解释,诸如树状图结构,硬盘结构之后,灵光一闪,这不就是套娃嘛!

套娃,可以把WAVE想象成一种套娃,最外面是最大的框架。最大的套娃有自己的辨别码,也就是名字,这个名字应当能够体现这块数据的类型和身份。其次他有一个特定的大小,也就是他肚子里能装多少数据。这两种信息就存放在他的脑子里,各占4字节(这个大脑内存显然小了点)。最后数据就存放在套娃肚子里。大脑的内存加上肚子里的内存就是整个套娃的信息量,也就是一个Chunk的大小。SIZE表示的就是套娃肚子里的内存大小。有所不同的是,这里一个套娃肚子里可以装不止一个套娃。也就是一个大Chunk的data部分可以放一个或几个小chunk,每个小chunk的数据结构也和上面大chunk的结构相同。

二、WAVE文件的组成

主要分为四个部分:RIFF WAVE Chunk, Format Chunk, Fact Chunk(可选), Data Chunk。Fact Chunk是可选的在下面略去不做详细说明。

如下图所示,是wave的三个重要组成部分,而FORMAT Chunk和DATA Chunk是RIFF块的两个子块,可以理解为两个小Chunk,RIFF大套娃肚子里的两个小套娃。


1、RIFF WAVE Chunk的data部分存放两个小Chunk,而他的相关信息(ID,SIZE,TYPE)头的结构定义如下:

 struct RIFF_HEADER {  char szRiffID[4];  // 'R','I','F','F'  DWORD dwRiffSize;  char szRiffFormat[4]; // 'W','A','V','E' };

2、FORMAT Chunk的data部分存放PCMWAVEFORMAT,PCMWAVEFORMAT的结构定义如下。其中包括FormatTag,声道等信息作为Format Chunk的数据,存放在ID和SIZE的后面。

 struct WAVE_FORMAT {  WORD wFormatTag;  WORD wChannels;  DWORD dwSamplesPerSec;  DWORD dwAvgBytesPerSec;  WORD wBlockAlign;  WORD wBitsPerSample; }; struct FMT_BLOCK {  char  szFmtID[4]; // 'f','m','t',' '  DWORD  dwFmtSize;  WAVE_FORMAT wavFormat; };

3、data头的定义

struct DATA_BLOCK {  char szDataID[4]; // 'd','a','t','a'  DWORD dwDataSize; };

三、wave文件采样格式




参考:

http://blog.csdn.net/BlueSoal/article/details/932395

http://blog.csdn.net/zhihu008/article/details/7854529

0 0
原创粉丝点击