【问题标题】:How do I process the microphone input in real-time?如何实时处理麦克风输入?
【发布时间】:2010-09-20 11:43:38
【问题描述】:

我开始为我的想法创建概念验证,此时,我需要一些关于如何开始的指导。

我需要对麦克风输入进行采样,并实时处理该信号(想想 Auto-Tune,但可以实时工作),而不是“录制”一段时间。

我正在做的是“一种”“麦克风输入到 MIDI 转换器”,因此它需要快速响应。

我在网上调查了一下,显然要走的路是 DirectSound 或 WaveIn* API 函数。现在,根据我阅读的内容,WaveIn API 将让我填充一定大小的缓冲区,这对于录制和后期处理来说是很好的,但我想知道......我如何进行实时处理?

我是否使用 10ms 缓冲区并自己保持一个 50ms 或 100ms 循环数组,并且我得到一个每 10ms 触发一次分析的函数? (可以访问最近100ms的输入,其中只有10ms是新的)

我错过了什么吗?

另外,DirectSound 是如何做到的?与常规 Win32 API 相比,它是否为我提供了任何改进的功能?

【问题讨论】:

    标签: winapi audio signal-processing microphone directsound


    【解决方案1】:

    DirectSound 和 Wave API 最终都会为您提供填充了您可以处理的音频数据的缓冲区。这些缓冲区的大小可以变化,但实际上您需要将延迟保持在 10 毫秒以下才能进行有用的实时处理。这意味着在数据到达缓冲区的 10 毫秒内处理数据,减去数据到达音频硬件和到达缓冲区之间的时间,这取决于驱动程序。因此,我建议一次处理的数据不超过 5 毫秒。

    两者之间的主要架构区别在于,使用 DirectSound,您分配一个循环缓冲区,然后由 DirectSound 音频驱动程序填充,而 Wave API 采用预先分配的 WAVEHDR 缓冲区队列,这些缓冲区被填充、返回到应用程序和然后回收。两种 API 都有多种通知方法,例如窗口消息或事件。但是,对于低延迟处理,建议维护一个专用的流式处理线程并等待新数据到达。

    出于各种原因,我会推荐 DirectSound 而不是 Wave API 进行新开发 - 它肯定会更容易实现更低的延迟。

    无论您选择哪种方法进行捕获,一旦您获得数据,您只需将其传递给您的处理算法并等待下一个缓冲区准备就绪。只要您能够比数据更快地处理数据,那么您就可以进行(伪)实时分析。

    还有可能更合适的替代 API。看看ASIO、内核流(仅适用于 XP - 我不会打扰)以及 Vista 中的新功能Core Audio APIs

    【讨论】:

    • 很好的解释,但我不确定为什么您认为 DirectSound 在延迟方面优于 waveIn*。使用这两种方法,延迟纯粹是您在处理之前记录到缓冲区中的时间的函数。但是,我也推荐 DirectSound,因为它是一个更现代的 API。我不敢相信 waveIn* 和 waveOut* 仍然存在(它们甚至在 Windows Mobile 中可用,当我发现它时让我大吃一惊)。
    • 据我了解,DirectSound 具有潜在较低延迟的原因是它能够将直接 DMA 复制到用户的缓冲区 - Wave API 不这样做,并且需要另一个副本之间。此外,当使用 Wave API 时,您无法独占控制硬件,这可能意味着 kmixer 开始进行采样率转换或位深度转换。所有这些额外的处理加起来,但是,与固有的缓冲延迟相比,它可能并不重要。这些因素也可能随操作系统版本而变化。
    猜你喜欢
    • 1970-01-01
    • 2023-01-31
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多