wav文件的文件頭信息詳解


wav文件的文件頭

wave文件的格式:
 
00H 4 char "RIFF"標志  04H 4 long int 文件長度  08H 4 char "WAVE"標志  0CH 4 char "fmt"標志  10H 4   過渡字節(不定)  14H 2 int 格式類別(10H為PCM形式的聲音數據)  16H 2 int 通道數,單聲道為1,雙聲道為2  18H 2 int 采樣率(每秒樣本數),表示每個通道的播放速度,  1CH 4 long int 波形音頻數據傳送速率,其值為通道數×每秒數據位數×每樣                本的數據位數/8。播放軟件利用此值可以估計緩沖區的大小。  20H 2 int 數據塊的調整數(按字節算的),其值為通道數×每樣本的數據位            值/8。播放軟件需要一次處理多個該值大小的字節數據,以便將其            值用於緩沖區的調整。  22H 2   每樣本的數據位數,表示每個聲道中各個樣本的數據位數。如果有多          個聲道,對每個聲道而言,樣本大小都一樣。  24H 4 char 數據標記符"data"  28H 4 long int 語音數據的長度 

樓主的帖子,文件頭長度加起來是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”關鍵字,進而得出文件頭的實際長度。

就想到了這些,暫時記下來。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM