Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 麦克风停止向NAudio提供数据_C#_Naudio - Fatal编程技术网

C# 麦克风停止向NAudio提供数据

C# 麦克风停止向NAudio提供数据,c#,naudio,C#,Naudio,我正在使用NAudio的WaveInEvent录制麦克风数据。它可以正常工作一段时间,但几次之后,它就停止提供输入数据了-DataAvailable回调永远不会用新数据调用 我每次都尝试创建一个新的WaveInEvent,但这并没有解决问题。我还尝试过使用WASAPI输入,它总是调用DataAvailable——使用零字节的数据 如何使用NAudio可靠地从麦克风录制音频 目前,我的代码如下所示: StartRecording() { microphone = new WaveInEve

我正在使用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来描述wave格式外,本项目中没有其他naudio代码

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

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


坦白地说,我得到不同结果的事实严重地暗示NAudio正在做一些不应该在实例之间共享状态的事情,并且查看Codeplex上的源代码,我不确定WTF是否正在进行。

USB麦克风的驱动程序似乎没有正常工作。当通过WIM_数据消息将缓冲区发送给用户时,缓冲区已满。然而,当调用WaveInUnprepreheader时,它仍然在队列中,尽管它实际上刚刚被传递为已满。因此,我认为麦克风的驱动因素最终应该受到谴责


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

您能添加一些代码吗?您在RecordingStopped事件中是否遇到异常?另外,这是USB捕获设备吗?如果是Realtek onboard sound,你更新了驱动程序吗?@MarkHeath:我确实在RecordingStopped中遇到了一个例外,它是一个USB捕获设备。我以前见过NAudio违反访问权限的情况,因为本来应该锁定的东西没有,GC会移动它。但我认为我们早就解决了所有这些问题。也可能是不可靠的驱动程序问题,当然USB设备在使用时可能会断开连接。waveIn API调用生成访问冲突的异常点的堆栈跟踪是否存在?@MarkHeath:它是StartRecording的lambda->RecordThread()->DoRecord()->WaveInBuffer.Reuse()。如果您不想让GC移动内存缓冲区,那么简单地使用诸如heapalloc/heapfree之类的本机分配器来分配它可能会更容易些?USB设备没有断开连接。它是一个带有录音按钮的独立话筒,正是为了响应按钮的按下,调用了上述功能。