您的位置:首页 > 其它

微软Wav音频文件解析

2013-04-24 09:56 411 查看
WAVEPCM
音频格式

Wave文件是微软RIFF标准存储的多媒体文件的一种形式。一个RIFF文件包含一个文件头和多个数据块(chunks).WAVE文件是包含一个“WAVE”数据块,其包含两个子的数据块,一个是“fmt”块,和”data”块。“fmt”块指名数据的格式,而“data”块包含实际的取样值。下图为WAVE语音文件的经典格式:



注明:littleendia:内存的低字节存放数据的地位,高字节存放数据的高位

Bigendia:内存的低字节存放数据的高位,高字节存放数据的低位。

Chunk,FormatChunk,FactChunk(可选),DataChunk。

各个字段解释:

ChunkID(0-3):
占4个字节,big-endianform,用ASCII的形参存储字符串“RIFF”.

ChunkSize(4-7):占4个字节,little-endianform,它的值的大小是整个文件的大小减去ChunkID和ChunkSize所占的8个字节的大小。大小等于36+SubChunk2Size,或者4+(8+SubChunk1Size)+(8+SubChunk2Size)

Format(8-11):占4个字节,包含字符“WAVE”.

"WAVE"format包含两个子块:“fmt
”和“data”.

“fmt”块的数据格式如下:

Subchunk1ID(12-15):占4个字节,包含字符”fmt”.

Subchunk1Size:占4个字节,该字段表示该块的大小,除去Subchunk1ID和Subchunk1Size所占的8个字节大小。对于PCM形式的文件,该值的大小为16个字节。即下面所占的大小:



AudioFormat:占两个字节,PCM形式的文件等于1,其他的值代表某些形式的数据压缩。

NumChannels:声道数,Mono=1,Stereo=2

SampleRate:采样率,如8000,16000

ByteRate:每秒的字节数,大小为:SampleRate*NumChannels*BitsPerSample/8

BlockAlign:块对齐,即所有频道一个样本所占的字节数,大小为:NumChannels*BitsPerSample/8


“data”块的数据格式如下:

Subchunk2ID:占4个字节,包含字符”data”.

Subchunk2Size:音频数据的字节数,即要读取数据的大小。值为:NumSamples*NumChannels*BitsPerSample/8

*Data:实际的声音数据。

例子:72字节的WAVE文件字节序列如下:





从上图可以看出:ChunkSize的十六进制数据为:000824:十进制为:2084

字节率ByteRate:十六进制:00015888,十进制为:88200

注:WAVE文件默认的存储方式为:little-endian.若ChunkID的值为“RIFX”则为big-endian.

抽样的数据必须以偶数字节数结束。

8位的抽样数据用无符号的字节,大小从0-255(2^8-1),16位样本是用有符号的整数来存储,大小为:-32768(-2^16/2)-32767(2^16/2-1).

RIFFstandsfor
ResourceInterchangeFileFormat

Audio/visualinterleaveddata(.AVI)
Waveformdata(.WAV)

注明:在不同的CPU上,相同的数据类型占用的位数不同,如:16bit486PC机器,char占8个字节,int占16,shortorshortint占16位,longorlongint占32位

而在32bitPentiumpc上,char:8,int:32,shortorshortint:16,longorlongint:32,所以为了保持软件在不同机器上的兼容性,最好用char,short,long

Wavread读取的数据转化为int:yi=y*2^nbits/2;

数据结构定义:

typedefstructRIFF_HEADER
{
charszRiffID[4];//"RIFF"
DWORDdwRiffSize;
charszRiffFormat[4];//"WAVE"
}RIFF_HEADER;

typedefstructWAVE_FORMAT
{WORDwFormatTag;
WORDwChannels;
DWORDdwSamplesPerSec;
DWORDdwAvgBytesPerSec;
WORDwBlockAlign;
WORDwBitsPerSample;
}WAVE_FORMAT;

typedefstructFMT_BLOCK
{charszFmtID[4];
DWORDdwFmtSize;
WAVE_FORMATwavFormat;
}FMT_BLOCK;
typedefstructFACT_BLOCK
{charszFmtID[4];
DWORDdwFactSize;
DWORDdwFactData;
}FACT_BLOCK;
typedefstructDATA_BLOCK
{charszDataID[4];//'d','a','t','a'
DWORDdwDataSize;
}DATA_BLOCK;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: