WAV文件格式分析

来源:互联网 发布:网络新媒体就业前景 编辑:程序博客网 时间:2024/06/07 03:22

一.WAV文件的定义:

WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持,该格式也支持MSADPCM,CCITT A LAW等多种压缩运算法,支持多种音频数字,取样频率和声道,标准格式化的WAV文件和CD格式一样,也是44.1K的取样频率,16位量化数字,因此在声音文件质量和CD相差无几。

WAV打开工具是WINDOWS的媒体播放器,通常使用三个参数来表示声音,量化位数,取样频率和采样点振幅,量化位数分为8位,16位,24位三种。声道有单声道和立体声之分,单声道振幅数据为n*1矩阵点,立体声为n*2矩阵点,取样频率一般有11025Hz(11kHz),22050Hz(22kHz)和44100Hz(44kHz)三种,不过尽管音质出色,但在压缩后的文件体积过大,其大小不随音量大小及清晰度的变化而变化。

二.WAV文件的数据结构:WAV文件的数据结构由两部分组成数据块和文件头。

(1)文件头的结构如下:

偏移地址
大小
字节
数据块
类型
内容
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~27H44字符
“fact”,该部分一下是可选部分,即可能有,可能没有,一般到WAV文件由某些软件转换而成时,包含这部分。
28H~2BH4
长整数
size,数值为4

其中文件头又分为RIFF/WAV文件标识段和声音数据格式说明段两部分。
(2)数据块的结构
偏移地址
字节数
类型
内容
24H~27H
4
4字符
数据标志符(data)
28H~2BH
4
长整型
DATA总数据长度字节
2CH...
...

DATA数据块

对于WAV文件来说,每个文件的头4字节为RIFF.

WAVE文件是由若干个Chunk组成的。按照在文件中的出现位置包括:RIFF WAVEChunk,Format Chunk,Fact Chunk(可选),Data Chunk。具体见下图:

|RIFF WAVE Chunk|
|ID = 'RIFF'|
|RiffType='WAVE'|
|Format Chunk|
|ID ='fmt'|
|Fact Chunk(optional)|
|ID='fact'|
|Data Chunk|
|ID='data'|

RIFF WAVE Chunk
||所占字节数| 具体内容 |
|ID|4 Bytes|'RIFF'|
|Size|4Bytes||
|Type|4Bytes|'WAVE'|

以RIFF作为标识符,之后紧跟size字段,其表示的是整个WAV文件的大小减去ID和size所占得字节数之后的结果,最后是type表示WAV文件。

结构定义如下:
struct RIFF_HEADER
{
   char szRiffID; // 'R','I','F','F'
   DWORD dwRiffSize;
   char szRiffFormat; // 'W','A','V','E'
};
Format Chunk
||字节数|具体内容|
|ID|4 Bytes|'fmt'|
|Size|4Bytes|数值为16或18,18则最后又附加信息|
|FormatTag|2Bytes|编码方式,一般为0x0001|
|Channels| 2
|SamplesPerSec|4Bytes|采样频率
|AvgBytesPerSec|4Bytes|每秒所需字节数||===>WAVE_FORMAT
|BlockAlign|2Bytes|数据块对齐单位(每个采样需要的字节数)||
|BitsPerSample|2 Bytes|每个采样需要的bit数||
||2Bytes|附加信息(可选,通过Size来判断有无)||
Format chunk
以'fmt'作为标示。一般情况下Size为16,此时最后附加信息没有;如果为18
则最后多了2个字节的附加信息。主要由一些软件制成的wav格式中含有该2个字节的
附加信息。
结构定义如下:
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;
};
Fact Chunk
||所占字节数|具体内容|
|ID|4Bytes|'fact'|
|Size|4Bytes|数值为4|
|data|4Bytes||
Fact Chunk
Fact Chunk是可选字段,一般当wav文件由某些软件转化而成,则包含该Chunk。
结构定义如下:
struct FACT_BLOCK
{
    char szFactID; // 'f','a','c','t'
    DWORD dwFactSize;
};
Data Chunk
||所占字节数|具体内容|
|ID|4Bytes|'data'|
|Size|4Bytes||
|data|||
Data Chunk
Data Chunk是真正保存wav数据的地方,以'data'作为该Chunk的标示。然后是数据的大小。紧接着就是wav数据。根据Format Chunk中的声道数以及采样bit数,wav数据的bit位置可以分成以下几种形式:
对于8位单声道,每个样本数据由8位(bit)表示;
对于8位立体声,每个声道的数据由一个8位(bit)数据表示,且第一个8位(bit数据表示0声道(左)数据,紧随其后的8位(bit)数据表示1声道(右)数据;
对于16位单声道,每个样本数据由16位(bit)表示;其中低字节存放高位,高字节存放低位;
对于16位立体声,每个声道的数据由一个16位(bit)数据表示,且第一个16位(bit)数据表示0声道(左)数据,紧随其后的16位(bit)数据表示1声道(右)数据。
|单声道|取样1|取样2|取样3 取样4|
|8bit量化|声道0|声道0|声道0|声道0|
|双声道|取样1|取样2|
8bit量化|声道0(左)|声道1(右)|声道0(左)|声道1(右)|
||取样1|取样2|
|单声道|
|16bit量化|声道0|声道0|声道0|声道0|
||(低位字节)|(高位字节)|(低位字节)|(高位字节)|
||取样1|
|双声道|
|16bit量化|声道0(左)|声道0(左)|声道1(右)|声道1(右)|
||(低位字节)|(高位字节)|(低位字节)|(高位字节)

wav数据bit位置安排方式
Data Chunk头结构定义如下:
struct DATA_BLOCK
{
   char szDataID;// 'd','a','t','a'
   DWORD dwDataSize;
};
WAV文件的特点:编解码简单,普遍的认同支持以及无损耗存储,到时其所占用的音频空间过大。
三.RIFF文件的格式和数据结构:
(1)定义:RIFF全称为资源互换文件格式(ResourcesInterchange FileFormat),RIFF文件是windows环境下大部分多媒体文件遵循的一种文件结构,RIFF文件所包含的数据类型由该文件的扩展名来标识,能以RIFF文件存储的数据包括:音频视频交错格式数据(.AVI) 波形格式数据(.WAV) 位图格式数据(.RDI) MIDI格式数据(.RMI)调色板格式(.PAL)多媒体电影(.RMN)动画光标(.ANI)其它RIFF文件(.BND)。
(2)数据结构:

chunk是组成RIFF文件的基本单元,它的基本结构如下:

struct chunk

{

  u32 id; /* 块标志 */

  u32 size; /* 块大小 */

  u8 dat[size]; /* 块内容 */

};

id 由4个ASCII字符组成,用以识别块中所包含的数据。如:'RIFF','LIST','fmt','data','WAV','AVI'等等,由于这种文件结构最初是由Microsoft和IBM为PC机所定义,RIFF文件是按照little-endian字节顺序写入的。

size(块大小)是存储在data域中数据的长度,id与size域的大小则不包括在该值内。

dat(块内容)中所包含的数据是以字(WORD)为单位排列的,如果该数据结构长度是奇数,则在最后添加一个空(NULL)字节。

chunk块中有且仅有两种类型块:'RIFF'和'LIST'类型可以包含其他块,而其它块仅能含有数据。

'RIFF'和'LIST'类型的chunk结构如下:

structchunk

{

  u32 id; /* 块标志 */

  u32 size; /* 块大小 */

/*此时的dat = type + restdat */

  u32 type ; /* 类型 */

  u8 restdat[size] /* dat中除type4个字节后剩余的数据*/

};

可以看出,'RIFF'和'LIST'也是chunk,只是它的dat由两部分组成type和restdat。

type,由4个ASCII字符组成,代表RIFF文件的类型,如'WAV','AVI ';或者'LIST'块的类型,如avi文件中的列表'hdrl','movi'。

restdat,dat中除type的4个字节后剩余的数据,包括块内容,包含若干chunk和'LIST'。





0 0
原创粉丝点击