我正在编写一个程序,该程序使用 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总结而来