wav封装格式
wav文件格式作為一種常用的多媒體音頻文件格式,其由MS在1991年8月在Windows 3.1上推出,文件擴(kuò)展名為WAV,是WaveFom的簡(jiǎn)寫。通常存儲(chǔ)未壓縮的pcm數(shù)據(jù),也可存儲(chǔ)壓縮的pcm數(shù)據(jù)(G711a/u, G726, ADPCM)。WAV文件格式簡(jiǎn)稱WAV格式,是一種存儲(chǔ)聲音波形的數(shù)字音頻格式,是由微軟公司和IBM聯(lián)合設(shè)計(jì)的,經(jīng)過了多次修訂,可用于Windows,Macintosh,Linix等多種操作系統(tǒng),詳述如下。
波形文件的基礎(chǔ)知識(shí)
1.1 波形文件的存儲(chǔ)過程
聲源發(fā)出的聲波通過話筒被轉(zhuǎn)換成連續(xù)變化的電信號(hào),經(jīng)過放大、抗混疊濾波后,按固定的頻率進(jìn)行采樣,每個(gè)樣本是在一個(gè)采樣周期內(nèi)檢測(cè)到的電信號(hào)幅度值;接下來將其由模擬電信號(hào)量化為由二進(jìn)制數(shù)值;最后編碼并存儲(chǔ)為音頻流數(shù)據(jù)。有的應(yīng)用為了節(jié)省存儲(chǔ)空間,存儲(chǔ)前,還要對(duì)采樣數(shù)據(jù)先進(jìn)行壓縮(G711/G726)。其過程如下:
采樣->模擬信號(hào)->量化->壓縮->存儲(chǔ)。
1.2 WAV文件的編碼
編碼包括了兩方面內(nèi)容:一是按一定格式存儲(chǔ)數(shù)據(jù);二是采用一定的算法壓縮數(shù)據(jù)。WAV格式對(duì)音頻流的編碼沒有硬性規(guī)定,既支持非壓縮的PCM(Puls Code Modulation)脈沖編碼調(diào)制格式,又支持壓縮型的數(shù)據(jù),如微軟自適應(yīng)分脈沖編碼調(diào)制Microsoft ADPCM(Adaptive Differential Puls Code Modulation)、國(guó)際電報(bào)聯(lián)盟(International Telegraph Union)制定的語音壓縮標(biāo)準(zhǔn)ITUG.711 a-law、ITU G.711 u-law、IMA ADPCM和其它壓縮算法。
1.3 WAV文件存儲(chǔ)格式
封裝格式主要包括三部分:"RIFF" chunk, "fmt " sub-chunk, "data" sub-chunk。
每個(gè)chunk的格式如下:
| 塊標(biāo)識(shí) | 4Bytes | "RIFF"/"fmt "/"data" |
| 塊長(zhǎng)度 | 4Bytes | 接下來“數(shù)據(jù)”到文件尾的size |
| 數(shù)據(jù) | X Bytes | 具體內(nèi)容 |
其中,對(duì)“塊長(zhǎng)度”進(jìn)行詳細(xì)解釋,其大小為從接下來“數(shù)據(jù)”部分開始,一直到文件尾結(jié)束,其以字節(jié)為單位的大小。但是,"fmt " sub-chunk則有些特別。
例如,"RIFF" chunk,其“塊長(zhǎng)度”=file_size - 8Bytes,因?yàn)橐懦?ldquo;塊標(biāo)識(shí)”+本“塊長(zhǎng)度”的8Bytes。
"fmt " sub-chunk(注意t后面有個(gè)空格,必須由4Bytes組成),其大小為該sub-chunk的大小=16Bytes。
"data" sub-chunk,其大小為接下來“數(shù)據(jù)”部分的size,即pcm數(shù)據(jù)的大小=file_size - 44Bytes(wav頭大小)。
1.4 WAV文件實(shí)例分析
通過winhex查看二進(jìn)制數(shù)據(jù)如下:
PCM基礎(chǔ)知識(shí)
(1)采樣頻率(sample rate):又稱取樣頻率。是單位時(shí)間內(nèi)的采樣次數(shù)(一秒鐘采樣多少次信號(hào)),決定了數(shù)字化音頻的質(zhì)量。采樣頻率越高,數(shù)字化音頻的質(zhì)量越好、聲音越真實(shí),當(dāng)然所占的資源、存儲(chǔ)空間也越多。根據(jù)奎特采樣定理,要從采樣中完全恢復(fù)原始信號(hào)的波形,采樣頻率要高于聲音中最高頻率的兩倍。人耳可聽到的聲音的頻率范圍是在16Hz-20kHz之間。因此,要將聽到的原聲音真實(shí)地還原出來,采樣頻率必須大于4 0k H z 。常用的采樣頻率有8 k H z 、1 1 . 02 5 k H z 、22.05kHz、44.1kHz、48kHz等幾種。22.05KHz相當(dāng)于普通FM廣播的音質(zhì),44.1KHz理論上可達(dá)到CD的音質(zhì)。對(duì)于高于48KHz的采樣頻率人耳很難分辨,沒有實(shí)際意義。錄像設(shè)備采集人聲時(shí),通常用16kHz采樣,使用8kHz的則聲音回放時(shí)有些悶,使用16k以上時(shí)跟16k的分不出區(qū)別。而專業(yè)錄音棚中錄制時(shí),則通常使用44.1k/48k/96k的采樣率,因?yàn)椴粌H要采集人聲,還要采集樂器聲。
(2)采樣位數(shù)(bit width):也叫量化位數(shù)(單位:比特),是存儲(chǔ)每個(gè)采樣值所用的二進(jìn)制位數(shù)。采樣值反應(yīng)了聲音的波動(dòng)狀態(tài)。采樣位數(shù)決定了量化精度。采樣位數(shù)越長(zhǎng),量化的精度就越高,還原的波形曲線越真實(shí),產(chǎn)生的量化噪聲越小,回放的效果就越逼真。常用的量化位數(shù)有4、8、12、16、24。量化位數(shù)與聲卡的位數(shù)和編碼有關(guān)。如果采用PCM編碼時(shí)使用16位聲卡,可將音頻信號(hào)幅度劃分成了64K個(gè)音量等級(jí),取值范圍為-32768至32767。網(wǎng)絡(luò)上音頻文件基本上都是16位采樣精度。
(3)聲道數(shù)(channel count):是使用的聲音通道的個(gè)數(shù),也是采樣時(shí)所產(chǎn)生的聲音波形的個(gè)數(shù)。我們通常接觸到的是單聲道(mono)和立體聲(stereo)。立體聲在采集時(shí),使用兩個(gè)mic,兩個(gè)mic處于不同的位置,其采集時(shí)所量化到的二進(jìn)制值有些差別,因此在回放時(shí)會(huì)感覺到兩個(gè)耳朵里信號(hào)有些差異,給人以立體感。
WAV實(shí)例練習(xí)
為了學(xué)習(xí)wav封裝格式,特寫了一個(gè)工具,用于讀取/寫wav文件,檢查sample_rate/channel_cnt/duration。已上傳GitHub:https://github.com/Dreaming-in-Gottingen/AudioTools
wav_utils文件生成libwav_ops.so庫(kù)文件,tests用于測(cè)試libwav_ops.so中對(duì)wav讀/寫的實(shí)現(xiàn),CStdWavGenerator用于生成標(biāo)準(zhǔn)的音頻文件(如正弦波,方波,三角波)。
碼了這么多字,實(shí)在太費(fèi)時(shí)間了,朋友們可以下載下來測(cè)試一下。有問題,歡迎留言。
以后有時(shí)間了,再整一篇文章介紹一下關(guān)于pcm增益、采樣率、頻率等問題。
總結(jié)
- 上一篇: Julia与R/Python/MATLA
- 下一篇: 彻底关闭浏览器的弹出广告或通知(Chro