环回录制

在环回模式下,WASAPI 客户端可以捕获呈现终结点设备正在播放的音频流。 要在环回模式下打开流,客户端必须:

  • 获取呈现终结点设备的 IMMDevice 接口。
  • 在呈现终结点设备上以环回模式初始化捕获流。

完成这些步骤后,客户端可调用 IAudioClient::GetService 方法,以获取呈现终结点设备上的 IAudioCaptureClient 接口。

WASAPI 提供环回模式主要是为了支持声学回声消除 (AEC)。 但是,其他类型的音频应用程序可能会发现环回模式对于捕获音频引擎正在播放的系统混合非常有用。

捕获流中的代码示例中,可以轻松修改 RecordAudioStream 函数,以配置环回模式捕获流。 需要进行的修改包括:

在 Windows 10 版本 1703 之前的 Windows 版本中,当使用事件驱动缓冲初始化流并启用回环时,拉取模式捕获客户端不会接收任何事件。 要解决此问题,可以在事件驱动模式下初始化一个呈现流。 客户端每次接收到呈现流的事件时,都必须向捕获客户端发出信号,以运行可从捕获终结点缓冲区读取下一组样本的捕获线程。 在 Windows 10 版本 1703 及更高版本中,支持事件驱动环回客户端,不再需要采用涉及呈现流的变通方法。

客户端只能为共享模式流 (AUDCLNT_SHAREMODE_SHARED) 启用环回模式。 独占模式流无法在环回模式下运行。

WASAPI 的环回功能取决于硬件的能力。 如果硬件支持呈现终结点上的环回引脚,则 WASAPI 就会将该引脚上提供的音频用于环回流。 当硬件不支持环回引脚时,除了将音频数据复制到硬件的呈现引脚外,WASAPI 还会将音频引擎的输出流复制到环回应用程序的捕获缓冲区。

某些硬件供应商在其音频适配器中采用了环回设备(而不是呈现设备上的引脚实例)。 虽然硬件环回设备在操作上与 WASAPI 环回模式类似,但使用起来可能更加困难。

对于音频应用程序而言,硬件环回设备存在以下缺点:

  • 并非所有音频适配器都带有环回设备。 因此,依赖于它们的应用程序无法在所有系统上运行。
  • 在应用程序从环回设备录制之前,用户必须识别环回设备并启用它。

不同供应商为其硬件环回设备指定了不同的名称。 以下是名称示例:

  • 立体声混音
  • 波形输出混音
  • 混合输出
  • 听到的声音

缺少标准化名称可能会导致用户难以在设备名称列表中识别环回设备。

硬件环回设备是一种捕获设备。 因此,如果适配器支持环回设备,音频应用程序就可以像从其他捕获设备录制一样从该设备录制。

例如,如果选择硬件环回设备作为默认捕获设备,则可以使用捕获流代码示例中的 RecordAudioStream 函数(无需修改)来捕获该设备的流。 (也可以使用传统的音频 API,如 Windows 多媒体 waveInXxx 来从设备上捕获音频流。)

如果音频适配器包含硬件环回设备,则可以使用 Windows 多媒体控制面板 Mmsys.cpl 将该设备指定为默认捕获设备。 步骤如下:

  1. 若要运行 Mmsys.cpl,请打开命令提示符窗口,然后输入以下命令:

    control mmsys.cpl
    

    或者,可以通过右键单击位于任务栏右侧通知区域中的扬声器图标并选择“录制设备”来运行 Mmsys.cpl。

  2. 打开 Mmsys.cpl 窗口后,右键单击录制设备列表中的任意位置,检查是否勾选了“显示已禁用的设备”选项。 (否则,如果环回设备已被禁用,则它不会出现在列表中。)

  3. 浏览录制设备列表以查找环回设备(如果存在)。 如果环回设备已被禁用,请右键单击该设备并单击“启用”将其启用。

  4. 最后,要选择环回设备作为默认捕获设备,请右键单击该设备并单击“设置为默认设备”。

无论音频硬件是否包含环回设备,也无论用户是否启用了环回设备,WASAPI 都支持环回录制。

Windows Vista 提供数字版权管理 (DRM)。 内容提供商依靠 DRM 来保护其专有音乐或其他内容免遭未经授权的复制和其他非法使用。 同样,受信任的音频驱动程序不允许回环设备捕获包含受保护内容的数字流。 Windows Vista 只允许受信任的驱动程序播放受保护的内容。 有关受信任的驱动程序和 DRM 的详细信息,请参阅 Windows DDK 文档。

WASAPI 环回默认包含播放的所有音频的混合,而不管音频源自的终端服务会话如何。 例如,可以在会话 0 中运行的服务中运行环回客户端,捕获所有用户会话的音频以及会话 0 播放的音频。

从 Windows 10 内部版本 20348 开始,可以通过在调用 IMMDevice::Activate 中传递 AUDIOCLIENT_ACTIVATION_PARAMS 来包括或排除特定进程及其子进程及其子级。 请参阅应用程序环回音频捕获示例

远程桌面允许将音频重定向到客户端。 具体做法是创建只在该会话中出现的新音频设备。

流管理