WAV文件格式分析

一、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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值