1.概述
Waveform Audio File Format(WAVE,又或者是因?yàn)?code>WAV后綴而被大眾所知的),它采用RIFF(Resource Interchange File Format)文件格式結(jié)構(gòu)。通常用來保存PCM格式的原始音頻數(shù)據(jù),所以通常被稱為無損音頻。但是嚴(yán)格意義上來講,WAV也可以存儲(chǔ)其它壓縮格式的音頻數(shù)據(jù)。
2.格式解析
WAV文件遵循RIFF規(guī)則,其內(nèi)容以區(qū)塊(chunk)為最小單位進(jìn)行存儲(chǔ)。WAV文件一般由3個(gè)區(qū)塊組成:RIFF chunk、Format chunk和Data chunk。另外,文件中還可能包含一些可選的區(qū)塊,如:Fact chunk、Cue points chunk、Playlist chunk、Associated data list chunk等。
本文將只介紹RIFF chunk、Format chunk和Data chunk。
2.1 RIFF區(qū)塊
| 名稱 | 偏移地址 | 字節(jié)數(shù) | 端序 | 內(nèi)容 |
|---|---|---|---|---|
| ID | 0x00 | 4Byte | 大端 | 'RIFF' (0x52494646) |
| Size | 0x04 | 4Byte | 小端 | fileSize - 8 |
| Type | 0x08 | 4Byte | 大端 | 'WAVE'(0x57415645) |
- 以
'RIFF'為標(biāo)識(shí) -
Size是整個(gè)文件的長度減去ID和Size的長度 -
Type是WAVE表示后面需要兩個(gè)子塊:Format區(qū)塊和Data區(qū)塊
2.2 FORMAT區(qū)塊
| 名稱 | 偏移地址 | 字節(jié)數(shù) | 端序 | 內(nèi)容 |
|---|---|---|---|---|
| ID | 0x00 | 4Byte | 大端 | 'fmt ' (0x666D7420) |
| Size | 0x04 | 4Byte | 小端 | 16 |
| AudioFormat | 0x08 | 2Byte | 小端 | 音頻格式 |
| NumChannels | 0x0A | 2Byte | 小端 | 聲道數(shù) |
| SampleRate | 0x0C | 4Byte | 小端 | 采樣率 |
| ByteRate | 0x10 | 4Byte | 小端 | 每秒數(shù)據(jù)字節(jié)數(shù) |
| BlockAlign | 0x14 | 2Byte | 小端 | 數(shù)據(jù)塊對(duì)齊 |
| BitsPerSample | 0x16 | 2Byte | 小端 | 采樣位數(shù) |
- 以
'fmt '為標(biāo)識(shí) -
Size表示該區(qū)塊數(shù)據(jù)的長度(不包含ID和Size的長度) -
AudioFormat表示Data區(qū)塊存儲(chǔ)的音頻數(shù)據(jù)的格式,PCM音頻數(shù)據(jù)的值為1 -
NumChannels表示音頻數(shù)據(jù)的聲道數(shù),1:單聲道,2:雙聲道 -
SampleRate表示音頻數(shù)據(jù)的采樣率 -
ByteRate每秒數(shù)據(jù)字節(jié)數(shù) = SampleRate * NumChannels * BitsPerSample / 8 -
BlockAlign每個(gè)采樣所需的字節(jié)數(shù) = NumChannels * BitsPerSample / 8 -
BitsPerSample每個(gè)采樣存儲(chǔ)的bit數(shù),8:8bit,16:16bit,32:32bit
2.3 DATA區(qū)塊
| 名稱 | 偏移地址 | 字節(jié)數(shù) | 端序 | 內(nèi)容 |
|---|---|---|---|---|
| ID | 0x00 | 4Byte | 大端 | 'data' (0x64617461) |
| Size | 0x04 | 4Byte | 小端 | N |
| Data | 0x08 | NByte | 小端 | 音頻數(shù)據(jù) |
- 以
'data'為標(biāo)識(shí) -
Size表示音頻數(shù)據(jù)的長度,N = ByteRate * seconds -
Data音頻數(shù)據(jù)
3. 小端存儲(chǔ)
WAV文件以小端形式來進(jìn)行數(shù)據(jù)存儲(chǔ)。
所謂的大端模式,是指數(shù)據(jù)的低位保存在內(nèi)存的高地址中,而數(shù)據(jù)的高位,保存在內(nèi)存的低地址中;
所謂的小端模式,是指數(shù)據(jù)的低位保存在內(nèi)存的低地址中,而數(shù)據(jù)的高位保存在內(nèi)存的高地址中。
下面解釋一下PCM數(shù)據(jù)在WAV文件中的bit位排列方式
| PCM數(shù)據(jù)類型 | 采樣 | 采樣 |
|---|---|---|
| 8Bit 單聲道 | 聲道0 | 聲道0 |
| 8Bit 雙聲道 | 聲道0 | 聲道1 |
| 16Bit 單聲道 | 聲道0低位,聲道0高位 | 聲道0低位,聲道0高位 |
| 16Bit 雙聲道 | 聲道0低位,聲道0高位 | 聲道1低位,聲道1高位 |