解讀Wave文件頭結構

解讀Wave,文件頭解釋,可以用16位編輯器UltraEdit打開,然後可以觀察文件的結構。
我發現對應C語言裏面的字WORD(32位),16進制文件對應2個字節(Byte),而DWORD(64位),對應4個字節。
然後順便普及一下16進制文件的存儲規律,對於WORD,先存儲低位字節,然後存儲高位字節,而DWORD,則先存儲低兩位的低位,然後是低兩位的高位,然後是高兩位的低位,然後是高兩位的高位。


介紹一下WAVE文件的結構:
標誌符(RIFF)
數據大小
格式類型("WAVE")
"fmt"
Sizeof(PCMWAVEFORMAT)
PCMWAVEFORMAT
"data"
聲音數據大小
聲音數據


查到C語言中對應的WAV的文件頭結構如下:
  1. Typedef struct
  2. {
  3. WAVEFORMAT wf;//波形格式;
  4. WORD wBitsPerSample;//WAVE文件的採樣大小;
  5. }PCMWAVEFORMAT;
  6. WAVEFORMAT結構定義如下:
  7. typedef struct
  8. {
  9. WORD wFormatag;//編碼格式,包括WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM等
  10. WORD nChannls;//聲道數,單聲道爲1,雙聲道爲2;
  11. DWORD nSamplesPerSec;//採樣頻率;
  12. DWORD nAvgBytesperSec;//每秒的數據量;
  13. WORD nBlockAlign;//塊對齊;
  14. }WAVEFORMAT;

然後我們根據實際的一個文件的文件頭進行對比分析,然後大家就應該明白了:
首先是一串“52 49 46 46”這個是Ascii字符“RIFF”,這部分是固定格式,表明這是一個WAVE文件頭。
然後是“E4 3C 00 00”,這個是我這個WAV文件的數據大小,記住這個大小是包括頭文件的一部分的,包括除了前面8個字節的所有字節,也就等於文件總字節數減去8。這是一個DWORD,我這個文件對應是15588。
然後是“57 41 56 45 66 6D 74 20”,也是Ascii字符“WAVEfmt”,這部分是固定格式。
然後是PCMWAVEFORMAT部分,可以對照一下上面的struct定義,首先就是一個WAVEFORMAT的struct。
隨後是“10 00 00 00”,這是一個DWORD,對應數字16,這個對應定義中的Sizeof(PCMWAVEFORMAT),後面我們可以看到這個段內容正好是16個字節。
隨後的字節是“01 00”,這是一個WORD,對應定義爲編碼格式“WAVE_FORMAT_PCM”,我們一般用的是這個。
隨後的是“01 00”,這是一個WORD,對應數字1,表示聲道數爲1,這是個單聲道Wav。
隨後的是“22 56 00 00”,這是一個DWORD,對應數字22050,代表的是採樣頻率22050。
隨後的是“44 AC 00 00”,這是一個DWORD,對應數字44100,代表的是每秒的數據量。
然後是“02 00”,這是一個WORD,對應數字是2,表示塊對齊的內容,含義不太清楚。
然後是“10 00”,這是一個WORD,對應WAVE文件的採樣大小,數值爲16,採樣大小爲16Bits。
然後是一串“64 61 74 61”,這個是Ascii字符“data”,標示頭結束,開始數據區域。
而後是數據區的開頭,有一個DWORD,我這裏的字符是“C0 3C 00 00”,對應的十進制數爲15552,看一下前面正好可以看到,文件大小是15596,其中到“data”標誌出現爲止的頭是40個字節,再減去這個標誌的4個字節正好是15552,再往後面就是真正的Wave文件的數據體了,頭文件的解析就到這裏。
下面從別人的文章轉述文件體的數據格式:
16位單聲道:
採樣一(低字節、高字節),採樣二(低字節、高字節),……
16位雙聲道:
採樣一[左聲道(低字節、高字節)、右聲道(低字節、高字節)],……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章