BY http://blog.csdn.net/ranxiedao 謝絕轉載!
上一篇文章中詳細講述了 ilbc 在Android平臺的移植和編譯,現轉到Java層,實現音頻的採集和處理操作,本示範中的程序流程圖如下:
順便提一下:因爲是在Ubuntu下寫的博客,所以沒有一個現成的工具來繪製流程圖,後來網上找到一個在線繪圖網站:
http://creately.com/ 感覺非常不錯,繪製功能強大,推薦給大家,需要註冊才能使用。
圖解:
1. 發送端有三個主要的類:AudioRecorder(負責音頻採集),AudioEncoder(負責音頻編碼),AudioSender(負責 將編碼後的數據
發送出去); 這三個類中各有一個線程,錄製開始後,這三個線程一起運行,分別執行各自的任務, AudioRecorder採集音頻後,添加到
AudioEncoder 的音頻數據的List中,而AudioEncoder 的編碼線程不斷從List頭部取出數據,調用 ilbc 的底層\函數進行編碼,編碼
後的數據則又添加到下一級的AudioSender的 List中,AudioSender又不斷從頭部取出數據,然後發送出去;
2. 使用Android 系統自帶的 AudioRecord 這個類來實現音頻數據的採集,注意要在AndroidManifest.xml文件中加上權限
android.permission.RECORD_AUDIO ,使用 AudioRecord 時,一定要配置好一些音頻參數,比如採樣頻率, 採樣格式等,具體將在
後續代碼中詳細寫出;採集方法是 AudioRecord 中的 read(samples, 0, bufferSize) ;
3. AudioEncoder 對數據編碼一次後,交付給AudioSender 讓其發送到服務器,發送方採用 UDP 協議,採集一次數據 長度爲960B,
編碼後長度爲100B ,所以一個 UDP 包就非常小,既節省帶寬,又減少丟包率;
4. 接收端有三個主要的類:AudioReciever(負責接收UDP 包),AudioDecoder(負責解碼音頻),AudioPlayer(負責音頻播放),
大致流程 在上圖中已經詳細給出,這裏不做說明了,只不過就是 發送方流程的逆序。播放音頻使用的是Android中的AudioTrack 這個類,
使用write(byte[] data , int sampleOffset ,int sampleLength) 方法能夠直接播放音頻數據流;
5. 發送方有三個線程,接受方也有三個線程,一一對應,下一篇正式開始貼代碼 ;