混合不同大小的声音文件

时间:2011-01-21 10:25:58

标签: iphone objective-c audio

我想将不同大小的音频文件混合到单个.wav文件中而不剪切任何文件。生成的文件大小应等于所有文件的最大文件大小。

有一个样本我们可以通过它混合相同大小的文件

[(http://www.modejong.com/iOS/#ex4)(例4)]。

我修改了代码以将混合文件作为.wav文件。

但我无法理解如何为不等大小的文件修改此代码。 如果有人可以帮我解决一些代码片段,我会非常感激。

2 个答案:

答案 0 :(得分:1)

应该像将所有文件同时发送到调音台一样简单。当任何单个文件到达末尾时,只需将其视为余数用零填充即可。当所有文件都结束时,您就完成了。

请注意,示例代码表示如果存在裁剪(波的总和大于最大可表示值),则会返回错误。如果您混合多个输入,则更有可能出现这种情况。最好的方法是在输入波中创建一些"headroom"。您可以在预处理中执行此操作,方法是确保每个wave的音量不超过最大值的X%。 (~80-90%,取决于输入数量。)。另一种方法是在混合器代码中动态地将它们乘以某个值<1.0,然后将其添加到混合中。

如果选择在运行时混合波形并且由于削波而导致的故障是不可接受的,则需要修改示例代码以将值固定为max / min而不是返回错误。不要让它们溢出,否则你会得到嘈杂的文物。

(剪辑也会产生瑕疵,但是当你在混音之前没有创造足够的余量时,它肯定更容易溢出。这是一种更熟悉的失真类型,类似于当你过度驱动扬声器时所得到的见this wikipedia article on clipping

  

剪切优于数字系统包装中的替代方案 - 如果允许数字硬件“溢出”,忽略幅度的最重要位,有时甚至是样本值的符号,则会发生剪切信号失真。

答案 1 :(得分:0)

我是怎么做到的:

与您链接的mix_buffers函数非常相似,但为mixbufferNumSamples传递了2个参数。迭代两个缓冲区的整个较长时间。当索引超出较短缓冲区的末尾时,只需将该缓冲区中的样本设置为0以用于函数的其余部分。

如果你必须避免剪辑实时你对这两个声音一无所知,你必须提供足够的净空。最简单的方法是在混合前将每个样品减半:

 mixed = s1/2 + s2/2;

这可确保生成的混合样本不会溢出int16_t。它会产生让一切变得更安静的副作用。

如果您可以脱机运行,则可以计算应用于两个波形的比例因子,这些波形将在总和低于最大允许值时保持峰值。

或者你可以将它们全部以全音量混合到int32_t缓冲区,跟踪最大(幅度)混合样本,然后返回缓冲区,将每个样本乘以一个比例因子,这将使极端示例只是达到+ 32767 / -32768限制。