Android上的音質一直被大家所困擾和詬病,這里面有很多原因,
下面是最近一位前UC同行發郵件跟我交流的一些記錄,供參考,支持原創,文章來自博客園RTC.Blacker,轉載請說明出處.
以下文字來自郵件,為便於閱讀和理解,略有整理:
"Blacker,您好,本人一直從事音視頻算法的處理與研究,包括H264視頻,語音抑制,回音消除,噪音處理等分支。最近已經轉向webrtc了,對webrtc也算是相對熟悉了。不過我在利用webrtc模塊來開發時,遇到了一個音頻采集的問題。不知道你是否遇到了,你們是否有相關的處理方法呢。
webrtc在pc和ios手機端,效果可以說是非常的好,但是在android手機端,效果就不怎么樣了,語音斷斷續續的,效果很差,造成這個的其中一個因素就是AECM和AGC,噪音消除等這些模塊造成的,我也仔細研究過這些算法的底層羅輯,發現下面的算法很多地方的初始值就是取一個經驗值,這些值的大小影響最終效果,難怪蘋果和pc設備的效果那么好,因為這些經驗值很可能就是針對pc和蘋果手機的。由於android手機設備種類繁多,所以不同的設備喇叭和麥克風不同導致效果差異太大。
當然這些我還可以修改底層的語音算法來優化,但是android端,有一個問題我始終沒有頭緒,就是音頻部分的采集問題。基本上所有android手機,采集出來的音頻數據就是不完整的,偶爾斷斷續續,加上后續音頻的處理,經過處理后的效果就更差了。底層的音頻采集,用了opensles來實現,當然他還提供了回調上層java來實現采集的模塊,用一個開關WEBRTC_ANDROID_OPENSLES就可以打開,這些底層采集出來的語音都是有問題的。
用webrtc自帶的webrtcdemo就可以測試出來,特別是關掉視頻后,只開音頻的話,問題更明顯.采集部分的代碼我也看過,里面有一個緩沖大小設置,這個調大后也是作用不大的。當然我也寫單獨的demo來測試,如果我不調用StartReceive和StartPlayout,而只是調用StartSend,那個采集出來的音頻就是非常完整的,效果也非常好的,前兩者只是開啟了接收監聽和播放線程,它和startsend開啟的采集線程根本就是毫不相關的,為什么就相互影響了呢。
所以我有時候懷疑webrtc的架構是不是有問題呢?
這個問題一直都沒有頭緒,你在webrtc接觸比我久,經驗比我豐富很多,接觸的牛人也多得多,我想咨詢一下你們是怎么處理底層的聲音采集問題呢,只要把這個問題解決了,android手機端的音頻效果一定會提高50%以上,那可是質的飛躍啊。盼望你能回復,一起探討一下這個問題怎么解決,謝謝了。 "
------------------------------------------------以下是我的回復:
"您好,您的問題描述得很詳細,分析也很准確,說明您在這方面確實頗有研究.