-
音頻開發主要應用有
1.1 音頻播放器,錄音機,語音電話,音視訊直播應用,音頻編輯處理軟體,藍牙耳機、音箱等。
-
音頻開發具體内容有
2.1 音頻采集與播放
2.2 音頻算法處理(去噪,靜音檢測,回事消除,音效處理,功放/增強,混音/分離)
2.3 音頻編解碼和格式轉換
2.4 音頻傳輸協定的開發(SIP,A2DP, AVRCP,RTP,RTCP)
-
音頻應用的難點
3.1 延時敏感、卡頓明感、噪聲抑制、回聲消除、靜音檢測、混音算法等。
-
音頻開發基礎概念有
4.1 采樣率,采樣是從模拟語音信号轉數字信号的過程,所有的模拟信号都需要通過采樣轉為可以表示的數字信号。目前44100Hz是唯一可以保證相容所有Android手機的采樣率。
4.2 奈奎斯特理論:采樣頻率不低于音頻信号最高頻率的兩倍,就可以做到無誤還原原始的聲音。通常人耳能聽到的20HZ-20KHZ的聲音,為了保證不失真,采樣頻率應該在40KHZ以上。
4.3 量化精度(位寬),每一個采樣點,都需要一個數值來表示大小,這個大小可以是4bit,8bit,16bit… 位數越多,表示越精細,聲音品質就越好,當然,資料量也成倍增大。ENCODING_PCM_16BIT是可以保證相容所有Android手機的。
4.4 聲道數,音頻可以從不同的音頻源采集并輸出到不同的揚聲器,一般表示聲音錄制時的音源數量或者回放時相應的揚聲器數量。常見有單身道mono及雙聲道stereo。
4.5 音頻幀,音頻資料和視訊幀不一樣,視訊幀就是一張圖像,音頻資料是流式結構,本身沒有明确的一幀的概念,隻是為了音頻算法處理傳輸友善,約定2.5ms~60ms為機關的資料量為一幀音頻。這個時間為采樣時間。AndioRecord内部的音頻緩沖區大小不能低于一幀音頻幀的大小。一幀音頻幀大小:int size = 采樣率x位寬x采樣時間x通道數。AudioRecord類提供了一個幫助我們确定緩沖區大小的函數,int getMinBufferSize(int sampleRateInHz, int channelConfig,int audioFormat)。假設某雙通道音頻信号采樣率為8k,位寬16bit,20ms一幀的采樣時間。則一幀資料的大小為:size = 8000x16x0.02x2 = 640byte(位元組)
-
常見音頻編碼方式
5.1 A/D需要采樣和量化,對應上面提到的采樣率和量化寬度。量化的過程被稱為編碼,根據不同的量化政策,有不同的編碼方式,常見有PCM,ADPCM。這些資料代表了無損的原始數字音頻信号,添加一些檔案頭資訊,就可以存儲為wav檔案了。
5.2 擷取不同手機終端的編解碼分辨率,可以通過adb工具擷取/system/etc/media_codecs.xml檔案。
-
常見音頻壓縮格式
原理:因為有備援資訊,是以需要壓縮
6.1 頻譜掩蔽效應:人耳能察覺到的頻率範圍為20hz-20khz,在這個頻率範圍之外的音頻信号屬于備援信号。
6.2 時域掩蔽效應:當強音信号和弱音信号同時出現時,弱信号會聽不到,是以此時弱音信号也屬于備援信号。
-
Android VoIP 相關的開源應用有
7.1 Imsdroid,sipdroid,csipsimple,linephone,WebRTC等。
-
音頻算法處理的開源庫有
8.1 Speex,ffmpeg,webrtc
-
Android 提供音頻相關的API
9.1 音頻采集:MediaRecoder,AudioRecord
AudioTrack 提供了兩種播放模式,一種是static方式,一種是streaming方式,前者需要一次性将所有資料都寫入播放緩沖區,簡單高效,通常用于鈴聲播放,系統提醒的音頻片段,後者需要按照一定時間間隔不斷寫入音頻資料,理論上可以任何音頻播放的場景。
9.2 音頻播放:SoundPool,MediaPlayer,AudioTrack
9.3 音頻編解碼:MediaCodec
9.4 NDK API:OpenSL ES
-
音頻開發的延時标準
10.1 對于高品質語音可以接受延時為300ms,一般而言,如果時延在300~400ms,通話的互動性比較差,但還可以接受,時延大于400ms時,則互動通信非常困難。