麦克风停止使用NAudio提供数据

时间:2015-01-23 10:59:03

标签: c# naudio

我使用WaveInEvent NAudio来记录麦克风数据。它工作正常一段时间,但经过几次,它停止提供输入数据 - 永远不会使用新数据调用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正在继续。

1 个答案:

答案 0 :(得分:1)

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

我一直在密切关注麦克风,看来这个特定的单位实际上已经被损坏了。