记录一次Android回音消除(二)
链接
助我完成工作的源码链接,感谢作者!
https://github.com/dengzikun/WebRTC-APM-for-Android
我的使用方式
-
初始化参数
public void initAPM() {
if (null == mApm) {
try {
mApm = new Apm(true, true, true, false, true, true, false);
} catch (Exception e) {
e.printStackTrace();
}
mApm.HighPassFilter(true);
mApm.AECMSetSuppressionLevel(Apm.AECM_RoutingMode.LoudSpeakerphone);
mApm.AECM(true);
mApm.NSSetLevel(Apm.NS_Level.VeryHigh);
mApm.NS(true);
mApm.AGCSetMode(Apm.AGC_Mode.AdaptiveDigital);
mApm.AGCEnableLimiter(true);
mApm.AGCSetTargetLevelDbfs(3);
mApm.AGCSetcompressionGainDb(9);
mApm.AGC(true);
mApm.VAD(false);
}
}
-
调用逻辑
// 两个主要函数
// ProcessRenderStream
// ProcessCaptureStream
-
线程A,收远端音频,播放,并且存放起来,用于回音消除的参考
-
线程T,收近端mic数据,取出远端数据,调用ProcessRenderStream;拿mic数据,调用ProcessCaptureStream
-
拿到mic数据的时候,OBJECT A 中可能没有数据,仍然调用ProcessCaptureStream
-
延时
对于我的调用方式,延时时间就是 从OBJECT A中拿出的音频数据播放的时间(音频播放的时候我打了时间按戳) 和 采集到mic数据的时间戳的差值。所以是动态的。
-
问题
- 远段数据的数据由于网络问题,数据可能时有时无
- 近端mic数据一定是连续的,因为是本地采集
- WEBRTC内如果远端数据和近端数据相差过多(具体多少不记得了,几百ms),回音可能无法消除。