2013-11-26 106 views
2

一般wav文件的subchunk1size是16。然而,我有有subchunk1size = 18。一些wav文件我有C++代码来读取具有subchunk1size = 16。现在我wav文件想要阅读有subchunk1size = 18的wav文件。任何帮助将不胜感激。C++读wav文件,subchunk1size = 18

typedef struct header_file 
{ 
    char chunk_id[4]; 
    int chunk_size; 
    char format[4]; 
    char subchunk1_id[4]; 
    int subchunk1_size; 
    short int audio_format; 
    short int num_channels; 
    int sample_rate;    
    int byte_rate; 
    short int block_align; 
    short int bits_per_sample; 
    char subchunk2_id[4]; 
    int subchunk2_size;   
} header; 

以上是我的代码读取与subchunk1size wav文件= 16

+0

别忘了告诉我们你的代码。 –

+2

这就是非PCM数据的“fmt”块,如μ律。不要仅仅假定该子块是第一块。基本参考[在这里](http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html)。 –

+1

如果您想要避免手动解析WAV文件的痛苦,并且还可以免费获得对其他许多音频格式的支持,则可以查看libsndfile;它允许你只是sf_open()几乎任何音频文件,并获得阅读音频样本的权利。 (http://www.mega-nerd.com/libsndfile/) –

回答

3

的Wav文件不具有刚性的结构,你期待结构header_file。该“FMT”块不一定是第一个按照文件头(虽然通常是这样),其大小不一定16个字节(虽然又一次这是经常发生的情况)。压缩的音频可以被存储在一个wav文件,在这种情况下audio_format字段将是不同的大于1并且“FMT”块可以具有不同的尺寸大于16个字节。

解析wav文件的适当和灵活的方式是使用更精细的结构:

struct wave_header 
{ 
    char chunk_id[4]; 
    int chunk_size; 
    char format[4];  
}; 

struct riff_chunk_header 
{ 
    char id[4]; 
    int size; 
}; 

struct wave_fmt_chunk 
{ 
    short audio_format; 
    short num_channels; 
    int sample_rate;    
    int byte_rate; 
    short block_align; 
    short bits_per_sample; 
}; 

那么你的分析逻辑应(注意验证您在每一步所读取的数据):

  1. 阅读wave_header
  2. 阅读riff_chunk_header
  3. 如果你读过块头部的ID不是“格式化”,S基普块(你有字节大小)和环路回到步骤2,读下一个块头部
  4. 阅读audio_format
  5. 解释在此基础上audio_format的“FMT”块的数据的其余部分。如果它是1,你有PCM数据,并且块应该有你预期的16个字节。如果不是1,则必须查找有关该压缩格式的文档。

在一般情况下,这也是一个好主意,优雅地忽略额外的数据,因此,如果你看到一个PCM编码的WAV文件以18个字节的“格式化”块,尽量忽略最后2个字节,见哪里可以得到你。

1

该文件确实有严格的格式结构。如果不遵守这种结构,文件可能无法播放或打开以供某些应用程序编辑。

原来的问题:WAVE文件被分为两组。第一组包括具有超过2个音频通道或PCM比特深度大于16的文件或两者。第二组由不符合这两种条件的文件组成,即1或2个通道具有多达16位。多年来,微软公开了包含在wav文件中的结构以适应计算机音频技术的进步。具体而言,他们在WAVEFORMATEX结构中添加了一个名为cbSize的2字节字段。这就是为什么你会看到16和18的subchunk1size值。两字节的差异取决于cbSize字段的存在或不存在。使用当前版本的WAVEFORMATEX形成适当的现代音频文件,无论通道数量或位深度如何,都将具有18的subchunk1大小。创建之前微软改变了WAVEFORMATEX结构旧文件,有16

这里,subchunk1size是我的策略:

当读取一个文件,subchunk1size可以是16或18,那么代码应该做出相应的调整。有很多老wav文件与旧格式在那里,还是现代的文件可能与没有CBSIZE场老WAVEFORMATEX结构被错误地写成。

创建wav文件时,无论通道数量或位深度如何,我总是使用18的subchunk1size大小,因为Microsoft已经永久更改了WAVEFORMATEX结构并使该文件符合规范。

Windows Media Player对于确保您的wav文件可以打开和播放很有用。

http://msdn.microsoft.com/en-us/library/windows/desktop/dd390970%28v=vs.85%29.aspx