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 事件时未触发。
任何建议表示赞赏。
归档时间: |
|
查看次数: |
175 次 |
最近记录: |