如何混合音频样本?

9
我的问题不完全与编程有关,但我认为SO是提问的正确地方。
在我的程序中,我会生成一些音频数据并将其保存到WAV文件中。一个声音发生器时一切都运作正常。但现在我想要添加更多的发生器,并将生成的音频数据混合成一个文件。但这比看起来要复杂得多。此外,我没有找到太多有用的信息来混合一组音频样本。
那么有人能给我建议吗?
编辑:
我正在使用C ++进行编程。但这并不重要,因为我对混合两个音轨背后的理论感兴趣。我的问题是我不能只简单地相加这些样本,因为这通常会产生失真的声音。

什么编程语言和平台? - Keith Adler
你使用的是哪种编程语言?用了哪些库?能提供更多细节吗? - Poindexter
4个回答

7
我猜您的问题是,每次添加音频源时,您都必须降低音量。如果应用程序允许用户控制,则应该让他们直接控制音量。这是“混合”的一部分。
如果混音是自动化的,您将开始一段旅程。您可能需要压缩,如果不是限制。 (限制是压缩的极端版本。)
请注意,您对音频所做的任何更改(包括压缩和限制)都是一种失真形式,因此您将会有音频上的色彩变化。您所选择的压缩和限制算法将影响声音。
由于您不是实时生成音频,因此有可能进行“砖墙”限制。这是因为您有级别的预知。实时限制更为有限,因为您无法知道即将发生的事情-您必须是反应性的。
这是音乐、音效、语音还是其他什么?
程序员在这方面经常处理。

感谢您在我的原始问题中猜对了我想问的内容 ;) - ralle
这是一个相当普遍的问题,你可能会想到。 - Nosredna
当然是的,我在ActionScript 3中混合两个生成的声音时遇到了同样的问题。感谢提供链接,看起来我需要阅读一些关于压缩器的内容! - vitch

5
混合音频样本意味着将它们相加,仅此而已。通常,您会将它们添加到一个更大的数据类型中,以便在将其强制转换回目标缓冲区之前检测溢出并夹紧值。如果您事先知道会发生溢出,则可以在相加之前调整它们的振幅-只需乘以介于0和1之间的浮点值,再次牢记精度问题,可能需要先转换为更大的数据类型。
如果您有未解决的特定问题,请随时更新您的原始问题。

夹紧是硬性限制,听起来很糟糕。他更有可能希望对该限制进行膝部调节。 :-) - Nosredna
他可能会,但那在技术上是与他所问的不同的东西 :) - Kylotan

4

混合两个样本的不洁

mix = (a + b) - a * b * sign(a + b)

0
你没有提到编程语言和平台,不过暂时我会假设使用C#在Windows上进行开发。

http://www.codeplex.com/naudio

这是一个非常棒的开源库,它真正涵盖了大多数音频操作中遇到的许多内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接