使用 naudio 动态播放音频文件
Posted
技术标签:
【中文标题】使用 naudio 动态播放音频文件【英文标题】:play audio file dynamically with naudio 【发布时间】:2013-07-30 19:29:10 【问题描述】:我正在处理一个将从另一个系统获取输入的项目。输入可以是形式参数(整数值)的信号。我的应用程序将根据输入值动态播放不同的声音。例如,当程序获得参数值 2 时,它应该播放 2 个声音 A 和 B 并行的文件。我可以与 naudio 同时播放声音,但到目前为止它们是硬编码的。我需要从可以有 N 个声音的文件夹中播放声音。如果我得到值 2,是否有可能以某种方式动态选择和播放仅包含 A 和 B 的文件?但是如果我得到参数值 3,那么情况会有所不同,例如我想播放一个声音 C。请给我建议任何代码或想法来帮助我编写一个这样的算法?
非常感谢您的宝贵指导
提前致谢
【问题讨论】:
【参考方案1】:您需要一个混音器对象来组合源文件中的波形数据并生成可以馈送到您的WaveOut
实例的输出波形。 NAudio 中有一些混音器:例如MixingWaveProvider16
、WaveMixerStream32
和MixingSampleProvider
。这些将帮助您将源文件中的波形数据组合成可以播放的复合波形。
另一个选项是实现IWaveProvider
,它将处理多个输入并以所需格式混合成单个输出流。在这种情况下,您将有一个输出缓冲区和一个要混合的输入流/缓冲区列表。当输出缓冲区中需要更多数据时,它会即时混合源数据,可能使用提供的混合器类之一。
我个人建议编写自己的混音器。这是一个很好的练习,可以让您更好地了解正在发生的事情。
如果您要混合 16 位流,则需要使用 32 位缓冲区进行混合,因为两个 16 位输入相加会产生大于 16 位值可以容纳的值。您拥有的输入越多,超出有效范围的可能性就越大。有几种方法可以解决这个问题。仅将输出限制在 Int16.MinValue
和 Int16.MaxValue
之间是一种可能对您有用的快速而讨厌的方法。尽管看起来很诱人,但我建议您不要尝试对样本进行平均...它会过多地降低输出的整体动态范围。
【讨论】:
以上是关于使用 naudio 动态播放音频文件的主要内容,如果未能解决你的问题,请参考以下文章