WAV音訊簡介
阿新 • • 發佈:2018-12-20
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標頭檔案詳解
參考
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,
怎麼計算出來包的大小,需要進一步的分析。