wav文件格式分析(代码)

这个是为上一篇文章做结尾用的。

这里我只把基本的数据提取出来了,没有进行下一步处理,数据提取出来,后面怎么应用就看具体情况了。

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

}

运行结果:

可以看出各种数据和上一篇文章中的分析都是对应的。

posted @ 2012-10-18 19:41  Dsp Tian  阅读(9809)  评论(1编辑  收藏  举报