AEC 系统筛选器

AEC 系统筛选器(Aec.sys)在软件中实现声学回声消除(AEC)和噪音抑制(NS)算法。 此筛选器是 Windows XP 及更高版本中的标准作系统组件。 有关 DirectSoundCapture 应用程序如何启用 AEC 系统筛选器的信息,请参阅 Microsoft Windows SDK 文档。

AEC 系统筛选器施加的约束

包含 AEC 系统筛选器中实现的捕获效果的音频筛选器图受到以下限制:

  • AEC 系统筛选器只能连接到处理 PCM 数据格式的引脚。

  • 对于捕获流,位深度必须为 16 位,呈现流必须为 8 位或 16 位。

  • AEC 系统筛选器以 16 kHz 执行所有内部处理。 输入和输出流根据需要按源速率进行转换。

  • 在 Windows XP SP1、Windows Server 2003 及更高版本中,AEC 系统筛选器的捕获和呈现引脚(请参阅下图)必须具有相同的采样率,但捕获和呈现引脚的采样率可以独立于其他引脚选择。 捕获引脚的采样率可以是 16 kHz、48 kHz、44.1 kHz 或 8 kHz。 (首选项顺序基于处理时间和音频质量。呈现引脚的采样率可以是 16 kHz、48 kHz 或 44.1 kHz。 请注意,“render-out 引脚”不支持 8 kHz 的采样率。

说明 AEC 系统滤波器引脚及连接的示意图。

  • AEC 和 NS 节点(请参阅 “公开 Hardware-Accelerated 捕获效果”中的图)只能处理单声流。 如果捕获流是多通道(例如双声道立体声),则忽略除第一个通道以外的所有通道(并丢弃)。 只有单声道流才能由呈现端处理。

  • 在 Windows XP SP1、Windows Server 2003 及更高版本中,此限制不存在。 AEC 系统筛选器正确处理捕获和呈现流时钟之间的不匹配情况,并且单独的设备可用于捕获和呈现。

  • 使用 AEC 系统筛选器时, SysAudio 系统驱动程序 关闭硬件加速,以便混合、采样率转换、3D 空间化等。 所有流混合都是在 KMixer 系统驱动程序的软件仿真中完成的。 此限制是必要的,以确保渲染设备播放的所有音频都可以由 AEC 系统筛选器从捕获流中取消。

  • 在图形捕获端的 AEC 或 NS 节点之前或在呈现端的 AEC 或 NS 节点之后完成的任何信号处理都必须是线性时间固定的。 在这些位置之一执行任何非线性或时间变化的信号处理会阻止 AEC 取消捕获信号中的回声。

  • AEC 过滤只取消来自计算机中经过 AEC 过滤通道的回声。 未通过 AEC 通道输出的音频不进行回声消除。 非 AEC 音频通道中的回声在功能上等同于在计算机旁边的办公室的收音机中播放的音频中的回声。 AEC 无法取消来自无线电或非 AEC 通道的回声,并且对此没有任何影响。

上述要求适用于所有内核流式处理音频筛选器图,这些图包含 Aec.sys中实现的捕获效果。 这些限制反映了 AEC 系统筛选器设计和实现中的基本假设。 流格式的约束可能会在将来的 Windows 版本中更改。

使用 AEC 系统筛选器的任何产品设计都应考虑上述约束。 以下问题和答案显示了这些约束如何影响 AEC 筛选行为:

问:我创建了用于立体声渲染的 DirectSound 缓冲区,但在使用 AEC 时,这两个通道听起来都相同。 为什么会这样?

答:AEC 仅适用于单声道流,因此 KMixer 将立体声流混合回单声道以满足此约束。

问:使用 AEC 时,为什么我的 44-kHz、16 位音频听起来像 16 kHz?

答:由于 AEC 系统筛选器以 16 kHz 执行所有内部处理。

问:为什么无法使用 AEC 获取硬件加速的 DirectSound 缓冲区?

答:因为启用 AEC 时,SysAudio 关闭硬件加速混合。

问:AEC 系统筛选器是否适用于我的旧款 Sound Blaster 16 卡?

答:是的。 虽然 Sound Blaster16 卡无法同时管理 16 位渲染和捕获流,但它可以同时管理 8 位呈现流和 16 位捕获流,这是 AEC 系统筛选器的呈现和捕获引脚支持的组合。 新的音频卡应设计为支持至少 16 位的位深度,用于呈现和捕获。

AEC 引脚的数据格式摘要

启用 AEC 系统筛选器的 DirectSound 应用程序可以为其 DirectSound 缓冲区选择 KMixer 支持的任何采样率或样本大小。 KMixer 将数据从应用程序的呈现缓冲区转换为 16-kHz 单声道 16 位格式,然后再进入 AEC 系统筛选器。 同样,KMixer 可以在数据通过 AEC 系统筛选器后,将发送到 DirectSoundCapture 应用程序捕获缓冲区的数据转换为 16-kHz 单声道 16 位格式。 但是,为了最大程度地减少在图形中完成的处理量并达到最高的音频质量,应用程序应对呈现和捕获缓冲区使用 16-kHz 单声道 16 位格式。

如果希望音频硬件使用 AEC 系统筛选器,则硬件呈现引脚必须至少支持 AEC 呈现引脚支持的采样率之一,并且硬件捕获引脚必须支持 AEC 捕获引脚支持的采样率之一。 为了实现最佳的 AEC 性能,硬件除了支持的任何更高的速率外,还应该支持 16-kHz 采样率。 通过支持 16-kHz 速率,硬件无需进行采样率转换,从而减少了 AEC 系统滤波器必须进行的处理量。

AEC 系统滤波器的输入引脚连接到 KMixer 的输出引脚。 KMixer 对其输入流执行必要的转换,使其输入流转换为呈现插针所需的格式。 呈现插针仅支持两种数据格式:

  • 16-kHz 单声道 PCM 格式,样本大小为 16 位

  • 16-kHz 单声道 PCM 格式,样本大小为 8 位

捕获出引脚仅支持一种格式:

  • 16-kHz 单声道 PCM 格式,样本大小为 16 位

如果 DirectSoundCapture 应用程序的缓冲区格式为 16-kHz mono 16 位 PCM,则 AEC 捕获输出引脚可以绕过 KMixer 并直接连接到DSound.DLL(请参阅上图)。 否则,AEC 捕获输出引脚连接到 KMixer,它将 16-kHz 单声道 16 位 PCM 流从引脚转换为应用程序捕获缓冲区使用的任何格式。

AEC 渲染输出引脚可以处理以下任何格式:

  • 具有两个通道的 16-kHz 16 位 PCM (立体声)

  • 具有两个通道的 16-kHz 8 位 PCM

  • 具有两个通道的 48-kHz 16 位 PCM

  • 具有两个通道的 48-kHz 8 位 PCM

  • 具有两个通道的 44.1-kHz 16 位 PCM

  • 具有两个通道的 44.1-kHz 8 位 PCM

呈现输出引脚通过将来自 AEC 节点的单个通道复制到输出流的两个通道,从而生成立体声流。

捕获插针可以处理以下任何格式:

  • 具有任意数量的通道的 16-kHz 16 位 PCM

  • 具有任意数量的通道的 48-kHz 16 位 PCM

  • 具有任意数量的通道的 44.1-kHz 16 位 PCM

  • 具有任意数量的通道的 8-kHz 16 位 PCM

捕获插针仅使用第一个通道,并忽略其他通道(并丢弃)。

所有 AEC 系统筛选器的引脚都使用下表中显示的数据格式参数值。

KSDATARANGE 成员 参数值

MajorFormat

KSDATAFORMAT_TYPE_AUDIO

SubFormat

KSDATAFORMAT_SUBTYPE_PCM

说明符

KSDATAFORMAT_SPECIFIER_WAVEFORMATEX

有关 MajorFormatSubFormat说明符 成员的详细信息,请参阅 KSDATARANGE。 有关使用这三个参数值的 KSDATARANGE_AUDIO 数据范围描述符的示例,请参阅 PCM 流数据范围