-1

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

非常感谢您的宝贵指导

提前致谢

4

1 回答 1

0

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

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

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

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

于 2013-08-01T05:34:39.710 回答