调试时 WASAPI 环回捕获中的持续音频不连续性

Roy Li - MSFT 33,371 信誉分 Microsoft 供应商
2024-08-21T03:05:42.05+00:00

我正在编写一个程序,该程序使用 WASAPI 环回捕获来捕获 Windows 设备上的输出。原则上它工作正常,但是每当我尝试调试它时,在从断点继续后,它就会中断。

我可以在 Windows 自己的示例代码中重现此内容:我正在使用 CaptureSharedEventDriven 示例

然后,我按照说明将此演示更改为使用环回,简单来说就是:

  • GetDefaultAudioEndpoint 中将 eCapture 更改为 eRender
  • EnumAudioEndpoints 中将 eCapture 更改为 eRender
  • AUDCLNT_STREAMFLAGS_LOOPBACK添加到 IAudioClient::Initialize 调用

现在,这可以正确捕获音频输出。但是,当我在 CWASAPICapture::Start(...)(样本中的第 262 行)然后继续,从那时起,捕获就变成了垃圾。捕获的音频显示每 1056 个样本的不连续性 (这也是 IAudioClient 的缓冲区大小) ,并且每次迭代都会错过 384 个样本。

我可以通过添加以下调试代码来证明这一点:

[WASAPICapture.cpp, line 358]
hr = _CaptureClient->GetBuffer(&pData, &framesAvailable, &flags, NULL, NULL);
if (SUCCEEDED(hr))
{
   UINT32 framesToCopy = min(framesAvailable, static_cast<UINT32>((_CaptureBufferSize - _CurrentCaptureIndex) / _FrameSize));

   if (framesToCopy != 0)
   {
      //
      // Adding this in order to trace the output issue:
      //
      if (flags & AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY) {
         printf("Discontinuity detected, writing %d samples\n", framesAvailable);
      }

      else {

         printf("Correct render, writing %d samples\n", framesAvailable);

      }

命中断点后,对于捕获的其余部分,输出现在将为:

Discontinuity detected, writing 480 samples
Correct render, writing 480 samples
Discontinuity detected, writing 96 samples
Discontinuity detected, writing 480 samples
Correct render, writing 480 samples
Discontinuity detected, writing 96 samples
Correct render, writing 480 samples
Correct render, writing 480 samples
Discontinuity detected, writing 96 samples
etc... 

如何使 WASAPI 从此错误中恢复?

此问题由: Persistent audio discontinuity in WASAPI loopback capture when debugging - Microsoft Q&A总结而来

Windows API - Win32
Windows API - Win32
一组适用于桌面和服务器应用程序的核心 Windows 应用程序编程接口 (API)。 以前称为 Win32 API。
105 个问题
0 个注释 无注释
{count} 票

1 个答案

排序依据: 非常有帮助
  1. Tong Xu - MSFT 2,471 信誉分 Microsoft 供应商
    2024-08-21T09:26:12.1966667+00:00

    你好,

    欢迎来到 Microsoft Q&A!

    可以在 Windows-classic-samples 问题中报告 CaptureSharedEventDriven 示例的问题,该问题可能未考虑可以合理预期音频引擎已累积大量音频数据的情况。您还可以参考专用的环回示例 ApplicationLoopback


    如果答案是正确的解决方案,请单击“接受答案”并请投赞成票。如果您对此答案有其他疑问,请点击“评论”。

    注意:如果您想接收此线程的相关电子邮件通知,请按照我们文档中的步骤启用电子邮件通知

    0 个注释 无注释

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。