混合不同大小的声音文件
Posted
技术标签:
【中文标题】混合不同大小的声音文件【英文标题】:Mixing sound files of different size 【发布时间】:2011-01-21 10:25:58 【问题描述】:我想将不同大小的音频文件混合到一个单独的 .wav 文件中,而不剪切任何文件。即生成的文件大小应等于所有文件中最大的大小。
有一个样本,我们可以通过它混合相同大小的文件
[(http://www.modejong.com/ios/#ex4)(示例 4)].
我修改了代码以将混合文件获取为 .wav 文件。
但我无法理解如何为大小不等的文件修改此代码。 如果有人可以帮助我提供一些代码 sn-p,我将非常感激。
【问题讨论】:
【参考方案1】:应该像同时将所有文件发送到混音器一样简单。当任何单个文件到达末尾时,只需将其视为剩余部分填充零即可。当所有文件都结束时,您就完成了。
请注意,示例代码表示如果存在裁剪(波的总和大于最大可表示值),它将返回错误。如果您混合多个输入,则更有可能出现这种情况。最好的解决方法是在输入波中创建一些"headroom"。您可以在预处理中执行此操作,方法是确保每个波的音量不超过最大值的 X%。 (~80-90%,取决于输入的数量。)。另一种方法是在混音器代码中动态执行此操作,方法是将每个样本乘以某个值
如果您在运行时选择要混合的波形,并且由于裁剪导致的失败是不可接受的,您将需要修改示例代码以将值固定为最大值/最小值,而不是返回错误。不要只是让它们溢出,否则你会得到嘈杂的伪影。
(削波也会产生伪影,但是当您在混音之前没有创建足够的动态余量时,肯定会更喜欢溢出。这是一种听起来更熟悉的失真类型,类似于您在超速扬声器时得到的失真.见this wikipedia article on clipping:
削波优于数字系统中的替代方案——换行——如果允许数字硬件“溢出”,则会发生这种情况,忽略幅度的最高有效位,有时甚至是样本值的符号,从而导致总信号失真。
【讨论】:
固定到最大/最小听起来也很可怕!【参考方案2】:我会怎么做:
很像您链接到的mix_buffers
函数,但为mixbufferNumSamples
传递了两个参数。遍历两个缓冲区中较长的一个。当索引超出较短缓冲区的末尾时,只需将该缓冲区中的样本设置为 0
即可用于函数的其余部分。
如果你必须避免削波并且实时进行并且你对这两种声音一无所知,你必须提供足够的净空。最简单的方法是在混合之前将每个样本减半:
mixed = s1/2 + s2/2;
这可确保生成的混合样本不会溢出int16_t
。不过,它会产生让一切变得更安静的副作用。
如果您可以离线运行它,您可以计算一个比例因子以应用于两个波形,当总和低于最大允许值时,它将保持峰值。
或者您可以将它们全部混合到int32_t
缓冲区,跟踪最大(幅度)混合样本,然后返回缓冲区,将每个样本乘以一个比例因子,这将使极端样本 刚刚达到+32767/-32768的限制。
【讨论】:
以上是关于混合不同大小的声音文件的主要内容,如果未能解决你的问题,请参考以下文章
求一段运用matlab把俩个声音文件混合成一个文件的程序!我只会编写一小段声音读取和播放的程序。混合就不会
JavaCV音视频开发宝典:JavaCV混合屏幕录屏和系统声音录制mp4视频文件(windows桌面屏幕和系统声音混合录制)
JavaCV音视频开发宝典:JavaCV混合屏幕录屏和系统声音录制mp4视频文件(windows桌面屏幕和系统声音混合录制)
JavaCV音视频开发宝典:JavaCV混合屏幕录屏和系统声音录制mp4视频文件(windows桌面屏幕和系统声音混合录制)