1. 程式人生 > >WAV音訊簡介

WAV音訊簡介

WAVE檔案是非常簡單的一種RIFF檔案,它的格式型別為”WAVE”。RIFF塊包含兩個子塊,這兩個子塊的ID分別是”fmt”和”data”,其中”fmt”子塊由結構PCMWAVEFORMAT所組成,其子塊的大小就是sizeofof(PCMWAVEFORMAT),資料組成就是PCMWAVEFORMAT結構中的資料。(詳細介紹於http://blog.csdn.net/zhihu008/article/details/7854529中檢視,這裡只作簡要介紹) 


 
wav檔案結構 

PCMWAVEFORMAT結構定義如下: 

typedef struct
{
    WAVEFORMAT wf; // 波形格式;
    WORD wBitsPerSample;//WAVE檔案的取樣大小;
} PCMWAVEFORMAT;

WAVEFORMAT結構定義如下: 

typedef struct
{
    WORD wFormatag;//編碼格式,包括WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM等
    WORD nChannls;//聲道數,單聲道為1,雙聲道為2
    DWORD nSamplesPerSec;//取樣頻率
    DWORD nAvgBytesperSec;//每秒的資料量
    WORD nBlockAlign;//塊對齊(每個取樣的位元組長度)
} WAVEFORMAT;

WAV檔案頭結構: 

typedef struct
{
    char chRIFF[4];//"RIFF"
    DWORD dwRIFFLen;//總長度-8
    char chWAVE[4];//"WAVE"
    char chFMT[4];//"fmt "
    DWORD dwFMTLen;//sizeof(PCMWAVEFORMAT )
    PCMWAVEFORMAT pwf;
    char chDATA[4];//"data"
    DWORD dwDATALen;//音訊資料長度
}WaveHeader;

其中的字元陣列都是固定格式。以下分別對應8、16位元單雙通道的資料儲存格式圖: 
8bit、單通道: 


 

8bit、雙通道: 

 

16bit、單通道: 

 

16bit、雙通道: 

 


wav標頭檔案詳解

參考

http://baike.baidu.com/view/8033.htm

下面是摘抄在維基百科的關於riff檔案的定義
RIFF檔案由一個簡單的表頭(header)跟隨著多個 "chunks"所組。其格式完全跟IFF一樣,除整數的儲存方式不一樣以外。
表頭(Header)
4 位元組(bytes):固定為"RIFF".
4 位元組:little-endian 32-bit 正整數,整個檔案的大小,扣掉辨識字元和長度,共8個位元組。
4 位元組:這個檔案的型態字元,例如:"AVI " 或 "WAVE".
接下來是區塊(Chunks),每個區塊包含:
4 位元組:此區塊的ASCII識別字,例如:"fmt " 或 "data".
4 位元組:little-endian 32-bit 正整數,表示本區塊的長度(這個正整數本身和區塊識別字的長度不算在內).
不固定長度欄位:此區塊的資料,大小等同前一欄之正整數。
假如區塊的長度不為偶數,則填入一個 byte。


可以參考下表

偏移地址 大小 位元組 資料塊 型別 內容
00H~03H 4 4字元 資源交換檔案標誌(RIFF)
04H~07H 4 長整數 從下個地址開始到檔案尾的總位元組數
08H~0BH 4 4字元 WAV檔案標誌(WAVE)
0CH~0FH 4 4字元 波形格式標誌(fmt ),最後一位空格。
10H~13H 4 整數 過濾位元組(一般為00000010H)
14H~15H 2 整數 格式種類(值為1時,表示資料為線性PCM編碼)
16H~17H 2 整數 通道數,單聲道為1,雙聲道為2
18H~1BH 4 長整數 取樣頻率
1CH~1FH 4 長整數 波形資料傳輸速率(每秒平均位元組數)
20H~21H 2 整數 DATA資料塊長度,位元組。
22H~23H 2 整數 PCM位寬
24H~27H 4 4字元 “fact”,該部分一下是可選部分,即可能有,可能沒有,一般到WAV檔案由某些軟體轉換而成時,包含這部分。
28H~2BH 4 長整數 size,數值為4


表2 WAV聲音檔案的
偏移地址 位元組數 型別 內容
24H~27H 4 4字元 資料標誌符(data)
28H~2BH 4 長整型 DATA總資料長度位元組
2CH... ...   DATA資料塊

他的三個最重要的引數是取樣率,位元數,聲道數。

我們使用UE開啟這個音訊檔案

音訊二進位制檔案

注意,我們的pc都是小端模式,所以注意讀取資料的真實內容。
我們解讀一下這個wav檔案
00H ~ 03H  52 49 46 46     對應的是RIFF
04H ~ 07H  48 10 03 00     對應的是後面檔案的大小,小端模式所以是00031048 ,換算為十進位制的200776
08H ~ 0BH  57 41 56 45     對應的是標示符WAVE
0CH ~ 0FH  66 6d 74 20     對應是波形格式標示符fmt
10H ~ 13H  12 00 00 00     對應的是過濾位元組,不知道是什麼作用,由於本檔案不是標準的取樣率,所以可能和上面的不一致
14H ~ 15H  01 00           對應的十進位制是1 線性的PCM編碼,我們這裡只探討PCM編碼
16H ~ 17H  01 00           對應的十進位制是1 表示單聲道,MONO
18H ~ 1BH  80 3E 00 00     對應的十進位制是16000.表示取樣率是16000的
1CH ~ 1FH  00 7D 00 00     對應的十進位制是32000,波形資料傳輸率,每秒多少個位元組,可以用(200776 -72)/32000 = 6.272s
20H ~ 21H  02 00           對應的十進位制是2,資料的調整數
22H ~ 23H  10 00           對應的十進位制是16,樣本資料的位數,表示用16位表示一個樣本


我們的和表二之間有一些差距,是ffmpeg轉碼的資料,所以中間夾著了一些ffmpeg的資訊
48H ~ 4BH 64 61 74 71      對應的ACSCII碼是data
4CH ~ 4FH 00 10 03 00      對應的十進位制是200704,表示取樣資料的總數
從50H開始就是真正的資料部分


在使用ffmpeg解包的時候總共是有49個包,每個包的大小為4096, 49*4096 =200704,
怎麼計算出來包的大小,需要進一步的分析。