wav文件的文件頭
樓主的帖子,文件頭長度加起來是42字節,但是實際長度是44個字節(用UltraEdit打開一個WAVE文件,數一下就知道了)。如果用以個結構體來定義WAVE文件頭應該為: struct WAVEFILEHEADER { char chRIFF[4]; DWORD dwRIFFLen; char chWAVE[4]; char chFMT[4]; DWORD dwFMTLen; PCMWAVEFORMAT pwf; char chDATA[4]; DWORD dwDATALen; };
但是實際測試,並不是所有的wave文件頭都一樣。比較麻煩的就是windows下自帶的那個錄音機錄下的wav,文件頭有58個Byte。所以,比較好的辦法是,首先讀取n長的一段字符,例如60個;然后從中查找關鍵字“data”,“data”之后的一個DWORD是實際音頻數據的長度,得到這個長度len,再從這DWORD后開始讀取len個字節,就可以讀到文件尾。如果是雙聲道的,那么數據是交替存放的;如果是16bit采樣的,每兩個字節會以小端的方式存儲一個AD值。根據這樣的方式,就可以順利讀取音頻數據了。
有一個問題就是:在不知道文件頭多長的情況下,采用直接讀取60個Byte的方法是不夠嚴謹的。如果是標准的wav格式,那么文件頭只有44byte,就存在整個文件都沒有60Byte長的可能性。實際中當然不大可能,但是嚴謹考慮,應該先讀取36個Byte,從37開始,4個4個的讀取,判斷是否有“data”關鍵字,進而得出文件頭的實際長度。
就想到了這些,暫時記下來。