我移植了MSDN捕获流示例 - https://msdn.microsoft.com/en-us/library/windows/desktop/dd370800
并将其修改为环回,完全如此处所示 -
https://github.com/slavanap/WaveRec/blob/754b0cfdeec8d1edc59c60d179867ca6088bbfaa/wavetest.cpp
所以我要求持续1秒的录音,而实际持续时间则验证它是1秒。
但是我在这个数据包读取时陷入无限循环,packetLength
总是448
的值(numFramesAvailable
也是448
,我不是确定为什么它永远不会变成0,因为while循环是期待的。
代码是 -
while (packetLength != 0)
{
// Get the available data in the shared buffer.
hr = pCaptureClient->GetBuffer(
&pData,
&numFramesAvailable,
&flags, NULL, NULL);
EXIT_ON_ERROR(hr)
if (flags & AUDCLNT_BUFFERFLAGS_SILENT)
{
pData = NULL; // Tell CopyData to write silence.
}
// Copy the available capture data to the audio sink.
// hr = pMySink->CopyData(pData, numFramesAvailable, &bDone);
// EXIT_ON_ERROR(hr)
hr = pCaptureClient->ReleaseBuffer(numFramesAvailable);
EXIT_ON_ERROR(hr)
hr = pCaptureClient->GetNextPacketSize(&packetLength);
EXIT_ON_ERROR(hr)
}
我的移植代码是ctypes,在这里 - https://github.com/Noitidart/ostypes_playground/blob/audio-capture/bootstrap.js#L71-L180
答案 0 :(得分:1)
我想,微软示例中存在隐藏的错误,似乎在您的情况下发生。代码的内循环处理时间足以使新数据出现在传入的音频缓冲区中,从而使您永远旋转内循环或直到您可以以合适的速度处理传入数据。
因此,我建议在内循环中添加&& !bDone
条件。
while (bDone == FALSE)
{
...
while (packetLength != 0 && bDone == FALSE)
{
...
}
}