为什么 DataAvailable 在 5 秒后停止调用?
Why Does DataAvailable Stop Getting Called After 5 Seconds?
这是我正在深入研究的 C# 编码的一个新领域,所以请原谅我对此的无知。我试图学习更多关于使用 NAudio 进行数字信号处理的知识。我一开始只是尝试创建一个简单的控制台应用程序。使用下面的代码,NAudio "DataAvailable" 事件仅被使用了 5 秒,此时它不再被调用。当数据保存为.WAV文件时,文件长度也只有5秒。
我通过麦克风手动计时语音测试,最多说 "Mississippi 1, Mississippi 2, etc." 10 次,以确保我至少尝试录音超过 5 秒。在 "Mississippi 5" 之后,录制自动停止并触发 "RecordingStopped" 事件。在 "DataAvailable" 事件中,我只是让它将 Guids 写入输出 window 以确保程序仍在 运行ning 但 5 秒后,它停止写入输出控制台。
我是否遗漏了一个步骤来告诉 NAudio 无休止地录音,直到用户触发一个事件然后强制它停止?
这是我尝试使用的代码:
static void Main(string[] args)
{
int deviceCount = WaveIn.DeviceCount;
if (deviceCount > 0)
{
waveFileWriter = new WaveFileWriter(@"F:/" + Guid.NewGuid() + ".wav", new WaveFormat(44100, 24, WaveInEvent.GetCapabilities(deviceCount - 1).Channels));
waveInEvent = new WaveInEvent();
waveInEvent.DeviceNumber = deviceCount - 1;
waveInEvent.WaveFormat = new WaveFormat(44100, 24, WaveInEvent.GetCapabilities(deviceCount - 1).Channels);
WaveInProvider waveIn = new WaveInProvider(waveInEvent);
waveInEvent.DataAvailable += new EventHandler<WaveInEventArgs>(waveInEvent_DataAvailable);
waveInEvent.StartRecording();
}
// used to keep the console window open for testing...
Console.ReadLine();
}
private static void waveInEvent_DataAvailable(object sender, WaveInEventArgs e)
{
if (waveFileWriter == null)
{
return;
}
Console.WriteLine(Guid.NewGuid());
}
private static void waveInEvent_RecordingStopped(Object sender, StoppedEventArgs e)
{
Console.Write("This is getting called automatically after 5 seconds... IDK why???");
}
我希望上面的代码无限期地 运行 直到触发停止记录的事件,但事实并非如此。
谢谢。
更新:
为清楚起见,已将 "waveIn" 变量重命名为 "waveInProvider"。
请参阅来自@Mark Heath 和我本人的上述 post 评论。看来您应该从 WaveInProvider 读取缓冲区,否则它会填满并引发异常。在 "DataAvailable" 回调事件中使用 "waveInProvider.Read(e.Buffer, 0, e.BytesRecorded);" 来防止这种情况发生。
这是我正在深入研究的 C# 编码的一个新领域,所以请原谅我对此的无知。我试图学习更多关于使用 NAudio 进行数字信号处理的知识。我一开始只是尝试创建一个简单的控制台应用程序。使用下面的代码,NAudio "DataAvailable" 事件仅被使用了 5 秒,此时它不再被调用。当数据保存为.WAV文件时,文件长度也只有5秒。
我通过麦克风手动计时语音测试,最多说 "Mississippi 1, Mississippi 2, etc." 10 次,以确保我至少尝试录音超过 5 秒。在 "Mississippi 5" 之后,录制自动停止并触发 "RecordingStopped" 事件。在 "DataAvailable" 事件中,我只是让它将 Guids 写入输出 window 以确保程序仍在 运行ning 但 5 秒后,它停止写入输出控制台。
我是否遗漏了一个步骤来告诉 NAudio 无休止地录音,直到用户触发一个事件然后强制它停止?
这是我尝试使用的代码:
static void Main(string[] args)
{
int deviceCount = WaveIn.DeviceCount;
if (deviceCount > 0)
{
waveFileWriter = new WaveFileWriter(@"F:/" + Guid.NewGuid() + ".wav", new WaveFormat(44100, 24, WaveInEvent.GetCapabilities(deviceCount - 1).Channels));
waveInEvent = new WaveInEvent();
waveInEvent.DeviceNumber = deviceCount - 1;
waveInEvent.WaveFormat = new WaveFormat(44100, 24, WaveInEvent.GetCapabilities(deviceCount - 1).Channels);
WaveInProvider waveIn = new WaveInProvider(waveInEvent);
waveInEvent.DataAvailable += new EventHandler<WaveInEventArgs>(waveInEvent_DataAvailable);
waveInEvent.StartRecording();
}
// used to keep the console window open for testing...
Console.ReadLine();
}
private static void waveInEvent_DataAvailable(object sender, WaveInEventArgs e)
{
if (waveFileWriter == null)
{
return;
}
Console.WriteLine(Guid.NewGuid());
}
private static void waveInEvent_RecordingStopped(Object sender, StoppedEventArgs e)
{
Console.Write("This is getting called automatically after 5 seconds... IDK why???");
}
我希望上面的代码无限期地 运行 直到触发停止记录的事件,但事实并非如此。
谢谢。
更新:
为清楚起见,已将 "waveIn" 变量重命名为 "waveInProvider"。
请参阅来自@Mark Heath 和我本人的上述 post 评论。看来您应该从 WaveInProvider 读取缓冲区,否则它会填满并引发异常。在 "DataAvailable" 回调事件中使用 "waveInProvider.Read(e.Buffer, 0, e.BytesRecorded);" 来防止这种情况发生。