Winapi 如何实时处理麦克风输入?

Winapi 如何实时处理麦克风输入?,winapi,audio,signal-processing,microphone,directsound,Winapi,Audio,Signal Processing,Microphone,Directsound,我开始为我的想法创建一个概念证明,在这一点上,我需要一些关于如何开始的指导 我需要对麦克风输入进行采样,并实时处理该信号(想想自动调谐,但在现场工作),而不是“录制”一段时间 我正在做的是“一种”麦克风输入到MIDI转换器,所以它需要非常快的响应 我在网上做了一点调查,很明显,我们要么使用DirectSound,要么使用WaveIn*API函数。现在,根据我所读到的,WaveIn API将允许我填充一定大小的缓冲区,这对于录制和后处理来说很好,但我想知道。。。如何进行实时处理 我是否使用10毫秒

我开始为我的想法创建一个概念证明,在这一点上,我需要一些关于如何开始的指导

我需要对麦克风输入进行采样,并实时处理该信号(想想自动调谐,但在现场工作),而不是“录制”一段时间

我正在做的是“一种”麦克风输入到MIDI转换器,所以它需要非常快的响应

我在网上做了一点调查,很明显,我们要么使用DirectSound,要么使用WaveIn*API函数。现在,根据我所读到的,WaveIn API将允许我填充一定大小的缓冲区,这对于录制和后处理来说很好,但我想知道。。。如何进行实时处理

我是否使用10毫秒的缓冲区,自己保留一个50毫秒或100毫秒的圆形阵列,并且我得到一个每10毫秒触发一次分析的函数?(可以访问最新的100ms输入,其中只有10ms是新的)

我是不是遗漏了什么


还有,DirectSound是如何做到这一点的?与常规的Win32 API相比,它是否提供了任何改进的功能?

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

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

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

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


还有一些替代API可能更合适。看看内核流媒体(仅适用于XP-我不想麻烦)和Vista中新增的。

很好的解释,但我不确定为什么您认为DirectSound在延迟方面优于waveIn*。对于这两种方法,延迟完全是在处理缓冲区之前记录到缓冲区中的时间的函数。然而,我也推荐DirectSound,因为它是一个更现代的API。我不敢相信waveIn*和waveOut*仍然存在(甚至在Windows Mobile中也可以使用,当我发现它时,这让我大吃一惊),DirectSound具有潜在较低延迟的原因是它能够直接向用户的缓冲区进行DMA拷贝—Wave API不这样做,需要在两者之间进行另一个拷贝。此外,当使用WaveAPI时,您不能独占控制硬件,这可能意味着kmixer开始进行采样率转换或位深度转换。所有这些额外的处理加起来,但与固有的缓冲延迟相比,它可能并不重要。这些因素也可能随着操作系统版本的变化而变化。