首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用C/C++读取和处理WAV文件数据

用C/C++读取和处理WAV文件数据
EN

Stack Overflow用户
提问于 2013-04-18 05:36:57
回答 1查看 53.4K关注 0票数 15

我目前正在做一个非常重要的学校项目。我需要在C/C++中提取波形文件的信息,并利用这些信息获取语音信号的LPC。但是,为了做到这一点,我需要对信号做一些预处理,比如零交叉和能量分析,等等。这意味着我需要一个标志和一个真正的价值。问题是我不知道如何获得有用的信息和正确的格式。我已经阅读了文件中的每个字段,但我不确定我是否做得对。请给我建议?

我现在就是这样读文件的:

readI = fread(&bps,1,2,音频);printf(“每个样本位= %d \n",bps);

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-18 06:26:50

我的第一个建议是使用某种库来帮助你。大多数合理的解决方案似乎过分了,所以一个简单的库(如您的问题的注释中推荐的库,libsndfile)应该能做到这一点。

如果你只想知道如何阅读WAV文件,这样你就可以编写自己的文件了(因为你的学校可能会像其他普通的人一样,对你使用图书馆不屑一顾),一个快速的谷歌搜索就会给你提供你需要另外,一些已经写过许多关于阅读.wav格式的教程的人的所有信息。

如果您仍然不理解它,下面是我自己的一些代码,其中我读取了头和WAV/RIFF数据文件的所有其他块,直到我到达数据块。它是基于完全脱离WAV格式规范的。提取实际的声音数据并不困难:您可以原始地读取它并使用它,也可以将其转换为您可以在内部使用的更舒适的格式(32位PCM未压缩数据或其他什么)。

查看下面的代码时,将reader.Read...( ... )替换为对指定类型的整数值和字节大小的等效fread调用。WavChunks是一个枚举,它是WAV文件块中in的小端点值,而format变量是可以包含在Wav文件格式中的WAV格式类型的类型之一:

代码语言:javascript
复制
enum class WavChunks {
    RiffHeader = 0x46464952,
    WavRiff = 0x54651475,
    Format = 0x020746d66,
    LabeledText = 0x478747C6,
    Instrumentation = 0x478747C6,
    Sample = 0x6C706D73,
    Fact = 0x47361666,
    Data = 0x61746164,
    Junk = 0x4b4e554a,
};

enum class WavFormat {
    PulseCodeModulation = 0x01,
    IEEEFloatingPoint = 0x03,
    ALaw = 0x06,
    MuLaw = 0x07,
    IMAADPCM = 0x11,
    YamahaITUG723ADPCM = 0x16,
    GSM610 = 0x31,
    ITUG721ADPCM = 0x40,
    MPEG = 0x50,
    Extensible = 0xFFFE
};

int32 chunkid = 0;
bool datachunk = false;
while ( !datachunk ) {
    chunkid = reader.ReadInt32( );
    switch ( (WavChunks)chunkid ) {
    case WavChunks::Format:
        formatsize = reader.ReadInt32( );
        format = (WavFormat)reader.ReadInt16( );
        channels = (Channels)reader.ReadInt16( );
        channelcount = (int)channels;
        samplerate = reader.ReadInt32( );
        bitspersecond = reader.ReadInt32( );
        formatblockalign = reader.ReadInt16( );
        bitdepth = reader.ReadInt16( );
        if ( formatsize == 18 ) {
            int32 extradata = reader.ReadInt16( );
            reader.Seek( extradata, SeekOrigin::Current );
        }
        break;
    case WavChunks::RiffHeader:
        headerid = chunkid;
        memsize = reader.ReadInt32( );
        riffstyle = reader.ReadInt32( );
        break;
    case WavChunks::Data:
        datachunk = true;
        datasize = reader.ReadInt32( );
        break;
    default:
        int32 skipsize = reader.ReadInt32( );
        reader.Seek( skipsize, SeekOrigin::Current );
        break;
    }
}
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16075233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档