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值。根據這樣的方式,就可以順利讀取音頻數據了。
?
原文地址:http://www.cnblogs.com/huaping-audio/archive/2010/03/08/1680654.html
總結
- 上一篇: Java番外篇1——正则表达式
- 下一篇: linux 文件名带特殊符号,Linux