WINDOWS SERVER 2016及以下版本中WASAPI捕获共享事件驱动模式

Pre*_*avi 5 shared event-driven audio-capture wasapi

我正在构建一个应用程序来使用 WASAPI 从设备捕获音频,其中使用的所有 API 都支持 Windows Vista 及更高版本的设备。

最初,我使用WASAPI Capture 作为共享计时器驱动模式从设备捕获音频,其中将有一个线程每 0 毫秒从设备捕获音频。它在 Windows Vista 及以上设备中工作的地方。

由于上述方法在 CPU 消耗方面效率不高,并且并非每项都经过优化,因此我尝试使用WASAPI Capture 作为共享事件驱动模式从设备捕获音频,其中仅当数据被系统触发事件时才会捕获音频。可用的。此方法确实完全降低了 CPU 消耗,但在 Windows VISTA 到 Windows Server 2016 设备中不起作用。

Initialization of audio client interface

音频接口使用共享模式初始化,并且给出的流标志用于 AUDCLNT_STREAMFLAGS_EVENTCALLBACK,因为我使用的是事件驱动模式。GetExtensibleMixFormat 方法提供使用 Windows 的 GetMixFormat() 获取的默认混合格式。

int enginelatency = 20;

HRESULT hr = _AudioClient->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_EVENTCALLBACK | AUDCLNT_STREAMFLAGS_LOOPBACK , enginelatency * 10000, 0, (WAVEFORMATEX*)mix_format_wasapicap_ptr->GetExtensibleMixFormat(), NULL);
Run Code Online (Sandbox Code Playgroud)

Initializing the event

其中 _AudioSamplesReadyEvent 是提供给 SetEventHandle 方法的句柄。当音频缓冲区准备好由客户端处理时,系统将触发此事件。

hr = _AudioClient->SetEventHandle(_AudioSamplesReadyEvent);
Run Code Online (Sandbox Code Playgroud)

尽管 Windows VISTA 及以上设备支持所有使用的 API,但无法弄清楚为什么在 Windows VISTA 到 Windows Server 2016 设备中未触发事件。

我已经正确处理了错误,但无法捕获任何错误。另请注意,我使用了 WASAPI 捕获代码,通过将 GetDefaultAudioEndpoint 中使用的 dataFlow 更改为 eRender,进行了一些细微的更改,以便我可以从输出设备而不是麦克风捕获音频,因为 eCapture 捕获输入设备。

在调试时,我发现在 Windows Vista 到 Windows Server 2016 设备中,使用 eCapture 事件时正确触发,但使用 eRender _AudioSamplesReadyEvent 事件时未触发。

任何建议表示赞赏。

Pre*_*avi 1

根据初始化文档,提到事件回调在 Windows 10 以下操作系统版本中不适用于环回流标志。

在此输入图像描述

我使用渲染客户端触发事件来捕获客户端,其中我使用环回标志初始化捕获客户端,并使用事件回调初始化渲染客户端。

触发渲染客户端事件后,我使用捕获客户端从设备捕获音频缓冲区。

这就是我们需要在 Windows 10 以下操作系统中从输出设备捕获音频的方式。