使用MixingSampleProvider对接WasapiOut实现低延迟播放报错如何解决?
这个方案是被支持的,你遇到的报错是音频格式不匹配导致的,和使用MixingSampleProvider无关,以下是具体解决方法:
报错根因
你遇到的0x88890003错误对应AUDCLNT_E_UNSUPPORTED_FORMAT,无论是共享还是独占模式,WasapiOut都要求输入的音频格式和当前选中设备支持的格式完全匹配,你硬编码44.1kHz单声道IEEE浮点格式,和设备实际支持的格式不符,才会触发报错。
共享模式解决方法
共享模式下系统会强制所有音频流使用声卡的默认共享格式,你需要先读取设备的默认格式,再把混音器的输出格式对齐:
- 首先通过
selectedDevice.AudioClient.MixFormat获取当前设备共享模式的标准格式 - 把你的MixingSampleProvider的WaveFormat改成和上述格式完全一致,如果你的各路输入流格式和该格式不一致,需要在输入混音器前先做重采样转换
独占模式解决方法
独占模式下不能硬编码格式,需要先枚举设备支持的所有独占格式,选匹配你需求的再使用:
- 调用
selectedDevice.AudioClient.GetSupportedFormats(AudioClientShareMode.Exclusive)枚举所有可用独占格式 - 从枚举结果里优先选符合你需求的格式(比如优先IEEE浮点、采样率尽量接近44.1kHz、声道数符合你的混音要求)
- 用选中的格式初始化MixingSampleProvider,再初始化WasapiOut
低延迟优化建议
你当前代码里禁用了事件同步,低延迟场景下建议开启:把WasapiOut构造函数的第三个参数改成true,可以有效降低播放抖动和延迟。
修改后的参考代码
// 先获取设备支持的格式,这里以共享模式为例,独占模式替换为枚举后的格式即可 var deviceFormat = selectedDevice.AudioClient.MixFormat; // 确保混音器格式和设备格式完全一致 this.mixer = new MixingSampleProvider(deviceFormat) { ReadFully = true }; try { // 开启事件同步,降低延迟 using (this.audioOut = new WasapiOut(selectedDevice, AudioClientShareMode.Shared, true, 25)) { this.audioOut.Init(this.mixer); this.audioOut.Play(); } } catch (Exception e) { Console.WriteLine(e); throw; }
内容的提问来源于stack exchange,提问作者TheLever
相关产品推荐
相关产品推荐

