2013-11-26 105 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