Naudio:如何在不停止所有其他声音的情况下正确删除 AsioOut 播放的几种声音中的一种?

Posted

技术标签:

【中文标题】Naudio:如何在不停止所有其他声音的情况下正确删除 AsioOut 播放的几种声音中的一种?【英文标题】:Naudio: how to properly remove 1 out of several sounds played by an AsioOut without stopping all other sounds? 【发布时间】:2018-03-27 10:18:06 【问题描述】:

我使用AsioOut 是因为需要尽可能减少延迟。由于我一次只能运行 1 个 AsioOut,因此我使用 MixingWaveProvider32 同时播放多个声音。我遇到的问题是我不知道如何在不暂停所有其他声音的情况下正确删除 1 个声音。

我可以轻松地将新的IWaveProvider(在我的情况下为AudioFileReader)添加到MixingWaveProvider32,只需将其添加为输入流,但如果我尝试以与音频开始故障相同的方式删除它(我认为它正在循环最后一个可用的缓冲区)。我可以通过在交换声音之前停止AsioOut 来防止这种情况,但这会带来两个问题:

    所有其他声音也会停止 如果我尝试删除的声音已经自行完成,那么我会在 AsioOut.Stop() 上被软锁定(该方法永远不会完成)。

如何在不遇到这些问题的情况下正确删除 1 个声音?

【问题讨论】:

【参考方案1】:

我自己找到了一个解决方案:通过 WaveChannel32 运行所有声音,然后将它们放入 MixingWaveProvider32,我可以随时添加和删除声音,而不会停止 AsioOut,而不会出现任何音频故障。

【讨论】:

【参考方案2】:

我怀疑这是 MixingWaveProvider32 中的一个错误,因为 WaveBufferArray.Clear 的组合可能无法清除足够的缓冲区,从而导致您描述的故障声音。

我建议你改用MixingSampleProvider,它是MixingWaveProvider32的继承者

【讨论】:

尝试使用MixingSampleProvider 代替,它有同样的问题。移除输入而不停止会导致音频出现故障,并且在音乐结束后停止会导致软锁定。

以上是关于Naudio:如何在不停止所有其他声音的情况下正确删除 AsioOut 播放的几种声音中的一种?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在不停止 iPod 音乐的情况下播放声音?

HTML:如何在不缓冲所有声音数据的情况下从 URL 中间文件开始声音播放

NAudio 拆分 wav 文件问题。其他所有音频文件声音失真,而其他音频文件清晰

在android soundpool中播放新声音时如何停止所有其他以前的声音?

如何在不停止相机馈送的情况下使用闪光灯?

是否可以在不使用 kill 命令的情况下停止 xsp --nonstop 进程?