NAudio中WaveInEvent的DataAvailable事件未触发问题求助
WaveInEvent的DataAvailable事件未触发排查与解决
问题场景
基于net6.0-windows的控制台应用中,使用NAudio 2.1.0的WaveInEvent进行录音时,DataAvailable事件始终无法触发。已尝试遍历所有可用音频设备,问题仍未解决。
相关代码
初始化WaveInEvent的代码:
_msWaveInput = new() { DeviceNumber = validDeviceNumber, WaveFormat = new NAudio.Wave.WaveFormat(rate: 48000, bits: 16, channels: 2), NumberOfBuffers = 1, BufferMilliseconds = bufferSizeMs }; _msWaveInput.DataAvailable += WaveIn_DataAvailable; _msWaveInput?.StartRecording(); private void WaveIn_DataAvailable(object? sender, WaveInEventArgs e) { // 从未触发! }
项目配置
<PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net6.0-windows</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <Platforms>AnyCPU;x64</Platforms> </PropertyGroup>
NAudio版本
<PackageReference Include="NAudio" Version="2.1.0" />
已尝试操作
遍历所有可用设备编号逐一测试:
for (int i = -1; i < NAudio.Wave.WaveIn.DeviceCount; i++) { // i为设备编号,已全部试过! }
解决方案
针对控制台应用中WaveInEvent事件不触发的问题,可从以下方向排查修复:
- 阻止主线程退出:控制台程序启动录音后,若主线程直接结束,WaveInEvent的后台线程会被终止,事件自然无法触发。在
StartRecording()后添加阻塞逻辑,比如Console.ReadLine()或new ManualResetEvent(false).WaitOne(),让程序保持运行状态。 - 适配设备支持的音频格式:部分设备可能不支持48000Hz、16位双声道的格式。通过
WaveIn.GetCapabilities(i)获取设备的支持参数,选择匹配的格式初始化WaveFormat,比如改用更通用的44100Hz采样率。 - 调整缓冲区设置:
NumberOfBuffers = 1容易引发缓冲区策略异常,建议设置为2或3(NAudio推荐的默认值),提升录音稳定性。 - 确保对象生命周期:
_msWaveInput必须是类级别的成员变量,不能是局部变量。如果是局部变量,初始化后可能被GC回收,导致事件无法触发。
示例修改代码:
_msWaveInput = new() { DeviceNumber = validDeviceNumber, WaveFormat = new NAudio.Wave.WaveFormat(rate: 44100, bits: 16, channels: 2), NumberOfBuffers = 2, BufferMilliseconds = 100 }; _msWaveInput.DataAvailable += WaveIn_DataAvailable; _msWaveInput.StartRecording(); Console.WriteLine("正在录音,按任意键停止..."); Console.ReadLine(); // 阻塞主线程 _msWaveInput.StopRecording(); _msWaveInput.Dispose();
内容的提问来源于stack exchange,提问作者James Harcourt
相关产品推荐
相关产品推荐

