制作音效板选择音频捕获设备触发COMException错误求助
制作音效板时,选择音频捕获设备触发以下COM异常:
System.Runtime.InteropServices.COMException
HResult=0x88890003
Message=0x88890003
Source=NAudio.Wasapi
StackTrace:
at NAudio.CoreAudioApi.AudioClient.get_AudioRenderClient()
at NAudio.Wave.WasapiOut.Init(IWaveProvider waveProvider)
at SoundFish.Form1.listBoxSounds_SelectedIndexChanged(Object sender, EventArgs e) in C:\Users\user\source\repos\SoundFish\SoundFish\Form1.cs:line 183
at System.Windows.Forms.ListBox.OnSelectedIndexChanged(EventArgs e)
at System.Windows.Forms.ListBox.WmReflectCommand(Message& m)
at System.Windows.Forms.ListBox.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, WM msg, IntPtr wparam, IntPtr lparam)
已尝试更换捕获设备、重启电脑、关闭占用麦克风的应用,问题仍存在。
修正设备类型匹配错误
错误堆栈显示代码调用了WasapiOut(音频渲染输出类)的初始化方法,但当前操作的是捕获设备。需确认代码是否误将捕获设备当作渲染设备处理:捕获设备应使用WasapiCapture或WasapiLoopbackCapture类,而非WasapiOut。实时枚举有效设备
不要缓存设备列表,每次选择设备前重新枚举活跃的音频捕获设备,避免使用已失效的设备实例。示例代码:var enumerator = new MMDeviceEnumerator(); var activeCaptureDevices = enumerator.EnumerateAudioEndPoints(DataFlow.Capture, DeviceState.Active); // 用最新的活跃设备列表更新选择框添加设备状态与格式检查
在初始化音频客户端前,先验证设备状态和格式兼容性,避免调用无效的设备接口:if (audioClient.Device.State == DeviceState.Active && audioClient.IsFormatSupported(AudioClientShareMode.Shared, targetWaveFormat)) { // 执行后续初始化逻辑 } else { // 提示设备不可用或格式不支持 }升级NAudio版本
旧版本NAudio存在部分设备兼容性BUG,升级至最新稳定版可修复已知的COM交互问题。检查系统音频权限
确认应用已获得麦克风访问权限(Windows设置→隐私和安全性→麦克风),同时关闭后台所有占用音频会话的进程(如录屏软件、语音助手)。
内容的提问来源于stack exchange,提问作者NightWalker

