1. 程式人生 > >Webrtc 迴音消除 一

Webrtc 迴音消除 一

Webrtc的Aec模組除錯迴音消除已經快一個月了,今天有了一個小的突破,終於Demo可以成功消除迴音了!!!

步奏:

//*********************************************************************************//

1、首先下載webrtc原始碼提取Aec模組,編寫Android.mk或Makefile編譯不多說

//*********************************************************************************//

//*********************************************************************************//


2、編寫Demo程式單獨除錯Aec介面。

a:可以驗證介面

b:有了成功的Demo做樣板再往裝置移植不會出現茫然的除錯

//*********************************************************************************//

//*********************************************************************************//

3、Demo程式除錯成功,往真實裝置移植

a:要考慮真實裝置的speaker和mic資料延時(延時值是AEC的核心,移動端最重要的值就是這個aecdelay)

b:要考慮speaker和mic執行緒的同步

c:要考慮speaker和mic儲存佇列要對齊(這個佇列也是很有講究的,維護佇列長度是個除錯值,大於此維護長度幹嘛,小於此維護長幹嘛)

d:要考慮到資料型別轉換(char、float和short)

e:要考慮網路傳輸而來的speaker資料質量差的問題(這是一個很難得攻克點,需要新增佇列通過演算法排序speaker資料)

//*********************************************************************************//

下面記錄一下近期除錯的一些心得

//*********************************************************************************//

AEC函式描述:

//*********************************************************************************//

//儲存遠端資料即speak資料,也可以成為回聲的原始資料(far_frame)

EWebRtcAEC_BufferFarend(handleAec, far_frame, NN)

//*********************************************************************************//

//*********************************************************************************//

//回聲消除,near_frame為mic資料(double talk包含回聲和錄入聲音)aecout_frame為輸出資料

//near_frame中的迴音能量應該遠小於far_frame和錄入聲音的能量,才能正常消除。否則Aec無法精確判斷誰是迴音誰是錄入聲音,從而把錄入聲音一起消除

//aecdelay為speaker和mic的延遲時間

1、當裝置為固定硬體平臺aecdelay可以為固定值(比如我們的裝置端)

2、當裝置不固定,則aecdelay需要通過EWebRtcAEC_GetDelayMetrics計算(比如我們的客戶端在手機上,手機硬體平臺不固定)

EWebRtcAEC_Process(handleAec,near_frame,1, aecout_frame,NN,aecdelay,0);

//*********************************************************************************//

//*********************************************************************************//

//引數描述:median為平均值,std為方差,delay的取值主要來源於median

EWebRtcAEC_GetDelayMetrics(handleAecDelay,median,std,frac)

//*********************************************************************************//