当前位置: 首页 > news >正文

江门网站优化经验/广告公司联系方式

江门网站优化经验,广告公司联系方式,考试网站模版,深圳住房和城乡建设局网站https://blog.csdn.net/u010164190/article/details/117691952 什么是音频混音? 把多种来源的声音,整合至一个立体音轨(Stereo)或单音音轨(Mono)中,从实际的业务场景来看,比如&…

https://blog.csdn.net/u010164190/article/details/117691952

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

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

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

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

1.直接加和
2.平均调整权重法(平均法)
3.加和并箝位
4.归一化
5.自适应混音加权(衰减因子法)(改进后的归一化算法)
6.自动对齐算法
7.有人说的newlc中的一段算法
以下的代码都只是示例代码,并不能直接运行,只是展示了核心算法

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

 
  1. /**

  2. * @param inputAudios

  3. * 直接加和

  4. * @return

  5. */

  6. public static short[] mixRawAudioBytes(short[][] inputAudios) {

  7. int coloum = finalLength;//最终合成的音频长度

  8. // 音轨叠加

  9. short[] realMixAudio = new short[coloum];

  10. int mixVal;

  11. for (int trackOffset = 0; trackOffset < coloum; ++trackOffset) {

  12. mixVal = inputAudios[0][trackOffset]+inputAudios[1][trackOffset];

  13. realMixAudio[trackOffset] = (short) (mixVal);

  14. }

  15. return realMixAudio;

  16. }

2.平均调整权重法(平均法)

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

 
  1. /**

  2. * @param inputAudios

  3. * 平均调整权重法(平均法)

  4. * @return

  5. */

  6. public static short[] mixRawAudioBytes(short[][] inputAudios) {

  7. int coloum = finalLength;//最终合成的音频长度

  8. // 音轨叠加

  9. short[] realMixAudio = new short[coloum];

  10. int mixVal;

  11. for (int trackOffset = 0; trackOffset < coloum; ++trackOffset) {

  12. mixVal = (inputAudios[0][trackOffset]+inputAudios[1][trackOffset])/2;

  13. realMixAudio[trackOffset] = (short) (mixVal);

  14. }

  15. return realMixAudio;

  16. }

3. 加和并箝(qián)位

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

 
  1. /**

  2. * @param inputAudios

  3. * 加和并箝位

  4. * @return

  5. */

  6. public static short[] mixRawAudioBytes(short[][] inputAudios) {

  7. int coloum = finalLength;//最终合成的音频长度

  8. //混音溢出边界

  9. int MAX = 32767;

  10. int MIN = -32768;

  11. // 音轨叠加

  12. short[] realMixAudio = new short[coloum];

  13. int mixVal;

  14. for (int trackOffset = 0; trackOffset < coloum; ++trackOffset) {

  15. mixVal = inputAudios[0][trackOffset]+inputAudios[1][trackOffset];

  16. if (mixVal>MAX){

  17. mixVal = MAX;

  18. }

  19. if (mixVal<MIN){

  20. mixVal = MIN;

  21. }

  22. realMixAudio[trackOffset] = (short) (mixVal);

  23. }

  24. return realMixAudio;

  25. }

4. 归一化

全部乘个系数因子,使幅值归一化,但是个人认为这个归一化因子是不好确认的。

 
  1. /**

  2. * @param inputAudios

  3. * 归一化

  4. * @return

  5. */

  6. public static short[] mixRawAudioBytes(short[][] inputAudios) {

  7. int coloum = finalLength;//最终合成的音频长度

  8. float f = divisor;//归一化因子

  9. // 音轨叠加

  10. short[] realMixAudio = new short[coloum];

  11. float mixVal;

  12. for (int trackOffset = 0; trackOffset < coloum; ++trackOffset) {

  13. mixVal = (inputAudios[0][trackOffset]+inputAudios[1][trackOffset])*f;

  14. realMixAudio[trackOffset] = (short) (mixVal);

  15. }

  16. return realMixAudio;

  17. }

5. 自适应混音加权(衰减因子法)(改进后的归一化算法)
使用可变的衰减因子对语音进行衰减,该衰减因子代表了语音的权重,该衰减因子随着数据的变化而变化,当数据溢出时,则相应的使衰减因子变小,使后续的数据在衰减后处于临界值以内,没有溢出时,让衰减因子慢慢增大,使数据变化相对平滑。
算法详细解释可以参考这个链接

 
  1. /**

  2. * @param inputAudios

  3. * 自适应混音加权(衰减因子法)(改进版归一化因子法)

  4. * @return

  5. */

  6. public static short[] mixRawAudioBytes(short[][] inputAudios) {

  7. int coloum = finalLength;//最终合成的音频长度

  8. float f = 1;//衰减因子 初始值为1

  9. //混音溢出边界

  10. int MAX = 32767;

  11. int MIN = -32768;

  12. // 音轨叠加

  13. short[] realMixAudio = new short[coloum];

  14. float mixVal;

  15. for (int trackOffset = 0; trackOffset < coloum; ++trackOffset) {

  16. mixVal = (inputAudios[0][trackOffset]+inputAudios[1][trackOffset])*f;

  17. if (mixVal>MAX){

  18. f = MAX/mixVal;

  19. mixVal = MAX;

  20. }

  21. if (mixVal<MIN){

  22. f = MIN/mixVal;

  23. mixVal = MIN;

  24. }

  25. if (f < 1)

  26. {

  27. //SETPSIZE为f的变化步长,通常的取值为(1-f)/VALUE,此处取SETPSIZE 为 32 VALUE值可以取 8, 16, 32,64,128.

  28. f += (1 - f) / 32;

  29. }

  30. realMixAudio[trackOffset] = (short) (mixVal);

  31. }

  32. return realMixAudio;

  33. }

6. 自动对齐算法

考虑参与混音的多路音视频信号自身特点,以它们自身的比例作为权重,从而决定它们在合成后的输出中所占比重。

 
  1. /**

  2. * @param inputAudios

  3. * 自动对齐算法

  4. * @return

  5. */

  6. public static short[] mixRawAudioBytes(short[][] inputAudios) {

  7. int coloum = finalLength;//最终合成的音频长度

  8. float f1 = divisor1;//权重因子

  9. float f2 = divisor2;//权重因子

  10. // 音轨叠加

  11. short[] realMixAudio = new short[coloum];

  12. float mixVal;

  13. for (int trackOffset = 0; trackOffset < coloum; ++trackOffset) {

  14. mixVal = inputAudios[0][trackOffset]*f1+inputAudios[1][trackOffset]*f2;

  15. realMixAudio[trackOffset] = (short) (mixVal);

  16. }

  17. return realMixAudio;

  18. }

7. 有人说的newlc中的一段算法
算法原型:
Y = A + B - (A * B / (-(2 pow(n-1) -1)))
Y = A + B - (A * B / (2 pow(n-1))
这个算法网上有很多人在引用,当我尝试把 (2 pow(n-1))替换为常量Max后进行数学推导后发现
我推不出来。。。。。。。 我只能得出的结论是,如果A=Max,B=Max,A+B-A*B/MAX=MAX
而且也有好多人提出了质疑。
 

 
  1. /**

  2. * @param inputAudios

  3. * 有人说的newlc中的一段算法

  4. * @return

  5. */

  6. public static short[] mixRawAudioBytes(short[][] inputAudios) {

  7. int coloum = finalLength;//最终合成的音频长度

  8. // 音轨叠加

  9. short[] realMixAudio = new short[coloum];

  10. int mixVal;

  11. for (int trackOffset = 0; trackOffset < coloum; ++trackOffset) {

  12. mixVal = 0;

  13. if (inputAudios[0][trackOffset] < 0 && inputAudios[1][trackOffset] < 0) {

  14. mixVal = inputAudios[0][trackOffset] + inputAudios[1][trackOffset] - (inputAudios[0][trackOffset] * inputAudios[1][trackOffset] / MIN);

  15. } else {

  16. mixVal = inputAudios[0][trackOffset] + inputAudios[1][trackOffset] - (inputAudios[0][trackOffset] * inputAudios[1][trackOffset] / MAX);

  17. }

  18. realMixAudio[trackOffset] = (short) (mixVal);

  19. }

  20. return realMixAudio;

  21. }

回到我遇到的问题本身,研究代码发现,项目中现在用的混音算法是平均调整权重法(平均法),那这样在混音的时候就会导致背景音乐的音量被消减了,而图片不需要混音,背景音乐不需要被削减,就出现了一段声音大一段声音小的问题了,那解决这个问题就是要在保证不溢出的情况下保留原幅,业务场景只有两路音轨,所以其实可以选择的有很多,不同的业务场景需要采用不同的混音算法.

http://www.lbrq.cn/news/1334467.html

相关文章:

  • 大连微信网站制作/今天刚刚的最新新闻
  • 做网站的qq兼职/山东企业网站建设
  • 关于企业网站建设的必要性/百度竞价排名名词解释
  • 怎么查询网站有没有做网站地图/app运营方案
  • 营销型网站案例易网拓/教育机构排名
  • 哪里网站海报做的比较好/推广普通话绘画
  • 网站建设后期维护/今日实时热点新闻事件
  • 网络广告投放/windows优化大师破解版
  • 用什么做网站简单/南京seo新浪
  • 客户网站建设完成后需要什么/百度推广官方网站
  • 定制手机网站/舆情分析系统
  • linux系统服务器怎么做网站/龙南黄页全部电话
  • 提供网站技术支持/最新战争新闻事件今天
  • 找人做网站怎么做/资源
  • 那些网站可以做文案兼职/百度营销平台
  • 朝西村网站建设公司/百度问问首页
  • 北京知名的网站建设公司/上海seo优化培训机构
  • 中堂做网站/四川刚刚发布的最新新闻
  • 最新在线免费网站/怎样做竞价推广
  • 阿里云网站架构怎么做/怎么制作网页里面的内容
  • 网站手机端模板库/青岛快速排名
  • 成都网站建设优秀公司/百度关键字排名软件
  • 24小时在线客服/整站优化seo
  • 响应式模板网站建设/百度搜索下载
  • 江阴网站设计/长沙网站搭建优化
  • 湖南人文科技学院图书馆官网/3分钟搞定网站seo优化外链建设
  • 徐州最好网站建设/本地网络seo公司
  • 千库网ppt模板免费/北京债务优化公司
  • 怎么在网站上做链接/网站推广app
  • 网页浏览器打不开/seo刷网站
  • 过程设计工具深度解析-软件工程之详细设计(补充篇)
  • TF-IDF——红楼梦案例
  • 串口通信“第二次总超时”的复盘
  • vivo Pulsar 万亿级消息处理实践(2)-从0到1建设 Pulsar 指标监控链路
  • 机械臂的智能升维:当传统机械臂遇见Deepoc具身智能大模型从自动化工具到具身智能体的范式革命
  • 正则表达式解析(二)