在之前的《多媒體文件格式》系列中,我們對主流的多媒體的文件格式進行了整理和講述。這里開始我們開始對如何分析和解釋多媒體文件來進行整理,以便於以后我們自己排查一些問題的時候有一些幫助。本篇我們就講一下WAV文件格式。
首先我們知道WAV格式的實質就是在 PCM 文件的前面加了一個文件頭。下面是使用二進制打開的一個WAV文件,此文件只寫入了WAV頭信息。整個文件的大小為44b。
下面我們就針對WAV頭進行一點點的解析和整理。WAV文件遵循RIFF規則,其內容以區塊最小單位進行存儲。WAV文件由3個區塊組成:RIFF chunk, Format chunk 和 Data chunk。另外還有可能包含其他的可選區塊,如:Fact chunk、Cue points chunk等。
一、RIFF區塊
下面我們針對此區塊的三個名稱的內容進行分析:
ID:在WAV格式中,ID固定以 RIFF 為標識。換成進制數據為:0x52494646,此值為大端序,按照正常的順序進行讀取即可。
Size:Size的大小為整個文件的長度減去ID和Size的長度. 注意此為小端序,計算大小的時候,需從右邊往左讀。例如本WAV的Size為36(十六進制:24),再加上Size和ID的長度,整個文件的大小44b就是這么來的.
Type:在WAV文件中,Type的內容固定為 "WAVE",表示后面會有兩個區塊,Format區塊和Data區塊。
二、FORMAT區塊
ID:此區塊的ID以'fmt '為標識
Size:表示該區塊數據的長度(不包含ID和Size的長度)
AudioFormat:表示Data區塊存儲的音頻數據的格式,PCM音頻數據的值為1
NumChannels:表示音頻數據的聲道數,1:單聲道,2:雙聲道
SampleRate:表示音頻數據的采樣率
ByteRate:每秒數據字節數 = SampleRate * NumChannels * BitsPerSample / 8
BlockAlign:每個采樣所需的字節數 = NumChannels * BitsPerSample / 8
BitsPerSample:每個采樣存儲的bit數,8:8bit,16:16bit,32:32bit
三、DATA區塊
ID:區塊的ID以'data'為標識
Size:表示音頻數據的長度,N = ByteRate * seconds
Data:存儲的是音頻數據
四、WAV音頻數據存儲方式
WAV文件的PCM音頻數據以小端形式來進行數據存儲。
先簡單的說明一下大端存儲和小端存儲的區別。
- 大端存儲:數據的低位保存在內存的高地址中,而數據的高位,保存在內存的低地址中;
- 小端存儲:數據的低位保存在內存的低地址中,而數據的高位保存在內存的高地址中.

這里解釋一下WAV文件數據存儲的最小單元是采樣點,也就是說,如果WAV頭中配置采樣點的大小是16bit,那么兩個字節代表一個采樣點(Int16),如果為32bit則是4個字節代表一個采樣點(Int32)。然而,它們都是無符號整型,只是采樣的精度不同而已。另外,要為每個聲道都存儲采樣點。如果是單聲道的話,采樣點就是簡單的順序排列。如果是雙聲道,采樣點就是左右聲道交錯排列。采樣頻率也需要與數據的保持一致,否則可能會造成音頻播放速度上出現異常。
具體的格式可以參照下圖進行理解: