音频混音算法的研究

您所在的位置:网站首页 导航与音乐混音比例怎么调的 音频混音算法的研究

音频混音算法的研究

2024-01-16 20:02| 来源: 网络整理| 查看: 265

(可以点目录看看有没有需要的内容)

音频混音的研究 什么是音频混音?

把多种来源的声音,整合至一个立体音轨(Stereo)或单音音轨(Mono)中,从实际的业务场景来看,比如,使用抖音上传一段本地视频的时候,可以选择添加背景音乐,合成出来的视频既有本地视频的原音,也有添加的背景音乐。

音频混音的原理

声音是由于物体的振动对周围的空气产生压力而传播的一种压力波,转成电信号后经过抽样,量化,仍然是连续平滑的波形信号,量化后的波形信号的频率与声音的频率对应,振幅与声音的音量对应,量化的语音信号的叠加等价于空气中声波的叠加,所以当采样率一致时,混音可以实现为将各对应信号的采样数据线性叠加。反应到音频数据上,也就是把同一个声道的数值进行简单的相加而问题的关键就是如何处理叠加后溢出问题。(通常的语音数据为16bit 容纳的范围是有限的 -32768 到 32767之间 所以单纯的线性叠加是有可能出现溢出问题的。 直接截断会产生噪音。 所以需要平滑过度) 所以在进行混音之前要先保证需要混合的音频 采样率、通道数、采样精度一样

我遇到的问题

我们的sdk之前已经完成了混音的工作,但是在加入了视频拼接功能后,如果拼接的是一段视频+图片,再加入背景音乐 合成之后就会出现背景音乐在播放视频的时候音量小,播放图片部分音量大。针对这个bug,我一开始是没有任何头绪的,自然也和混音算法联系不起来,我就去详细的研究了视频和图片在加上背景音乐合成的时候对音频的影响有什么不同,发现:视频具有音轨,再加上背景音乐后需要混音,而图片没有音轨,只需要加入背景音乐就行,从这一点我认为这个问题可能跟混音有关

常见的混音算法

了解了音频混音的原理后都会觉得很简单,就是把同一个声道的数值进行简单的相加,但是!!!我们存储音频数据的单位是有大小限制的,如何处理叠加后溢出问题才是混音算法的关键,并且现在已经具有的混音算法有很多,能够结合业务场景选择适合的混音算法也是关键,要求我们能理解每一种混音算法的优劣做出选择,通过查阅资料目前存在的混音算法有以下: (使用的算法名称可能不准确,别名好多并且不保证一定对)

直接加和平均调整权重法(平均法)加和并箝位归一化自适应混音加权(衰减因子法)(改进后的归一化算法)自动对齐算法有人说的newlc中的一段算法

以下的代码都只是示例代码,并不能直接运行,只是展示了核心算法

1.直接加和

同一个声道的数值进行简单的相加,数据是很完整的保留下来了,但是会存在溢出的可能而且混合的路数越多,溢出的可能性越大

/** * @param inputAudios * 直接加和 * @return */ public static short[] mixRawAudioBytes(short[][] inputAudios) { int coloum = finalLength;//最终合成的音频长度 // 音轨叠加 short[] realMixAudio = new short[coloum]; int mixVal; for (int trackOffset = 0; trackOffset < coloum; ++trackOffset) { mixVal = inputAudios[0][trackOffset]+inputAudios[1][trackOffset]; realMixAudio[trackOffset] = (short) (mixVal); } return realMixAudio; } 2.平均调整权重法(平均法)

将每一路的语音线性相加,再除以通道数,该方法虽然不会引入噪声,但是随着通道数成员的增多,各路语音的衰减将愈加严重。具体体现在随着通道数成员的增多,各路音量会逐步变小。

/** * @param inputAudios * 平均调整权重法(平均法) * @return */ public static short[] mixRawAudioBytes(short[][] inputAudios) { int coloum = finalLength;//最终合成的音频长度 // 音轨叠加 short[] realMixAudio = new short[coloum]; int mixVal; for (int trackOffset = 0; trackOffset < coloum; ++trackOffset) { mixVal = (inputAudios[0][trackOffset]+inputAudios[1][trackOffset])/2; realMixAudio[trackOffset] = (short) (mixVal); } return realMixAudio; } 3. 加和并箝(qián)位

将每一路的语音线性相加进行溢出检测,如果溢出,以最大值来替代。这样会造成声音波形的人为削峰,在破坏语音信号特性的同叫会促使噪音的产生

/** * @param inputAudios * 加和并箝位 * @return */ public static short[] mixRawAudioBytes(short[][] inputAudios) { int coloum = finalLength;//最终合成的音频长度 //混音溢出边界 int MAX = 32767; int MIN = -32768; // 音轨叠加 short[] realMixAudio = new short[coloum]; int mixVal; for (int trackOffset = 0; trackOffset < coloum; ++trackOffset) { mixVal = inputAudios[0][trackOffset]+inputAudios[1][trackOffset]; if (mixVal>MAX){ mixVal = MAX; } if (mixValMAX){ f = MAX/mixVal; mixVal = MAX; } if (mixVal


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3