麦克风停止向 NAudio 提供数据

Microphone stops providing data with NAudio

我正在使用 NAudio 中的 WaveInEvent 来记录麦克风数据。一段时间后它工作正常,但几次后,它停止提供输入数据 - DataAvailable 回调永远不会用新数据调用。

我每次都尝试创建一个新的 WaveInEvent,但这并没有解决问题。我也尝试过使用 WASAPI 输入,它总是调用 DataAvailable - 数据为零字节。

如何使用 NAudio 可靠地从麦克风录制音频?

目前,我的代码如下所示:

StartRecording() {
    microphone = new WaveInEvent();
    microphone.DeviceNumber = 0;
    microphone.WaveFormat = outformat;
    microphone.BufferMilliseconds = 50;
    microphone.DataAvailable += (_, recArgs) =>
    {
        session.OnAudioData(recArgs.Buffer, recArgs.BytesRecorded);
    };
    microphone.StartRecording();
}
StopRecording() {
    if (microphone != null)
    {
        microphone.StopRecording();
        microphone.Dispose();
        microphone = null;
    }        
}

项目中除了使用 WaveFormat 描述波形格式外,没有其他的 naudio 代码。

NAudio 试图从线程池工作者调用 WaveInBuffer.Reuse() 时引发访问冲突异常。我不确定为什么这不会做比丢弃音频数据更严重的事情。

对于我没有重新创建 WaveInEvent 的情况,我得到了一个 MmException - 在同一个地方调用 waveInPrepareHeader 的句柄无效。

坦率地说,我得到不同结果的事实在很大程度上意味着 NAudio 正在做一些时髦的事情,它不应该在实例之间共享状态,并且查看 Codeplex 上的源代码,我不确定 WTF 是否会继续上。

似乎 USB 麦克风的驱动程序运行不正常。当缓冲区通过 WIM_DATA 消息发送给用户时,它已满。然而,当 waveInUnprepareHeader 被调用时,它仍然在队列中,即使它实际上只是作为完整传递。所以我认为麦克风的驱动程序是最终的罪魁祸首。

我一直在仔细观察麦克风,似乎这个特定的单元实际上已经损坏。