Android音頻開發(1):基礎知識

先來點閒言碎語,前段時間我有一段感悟:Android開發,自己並非一個能夠走得多遠的方向,它只是一個平臺,提供了許多封裝好的API,讓你們可以快速開發出針對特定業務的應用。前端


真正有價值的地方就在於Android與具體的業務方向結合,好比:Android與音視頻技術,Android與智能硬件交互,Android與前端技術的融合與探索,Android信息安全,Android源碼深度定製等等。android


我一直比較看好音視頻/多媒體方向,但願在此可以深刻積累和探索,前段時間我發佈了一款Android VoIP網絡電話應用「飛鴿電話」,並寫了一篇分析其總體架構的文章《PigeonCall:一款Android VoIP網絡電話App架構分析》,歡迎有興趣的小夥伴們先看一看。web


在這個應用的開發過程當中學到的東西還蠻多的,所以想寫一些文章分享分享,本文做爲開篇,主要以問答的形式,介紹一些音頻開發的基礎常識,很是重要,由於不瞭解這些常識,不少Android API或者第三方庫的參數,你都不知道該怎麼配置。算法


1. 音頻開發的主要應用有哪些?安全


音頻播放器,錄音機,語音電話,音視頻監控應用,音視頻直播應用,音頻編輯/處理軟件,藍牙耳機/音箱,等等。微信


2. 音頻開發的具體內容有哪些?網絡


(1)音頻採集/播放架構

(2)音頻算法處理(去噪、靜音檢測、回聲消除、音效處理、功放/加強、混音/分離,等等)ide

(3)音頻的編解碼和格式轉換post

(4)音頻傳輸協議的開發(SIP,A2DP、AVRCP,等等)


3. 音頻應用的難點在哪?


延時敏感、卡頓敏感、噪聲抑制(Denoise)、回聲消除(AEC)、靜音檢測(VAD)、混音算法,等等。


4. 音頻開發基礎概念有哪些?


在音頻開發中,下面的這幾個概念常常會遇到。


(1) 採樣率(samplerate)


採樣就是把模擬信號數字化的過程,不只僅是音頻須要採樣,全部的模擬信號都須要經過採樣轉換爲能夠用0101來表示的數字信號,示意圖以下所示:


wKioL1bdXQviw_TBAAAVYm_x3gk862.gif


藍色表明模擬音頻信號,紅色的點表明採樣獲得的量化數值。


採樣頻率越高,紅色的間隔就越密集,記錄這一段音頻信號所用的數據量就越大,同時音頻質量也就越高。


根據奈奎斯特理論,採樣頻率只要不低於音頻信號最高頻率的兩倍,就能夠無損失地還原原始的聲音。


一般人耳能聽到頻率範圍大約在20Hz~20kHz之間的聲音,爲了保證聲音不失真,採樣頻率應在40kHz以上。經常使用的音頻採樣頻率有:8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz、96kHz、192kHz等。


(2) 量化精度(位寬)


上圖中,每個紅色的採樣點,都須要用一個數值來表示大小,這個數值的數據類型大小能夠是:4bit、8bit、16bit、32bit等等,位數越多,表示得就越精細,聲音質量天然就越好,固然,數據量也會成倍增大。


常見的位寬是:8bit 或者 16bit


(3) 聲道數(channels)


因爲音頻的採集和播放是能夠疊加的,所以,能夠同時從多個音頻源採集聲音,並分別輸出到不一樣的揚聲器,故聲道數通常表示聲音錄製時的音源數量或回放時相應的揚聲器數量。


單聲道(Mono)和雙聲道(Stereo)比較常見,顧名思義,前者的聲道數爲1,後者爲2


(4) 音頻幀(frame)


這個概念在應用開發中很是重要,網上不少文章都沒有專門介紹這個概念。


音頻跟視頻很不同,視頻每一幀就是一張圖像,而從上面的正玄波能夠看出,音頻數據是流式的,自己沒有明確的一幀幀的概念,在實際的應用中,爲了音頻算法處理/傳輸的方便,通常約定俗成取2.5ms~60ms爲單位的數據量爲一幀音頻。


這個時間被稱之爲「採樣時間」,其長度沒有特別的標準,它是根據編×××和具體應用的需求來決定的,咱們能夠計算一下一幀音頻幀的大小:


假設某通道的音頻信號是採樣率爲8kHz,位寬爲16bit,20ms一幀,雙通道,則一幀音頻數據的大小爲:


int size = 8000 x 16bit x 0.02s  x 2 = 5120 bit = 640 byte


5. 常見的音頻編碼方式有哪些?


上面提到過,模擬的音頻信號轉換爲數字信號須要通過採樣和量化,量化的過程被稱之爲編碼,根據不一樣的量化策略,產生了許多不一樣的編碼方式,常見的編碼方式有:PCM 和 ADPCM,這些數據表明着無損的原始數字音頻信號,添加一些文件頭信息,就能夠存儲爲WAV文件了,它是一種由微軟和IBM聯合開發的用於音頻數字存儲的標準,能夠很容易地被解析和播放。


咱們在音頻開發過程當中,會常常涉及到WAV文件的讀寫,以驗證採集、傳輸、接收的音頻數據的正確性。


6. 常見的音頻壓縮格式有哪些?


首先簡單介紹一下音頻數據壓縮的最基本的原理:由於有冗餘信息,因此能夠壓縮。


(1) 頻譜掩蔽效應: 人耳所能察覺的聲音信號的頻率範圍爲20Hz~20KHz,在這個頻率範圍之外的音頻信號屬於冗餘信號。


(2) 時域掩蔽效應: 當強音信號和弱音信號同時出現時,弱信號會聽不到,所以,弱音信號也屬於冗餘信號。


下面簡單列出常見的音頻壓縮格式:


MP3,AAC,OGG,WMA,Opus,FLAC,APE,m4a,AMR,等等


7. Adndroid VoIP相關的開源應用有哪些 ?


imsdroid,sipdroid,csipsimple,linphone,WebRTC 等等


8. 音頻算法處理的開源庫有哪些 ?


speex、ffmpeg,webrtc audio module(NS、VAD、AECM、AGC),等等


10. Android提供了哪些音頻開發相關的API?


音頻採集:  MediaRecoder,AudioRecord

音頻播放:  SoundPool,MediaPlayer,AudioTrack (它們之間的區別能夠參考這篇文章)

音頻編解碼: MediaCodec

NDK API:     OpenSL ES


11. 音頻開發的延時標準是什麼?


ITU-TG.114規定,對於高質量語音可接受的時延是300ms。通常來講,若是時延在300~400ms,通話的交互性比較差,但還能夠接受。時延大於400ms時,則交互通訊很是困難。


12. 小結


音頻開發的知識點其實挺多的,一篇文章也沒法詳細地展開敘述,所以,不夠全面和詳盡的地方,請你們搜索專業的資料進行深刻了解。文章中有不清楚的地方歡迎留言或者來信 lujun.hust@gmail.com 交流,或者關注個人新浪微博 @盧_俊 或者 微信公衆號 @Jhuster 獲取最新的文章和資訊。

wKiom1bdXr-BXKLtAACb8XAe6Uo863.jpg

相關文章
相關標籤/搜索