編輯:關於Android編程
先來點閒言碎語,前段時間我有一段感悟:Android開發,本身並不是一個可以走得多遠的方向,它只是一個平台,提供了許多封裝好的API,讓大家能夠快速開發出針對特定業務的應用。
真正有價值的地方就在於Android與具體的業務方向結合,比如:Android與音視頻技術,Android與智能硬件交互,Android與前端技術的融合與探索,Android信息安全,Android源碼深度定制等等。
我一直比較看好音視頻/多媒體方向,希望在此能夠深入積累和探索,前段時間我發布了一款Android VoIP網絡電話應用“飛鴿電話”,並寫了一篇分析其整體架構的文章《PigeonCall:一款Android VoIP網絡電話App架構分析》,歡迎有興趣的小伙伴們先看一看。
在這個應用的開發過程中學到的東西還蠻多的,因此想寫一些文章分享分享,本文作為開篇,主要以問答的形式,介紹一些音頻開發的基礎常識,非常重要,因為不了解這些常識,很多Android API或者第三方庫的參數,你都不知道該怎麼配置。
1. 音頻開發的主要應用有哪些?
音頻播放器,錄音機,語音電話,音視頻監控應用,音視頻直播應用,音頻編輯/處理軟件,藍牙耳機/音箱,等等。
2. 音頻開發的具體內容有哪些?
(1)音頻采集/播放
(2)音頻算法處理(去噪、靜音檢測、回聲消除、音效處理、功放/增強、混音/分離,等等)
(3)音頻的編解碼和格式轉換
(4)音頻傳輸協議的開發(SIP,A2DP、AVRCP,等等)
3. 音頻應用的難點在哪?
延時敏感、卡頓敏感、噪聲抑制(Denoise)、回聲消除(AEC)、靜音檢測(VAD)、混音算法,等等。
4. 音頻開發基礎概念有哪些?
在音頻開發中,下面的這幾個概念經常會遇到。
(1) 采樣率(samplerate)
采樣就是把模擬信號數字化的過程,不僅僅是音頻需要采樣,所有的模擬信號都需要通過采樣轉換為可以用0101來表示的數字信號,示意圖如下所示:
藍色代表模擬音頻信號,紅色的點代表采樣得到的量化數值。
采樣頻率越高,紅色的間隔就越密集,記錄這一段音頻信號所用的數據量就越大,同時音頻質量也就越高。
根據奈奎斯特理論,采樣頻率只要不低於音頻信號最高頻率的兩倍,就可以無損失地還原原始的聲音。
通常人耳能聽到頻率范圍大約在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. 小結
音頻開發的知識點其實挺多的,一篇文章也無法詳細地展開敘述,因此,不夠全面和詳盡的地方,請大家搜索專業的資料進行深入了解。
幾乎所有的應用開發者都知道“用戶體驗”的重要性,要提升用戶體驗就離不開一個完備的監控和上報系統,這其中日志(包括Crash上報)是最基本的問題跟蹤和解決手段。本文接下來將
1. UiObejct.getFromParent()的用法:從這個名字就知道,就是從當前對象的父對象中查找想要的子對象,該子對象和當前對象應該是同一層級。如上圖所示:M
在之前app寫完測試的時候,跑完整個老化階段包括數據收發都沒問題,鍵入 adb shell top -m 5 發現我的 app pid 占用的 CPU是最多的,其實我想說
在一些電子商務網站上經常能夠看到一些滾動的廣告條,許多軟件在首次使用時也有類似的廣告條,如圖:其實在github上有實現這種效果的控件,不過這東西做起來也是很簡單,我們今