WAV格式详解

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");

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值