如何处理来自 WASAPI 流的声音数据块而不将它们写入文件?

Posted

技术标签:

【中文标题】如何处理来自 WASAPI 流的声音数据块而不将它们写入文件?【英文标题】:How can I process chunks of sound data from a WASAPI stream without writing them to a file? 【发布时间】:2013-11-11 04:44:57 【问题描述】:

我对 WASAPI 相当陌生,我正在尝试用 C++ 编写一个程序,该程序查看主播放设备上的音频流并通过 fftw3 对每个块执行 FFT,对结果进行处理,然后丢弃块。到目前为止,我在 WASAPI 和 fftw3 上找到的每个示例都涉及写入文件然后打开该文件。是否可以直接处理 WAVE 块?

【问题讨论】:

听起来你的问题全是FFTW,和WASAPI无关? 我想更多的是我想知道 WASAPI 如何返回 RIFF 块,以及处理这些块我需要知道什么。 【参考方案1】:

WASAPI 音频捕获通常用“刚刚捕获的”音频数据填充内存缓冲区,并将它们传递回控制应用程序。 “不写入文件” - 这是它首先工作的方式。将数据写入媒体文件需要额外的努力,无论是否压缩。

您可能对以下Windows SDK samples 感兴趣:

CaptureSharedEventDriven - 此示例应用程序使用核心音频 API 从用户指定的输入设备捕获音频数据,并将其写入当前目录中唯一命名的 .WAV 文件。此示例演示了事件驱动的缓冲。 CaptureSharedTimerDriven - 此示例应用程序使用核心音频 API 从用户指定的输入设备捕获音频数据,并将其写入当前目录中唯一命名的 .WAV 文件。此示例演示了计时器驱动的缓冲。

两者都向您展示了数据如何从 API 通过内存缓冲区传输到文件。您可以在从 API 获取数据时应用 FFT,然后再将其转到示例中的文件。

【讨论】:

以上是关于如何处理来自 WASAPI 流的声音数据块而不将它们写入文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理来自 websocket 流的数据并有条件地在 Azure Bot 中发送主动消息?

使用 python 执行 PL/PGSQL 块而不将它们存储到数据库中

如何处理巨大的表格[关闭]

如何处理 Spring 集成流的事务(Java DSL)

如何逐行读取大型文本文件,而不将其加载到内存中?

如何从终端执行php块而不保存到文件