我使用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正在继续。答案 0 :(得分:1)
似乎USB麦克风的驱动程序运行不正常。当缓冲区通过WIM_DATA消息发送给用户时,它已满。但是当调用waveInUnprepareHeader时,它仍然在队列中,即使它实际上只是作为完整传递。所以我认为麦克风的驱动程序最终应该受到责备。
我一直在密切关注麦克风,看来这个特定的单位实际上已经被损坏了。