2011-02-26 20 views
3

我有两个不同音频剪辑的两个采样数组。如果我只是以编程方式将它们添加到一起,这将相当于在音频编辑套件中将一个音轨叠加到另一个音轨上吗?就好像我有一个低音鼓的音频片段,我希望他们一起演奏。以编程方式合并两段音频

我可能会做这样的事情:

for (int i = 0; i < length_of_array; i++){ 
    final_array[i] = first_array[i] + second_array[i]; 
} 

如果不这样做的方式,我能得到什么是正确的做法一些指示?

+2

你试过看看它听起来像什么吗? (实际上,要*听到*它听起来更像是正确的) – 2011-02-26 09:49:11

回答

10

这是一个正确的方法。合并在音频行话中称为混音。

但是:

如果你的样品是短(16位有符号) - 你将不得不使用int(32位有符号)加法,然后手工裁剪的样品。如果不这样做,你的价值观会包裹,你就会有这么多的乐趣听你做了什么:)

这里谈到的代码:

short first_array[1024]; 
short second_array[1024]; 
short final_array[1024]; 
for (int i = 0; i < length_of_array; i++) 
{ 
    int mixed=(int)first_array[i] + (int)second_array[i]; 
    if (mixed>32767) mixed=32767; 
    if (mixed<-32768) mixed=-32768; 
    final_array[i] = (short)mixed; 
} 

在大多数情况下,你不需要任何否则用于正常音频采样,因为剪辑将在极其罕见的情况下发生。我是从实践谈起而不是从理论谈起。

+0

不错的工作!谢谢:) – 2011-02-26 19:03:50

+1

@Daniel你将如何在php或任何其他服务器端语言中使用两个mp3(例如)文件来完成此操作? – trainoasis 2014-05-19 14:46:18

+1

@trainoasis你不会。为了混合2个mp3,你必须将它们解码为PCM,然后(如果需要的话)重新编码回mp3。直接的mp3混音是不可能的。至少不是在字节级别。 – 2014-05-21 08:57:04

1

一般来说,这会得到你想要的 - 但是,请注意clipping。也就是说,小心不要结束整数溢出;并且不要通过将该值限制为所讨论的类型的最大值/最小值来避免这种情况。您可能需要应用compressor才能将这些值添加到范围内。

+0

+1第二链接 – 2014-05-28 21:03:36

5

如果两个音频剪辑的采样率和所需混音级别相同,则您的上述合并方法将起作用。如果所需的混合水平是不同的,那么你的调音台的一个稍微更一般的形式是这样的:

mixed_result[i] = rescale_and_clip_fix(volume1 * input1[i] + volume2 * input2[i]); 

凡rescale_and_clip_fix()可能是一个限制器或压缩机,以下确保相乘后的规模是正确的结果的数据类型。如果结果数组是整数数据类型,那么您可能还想在缩放时进行舍入或噪声过滤。

如果采样率不同,则需要首先对其中一个输入通道和/或之后的结果进行采样率转换。

相关问题