Audio 以编程方式合并两段音频

Audio 以编程方式合并两段音频,audio,signal-processing,Audio,Signal Processing,我有两个不同的音频剪辑样本阵列。如果我只是以编程方式将它们添加到一起,这是否等同于在音频编辑套件中将一个曲目叠加在另一个曲目上?比如,如果我有一个低音的音频剪辑,另一个是鼓的音频剪辑,我希望它们一起演奏 我可能会这样做: for (int i = 0; i < length_of_array; i++){ final_array[i] = first_array[i] + second_array[i]; } for(int i=0;i

我有两个不同的音频剪辑样本阵列。如果我只是以编程方式将它们添加到一起,这是否等同于在音频编辑套件中将一个曲目叠加在另一个曲目上?比如,如果我有一个低音的音频剪辑,另一个是鼓的音频剪辑,我希望它们一起演奏

我可能会这样做:

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

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

一般来说,这会让你得到你想要的——但是,要注意。也就是说,小心不要以整数溢出结束;不要仅通过将值限制为所讨论类型的最大值/最小值来避免这种情况。添加值后,您可能需要应用a将其恢复到范围内。

这是一种正确的方法。合并在音频术语中称为混合

但是:

如果样本较短(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;
}
short first_数组[1024];
短秒_数组[1024];
短最终_数组[1024];
for(int i=0;i<数组的长度;i++)
{
int mixed=(int)第一个_数组[i]+(int)第二个_数组[i];
如果(混合>32767)混合=32767;

如果(mixed如果两个音频剪辑的采样率和所需混音级别相同,则上述合并方法将起作用。如果所需混音级别不同,则您的混音器的一般形式如下:

mixed_result[i] = rescale_and_clip_fix( volume1 * input1[i] + volume2 * input2[i] );
其中,rescale_和_clip_fix()可能是限制器或压缩器,请确保乘法后的比例对于结果的数据类型是正确的。如果结果数组是整数数据类型,则在缩放时可能还需要执行舍入或噪波过滤


如果采样率不同,则需要先对其中一个输入通道进行采样率转换,然后再对结果进行转换。

您是否尝试过查看它的声音?(实际上,听它的声音更正确)你能混音吗?如果能,请分享code@Daniel您如何使用php或任何其他服务器端语言的两个mp3(例如)文件来实现这一点?@trainoasis您不会。为了混合使用2个mp3,您必须将它们解码到PCM(如果需要的话)重新编码回mp3。直接的mp3混音是不可能的。至少不能在字节级别。是的,它会,只是剪辑所有的东西。但是,如果所有的样本都很响亮,你运气不好,你会有很多或剪辑,需要以某种方式压缩声音。@DanielMošmondor你如何混合2个以上的pcm文件?与abo示例相同ve,继续添加其他样品中的样品。