为啥 DataAvailable 在 5 秒后停止被调用?
Posted
技术标签:
【中文标题】为啥 DataAvailable 在 5 秒后停止被调用?【英文标题】:Why Does DataAvailable Stop Getting Called After 5 Seconds?为什么 DataAvailable 在 5 秒后停止被调用? 【发布时间】:2019-04-28 19:22:09 【问题描述】:这是我正在深入研究的 C# 编码的一个新领域,所以请原谅我对此的无知。我试图了解更多关于使用 NAudio 进行数字信号处理的知识。我首先尝试创建一个简单的控制台应用程序。使用下面的代码,NAudio“DataAvailable”事件仅使用 5 秒,此时不再调用它。当数据保存为.WAV文件时,文件长度也只有5秒。
我通过麦克风说“密西西比 1、密西西比 2 等”,手动为语音测试计时。最多 10 次,以确保我至少尝试录制超过 5 秒。在“Mississippi 5”之后,录制会自行自动停止并触发“RecordingStopped”事件。在“DataAvailable”事件中,我只是让它将 Guids 写入输出窗口,以确保程序仍在运行,但 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”。
【问题讨论】:
StoppedEventArgs 上有一个异常属性 - 因此您可能需要检查它是否存在导致录制停止的问题 我检查了事件参数。发生“缓冲区已满”异常。从一些研究看来,您应该从中阅读,这不是我正在做的。一旦我添加了“waveInProvider.Read(e.Buffer, 0, e.BytesRecorded);” “DataAvailable”事件的代码行,它连续运行而没有问题。感谢您的帮助! 【参考方案1】:请参阅@Mark Heath 和我本人的上述帖子中的 cmets。看来您应该从 WaveInProvider 读取缓冲区,否则它会填满并引发异常。使用“waveInProvider.Read(e.Buffer, 0, e.BytesRecorded);”在“DataAvailable”回调事件中防止这种情况发生。
【讨论】:
我没有发现WaveInProvider
- 你为什么还需要它?您可以使用WaveInEvent
并订阅它的DataAvailable
我有一个名为“waveIn”而不是“waveInProvider”的 WaveInProvider 变量。我在第一篇文章中更正了原始代码。在这种情况下,我似乎需要 WaveInProvider 来读取缓冲区以防止它填满并触发“BufferFull”异常。以上是关于为啥 DataAvailable 在 5 秒后停止被调用?的主要内容,如果未能解决你的问题,请参考以下文章
MPMoviePlayerController 在 5 秒后停止播放 - Swift
来自 CD 的 Uwamp Mysql Server 在 5 秒后停止运行
为啥只播放 UNNotificationSound 的前 5 秒