使用naudio动态播放音频文件

时间:2013-07-30 19:29:10

标签: c# multithreading audio naudio

我正在处理一个将从另一个系统获取输入的项目。输入可以是表格参数(整数值)的信号。我的应用程序将根据输入值动态播放不同的声音。例如,当程序获取参数值2时,它应该播放声音A和B并行的2个文件。我可以和naudio同时播放声音,但到目前为止它们都是硬编码的。我需要从一个可以有N个声音的文件夹中播放声音。如果我得到值2,有可能某种方式选择和播放只包含A和B的文件动态发声吗?但是如果我得到参数值3,那么情况会有所不同,例如我想播放一个声音C.请告诉我任何一段代码或想法,帮助我编写一个像这样做的算法?

我非常感谢您的宝贵指导

提前致谢

1 个答案:

答案 0 :(得分:0)

您需要一个混音器对象来组合源文件中的波形数据,并生成可以输入到WaveOut实例的输出波形。 NAudio中有一些混音器:MixingWaveProvider16WaveMixerStream32MixingSampleProvider。这些将帮助您将源文件中的波形数据组合成一个可以播放的复合波形。

另一个选项是实现一个IWaveProvider,它将处理多个输入并以所需格式混合到单个输出流。在这种情况下,您将有一个输出缓冲区和一个要混合的输入流/缓冲区列表。当输出缓冲区中需要更多数据时,它会动态混合源数据,可能使用提供的混合器类之一。

我个人建议你自己编写混音器。这是一项很好的锻炼,可以让你更好地了解正在发生的事情。

如果要混合16位流,则需要使用32位缓冲区进行混合,因为两个16位输入相加可以产生大于16位值的值。输入的输入越多,超出有效范围的可能性就越大。有几种方法可以解决这个问题。将输出限制在Int16.MinValueInt16.MaxValue之间是一种快速而恶劣的方法,可能对您有用。尽管看起来很诱人,但我建议你不要尝试平均样品......它会使输出的整体动态范围降低太多。