多媒體文件解析(一):WAV文件解析

在之前的《多媒體文件格式》系列中,我們對主流的多媒體的文件格式進行了整理和講述。這裏開始我們開始對如何分析和解釋多媒體文件來進行整理,以便於以後我們自己排查一些問題的時候有一些幫助。本篇我們就講一下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文件中PCM的bit位排列方式如下表所示:

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

具體的格式可以參照下圖進行理解:

 

 

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