使用 C 在 Windows 上捕获和分析音频

Posted

技术标签:

【中文标题】使用 C 在 Windows 上捕获和分析音频【英文标题】:Capture and analyze audio on windows using C 【发布时间】:2015-07-15 12:32:56 【问题描述】:

我正在构建一个程序,该程序需要录制音频并实时或半实时地对其进行分析(录制短音频位并在一次录制时对其进行分析)。

我编写了用于打开和分析 WAV 文件的代码(使用 libsndfile 库)。

现在我无法编写用于从 PC 麦克风录制的代码并将其保存到缓冲区/WAV 文件中。 我尝试使用此示例 - http://www.techmind.org/wave/。但我不知道如何将录制的缓冲区保存到 WAV 或如何使用录制的数据本身。

项目的要求是用C语言和windows编写。

我正在为此目的寻找一个高效的库。


编辑:在使用以下代码将数据从 16 位转换为双倍后,我设法将数据另存为 WAV:

for (int i = 0; i < size; i += 2)

    int c = (waveIn[i + 1] << 8) | waveIn[i];
    double t = c / 32768.0;
    data[i] = t;

但是,录音非常嘈杂且不清楚。有什么建议吗?


谢谢

【问题讨论】:

我不是 OP,但为什么这被否决了?我对这样的问题很感兴趣 【参考方案1】:

Previous question for saving a WAV file. 答案中有一些建议您可能想要追求。假设您的录制实际正在发生,您可能希望将代码放置在最后的 DO-WHILE 循环中保存录制的数据。

【讨论】:

我会尝试将代码保存在循环中。我确实有使用 libsndfile.h 写入 WAV 文件的成功经验。问题是我无法确定我是否正确“翻译”了采样数据,或者采样数据是否有效。 噪音问题需要过滤解决方案。如果您将麦克风插入 PC,则使用运算放大器创建多极陷波有源滤波器的可能性不大。 link 网站的作者很好地解释了这个概念。【参考方案2】:

经过大量修补和测试,我放弃了为此使用 Windows API 并决定使用PortAudio。 他们有几个例子可以解决这个问题。 我采用了其中一个 PA 示例并对其进行了修改以使其适合我的需要,并将其与基于 libsndfile 的函数结合为 saving WAV files。 这是一个很棒的低级解决方案。

此外,如果有人正在寻找高级音频录制解决方案(无法控制采样率等),我推荐MCI based solution。

谢谢:)

【讨论】:

以上是关于使用 C 在 Windows 上捕获和分析音频的主要内容,如果未能解决你的问题,请参考以下文章

从声卡 windows xp 捕获音频数据

我将如何以编程方式捕获内部音频?

是否可以使用 ffmpeg 从 ASIO 设备捕获音频?

如何使用 Windows MediaCapture API 捕获“仅音频”?

WASAPI 在 Windows 上捕获的缓冲区大小

如何从相机(或网络摄像头)在 python 中捕获视频(和音频)