文章

记录一次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

aec.jpg

  1. 线程A,收远端音频,播放,并且存放起来,用于回音消除的参考

  2. 线程T,收近端mic数据,取出远端数据,调用ProcessRenderStream;拿mic数据,调用ProcessCaptureStream

  3. 拿到mic数据的时候,OBJECT A 中可能没有数据,仍然调用ProcessCaptureStream

  • 延时

对于我的调用方式,延时时间就是 从OBJECT A中拿出的音频数据播放的时间(音频播放的时候我打了时间按戳) 和 采集到mic数据的时间戳的差值。所以是动态的。

  • 问题

  1. 远段数据的数据由于网络问题,数据可能时有时无
  2. 近端mic数据一定是连续的,因为是本地采集
  3. WEBRTC内如果远端数据和近端数据相差过多(具体多少不记得了,几百ms),回音可能无法消除。
License:  CC BY 4.0