理解WASAPI声学回声消除(AEC)与回环采集,如何剔除自身应用音频
关于WASAPI环回采集自播音频剔除问题解答
对微软官方表述的理解
WASAPI的环回模式本质是采集指定输出设备的全量混合音频,所有流经该设备的音频流都会被采集到。微软提到它主要用于支持声学回声消除(AEC),指的是环回模式可以无损耗地输出本地扬声器即将播放的所有音频数据,这份数据刚好可以直接作为AEC算法的参考信号输入,不需要开发者额外Hook其他进程的音频流拼接生成参考信号,降低了AEC的实现成本,不代表WASAPI环回模式自带剔除指定音频流的能力。
剔除本应用自播音频的实现方案
- 信号抵消方案:你可以直接将本应用自身要播放的音频流作为参考信号,和WASAPI环回采集到的全量音频做采样点对齐后做信号减法,就能剔除自播音频。操作时需要注意匹配两者的采样率、声道数,同时要校准声卡的输出延迟,保证时间轴对齐才能避免抵消残留。
- 会话级采集方案:如果不需要采集全系统音频,只需要获取其他应用的音频,可以不用全局环回模式,调用WASAPI的
IAudioSessionManager2接口枚举系统所有音频会话,筛选出非本进程的会话单独采集后混合,不会有信号抵消的精度问题。 - 系统API过滤方案:Windows 10 1803及以上版本提供了Application Loopback API,原生支持指定排除特定进程的音频流,采集时系统会自动过滤对应进程的输出音频,不需要额外做信号处理,是目前实现成本最低、效果最稳定的方案。
Chrome getDisplayMedia 无自播音频的实现逻辑
Chrome在Windows平台调用getDisplayMedia采集系统音频时,没有使用默认的全局环回模式,而是直接调用了上述的Application Loopback API,并且将自身进程ID加入了排除列表,所以采集到的音频流会自动剔除Chrome自身播放的所有内容,不会出现自回声问题。如果用户选择采集单个窗口的音频,Chrome还会直接只采集对应窗口所属进程的音频会话,连其他无关应用的音频也不会混入。
内容的提问来源于stack exchange,提问作者TONY
相关产品推荐
相关产品推荐

