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。 请注意,呈现输出引脚不支持采样率 8 kHz。

Diagram illustrating an AEC system filter's pins and connections.

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

  • 在 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 卡?

A:是的。 尽管 Sound Blaster16 卡无法同时管理 16 位呈现流和捕获流,但它可以同时管理 8 位呈现流和 16 位捕获流,这是 AEC 系统筛选器的呈现输出和捕获输入引脚支持的组合。 应将新的音频卡设计为针对呈现和捕获至少支持 16 位的位深度。

AEC 引脚的数据格式摘要

启用 AEC 系统筛选器的 DirectSound 应用程序可以为其 DirectSound 缓冲区选择 KMixer 支持的任何采样率或样本大小。 KMixer 将数据从应用程序的呈现缓冲区转换为 16-kHz 单声道 16 位格式,然后再进入 AEC 系统筛选器。 同样,在数据离开 AEC 系统筛选器后,KMixer 可以将目标为 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 单声道 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

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