wav封裝格式

wav文件格式做爲一種經常使用的多媒體音頻文件格式,其由MS在1991年8月在Windows 3.1上推出,文件擴展名爲WAV,是WaveFom的簡寫。一般存儲未壓縮的pcm數據,也可存儲壓縮的pcm數據(G711a/u, G726, ADPCM)。WAV文件格式簡稱WAV格式,是一種存儲聲音波形的數字音頻格式,是由微軟公司和IBM聯合設計的,通過了屢次修訂,可用於Windows,Macintosh,Linix等多種操做系統,詳述以下。git

波形文件的基礎知識

1.1 波形文件的存儲過程

聲源發出的聲波經過話筒被轉換成連續變化的電信號,通過放大、抗混疊濾波後,按固定的頻率進行採樣,每一個樣本是在一個採樣週期內檢測到的電信號幅度值;接下來將其由模擬電信號量化爲由二進制數值;最後編碼並存儲爲音頻流數據。有的應用爲了節省存儲空間,存儲前,還要對採樣數據先進行壓縮(G711/G726)。其過程以下:github

採樣->模擬信號->量化->壓縮->存儲。算法

1.2 WAV文件的編碼

編碼包括了兩方面內容:一是按必定格式存儲數據;二是採用必定的算法壓縮數據。WAV格式對音頻流的編碼沒有硬性規定,既支持非壓縮的PCM(Puls Code Modulation)脈衝編碼調製格式,又支持壓縮型的數據,如微軟自適應分脈衝編碼調製Microsoft ADPCM(Adaptive Differential Puls Code Modulation)、國際電報聯盟(International Telegraph Union)制定的語音壓縮標準ITUG.711 a-law、ITU G.711 u-law、IMA ADPCM和其它壓縮算法。網絡

1.3 WAV文件存儲格式

       封裝格式主要包括三部分:"RIFF" chunk, "fmt " sub-chunk, "data" sub-chunk。工具

每一個chunk的格式以下:學習

塊標識 4Bytes "RIFF"/"fmt "/"data"
塊長度 4Bytes 接下來「數據」到文件尾的size
數據 X Bytes 具體內容

 

 

 

 

其中,對「塊長度」進行詳細解釋,其大小爲從接下來「數據」部分開始,一直到文件尾結束,其以字節爲單位的大小。可是,"fmt " sub-chunk則有些特別。測試

例如,"RIFF" chunk,其「塊長度」=file_size - 8Bytes,由於要排除「塊標識」+本「塊長度」的8Bytes。編碼

"fmt " sub-chunk(注意t後面有個空格,必須由4Bytes組成),其大小爲該sub-chunk的大小=16Bytes。操作系統

"data" sub-chunk,其大小爲接下來「數據」部分的size,即pcm數據的大小=file_size - 44Bytes(wav頭大小)。設計

1.4 WAV文件實例分析

經過winhex查看二進制數據以下:

 

PCM基礎知識

(1)採樣頻率(sample rate):又稱取樣頻率。是單位時間內的採樣次數(一秒鐘採樣多少次信號),決定了數字化音頻的質量。採樣頻率越高,數字化音頻的質量越好、聲音越真實,固然所佔的資源、存儲空間也越多。根據奎特採樣定理,要從採樣中徹底恢復原始信號的波形,採樣頻率要高於聲音中最高頻率的兩倍。人耳可聽到的聲音的頻率範圍是在16Hz-20kHz之間。所以,要將聽到的原聲音真實地還原出來,採樣頻率必須大於4 0k H z 。經常使用的採樣頻率有8 k H z 、1 1 . 02 5 k H z 、22.05kHz、44.1kHz、48kHz等幾種。22.05KHz至關於普通FM廣播的音質,44.1KHz理論上可達到CD的音質。對於高於48KHz的採樣頻率人耳很難分辨,沒有實際意義。錄像設備採集人聲時,一般用16kHz採樣,使用8kHz的則聲音回放時有些悶,使用16k以上時跟16k的分不出區別。而專業錄音棚中錄製時,則一般使用44.1k/48k/96k的採樣率,由於不只要採集人聲,還要採集樂器聲。


(2)採樣位數(bit width):也叫量化位數(單位:比特),是存儲每一個採樣值所用的二進制位數。採樣值反應了聲音的波動狀態。採樣位數決定了量化精度。採樣位數越長,量化的精度就越高,還原的波形曲線越真實,產生的量化噪聲越小,回放的效果就越逼真。經常使用的量化位數有四、八、十二、1六、24。量化位數與聲卡的位數和編碼有關。若是採用PCM編碼時使用16位聲卡,可將音頻信號幅度劃分紅了64K個音量等級,取值範圍爲-32768至32767。網絡上音頻文件基本上都是16位採樣精度。


(3)聲道數(channel count):是使用的聲音通道的個數,也是採樣時所產生的聲音波形的個數。咱們一般接觸到的是單聲道(mono)和立體聲(stereo)。立體聲在採集時,使用兩個mic,兩個mic處於不一樣的位置,其採集時所量化到的二進制值有些差異,所以在回放時會感受到兩個耳朵裏信號有些差別,給人以立體感。

 

WAV實例練習

爲了學習wav封裝格式,特寫了一個工具,用於讀取/寫wav文件,檢查sample_rate/channel_cnt/duration。已上傳GitHub:https://github.com/Dreaming-in-Gottingen/AudioTools

wav_utils文件生成libwav_ops.so庫文件,tests用於測試libwav_ops.so中對wav讀/寫的實現,CStdWavGenerator用於生成標準的音頻文件(如正弦波,方波,三角波)。

碼了這麼多字,實在太費時間了,朋友們能夠下載下來測試一下。有問題,歡迎留言。

之後有時間了,再整一篇文章介紹一下關於pcm增益、採樣率、頻率等問題。

相關文章
相關標籤/搜索