WAV格式详解
简介:
WAVE文件是计算机领域最常用的数字化声音文件格式之一,它是微软专门为Windows系统定义的波形文件格式(Waveform Audio),由于其扩展名为"*.wav"。
最基本的WAVE文件是PCM(脉冲编码调制)格式的,这种文件直接存储采样的声音数据没有经过任何的压缩,是声卡直接支持的数据格式,要让声卡正确播放其它被压缩的声音数据,就应该先把压缩的数据解压缩成PCM格式,然后再让声卡来播放。
WAVE头信息:
WAVE文件是由若干个Chunk组成的。按照在文件中的出现位置包括:RIFF WAVE Chunk, Format Chunk, Fact Chunk(可选), Data Chunk。
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~27H 4 4字符 数据标志符(data)
28H~2BH 4 长整型 DATA总数据长度字节
2CH~ 数据
可能存在:
24H~27H 4 4字符 “fact”,该部分一下是可选部分,即可能有,可能没有,一般到WAV文件由某些软件转换而成时,包含这部分。
28H~2BH 4 长整数 size,数值为4
例子
代码示例:
#include <iostream>
#include <fstream>
using namespace std;
struct wav_struct
{
unsigned long file_size; //文件大小
unsigned short channel; //通道数
unsigned long frequency; //采样频率
unsigned long Bps; //Byte率
unsigned short sample_num_bit; //一个样本的位数
unsigned long data_size; //数据大小
unsigned char *data; //音频数据 ,这里要定义什么就看样本位数了,我这里只是单纯的复制数据
};
int main(int argc,char **argv)
{
fstream fs;
wav_struct WAV;
fs.open("B:\\output.wav",ios::binary|ios::in);
// fs.seekg(0x04); //从文件数据中获取文件大小
// fs.read((char*)&WAV.file_size,sizeof(WAV.file_size));
// WAV.file_size+=8;
fs.seekg(0,ios::end); //用c++常用方法获得文件大小
WAV.file_size=fs.tellg();
fs.seekg(0x14);
fs.read((char*)&WAV.channel,sizeof(WAV.channel));
fs.seekg(0x18);
fs.read((char*)&WAV.frequency,sizeof(WAV.frequency));
fs.seekg(0x1c);
fs.read((char*)&WAV.Bps,sizeof(WAV.Bps));
fs.seekg(0x22);
fs.read((char*)&WAV.sample_num_bit,sizeof(WAV.sample_num_bit));
fs.seekg(0x28);
fs.read((char*)&WAV.data_size,sizeof(WAV.data_size));
WAV.data=new unsigned char[WAV.data_size];
fs.seekg(0x2c);
fs.read((char *)WAV.data,sizeof(char)*WAV.data_size);
cout<<"文件大小为 :"<<WAV.file_size<<endl;
cout<<"音频通道数 :"<<WAV.channel<<endl;
cout<<"采样频率 :"<<WAV.frequency<<endl;
cout<<"Byte率 :"<<WAV.Bps<<endl;
cout<<"样本位数 :"<<WAV.sample_num_bit<<endl;
cout<<"音频数据大小:"<<WAV.data_size<<endl;
cout<<"最后20个数据:"<<endl;
for (unsigned long i=WAV.data_size-20;i<WAV.data_size;i++)
{
printf("%x ",WAV.data[i]);
}
fs.close();
delete[] WAV.data;
system("pause");
}