合并几个MP3轨道在一个轨道
Merging several MP3 tracks in to one track
老实说,我不知道从哪里开始。我必须有一个程序,将几首mp3歌曲合并到一个曲目中(不是串联,而是合并它们,有点像同时播放几首音轨)。是否有可用的库或其他基本程序可以自动完成此操作?我还需要改变每条轨道的音量,我也不知道从哪里开始。
速度和效率是其中的主要因素,所以我不能只是做懒惰的事情,播放它们并捕获它。
我将尝试画一些您可以遵循的一般步骤:
-
您需要将mp3文件解压缩为原始音频。根据取决于您正在开发的应用程序类型例如madlib (GPL)或ffmpeg (LGPL)。
-
你需要将所有的音轨归一化到相同的频率(重新采样),并决定输出位深度
-
现在你可以混合你所有的轨道。假设有2个通道,基本思想是计算右侧所有样本的平均值通道的轨道,然后做同样的与左通道。有很多方法可以做到这一点,你必须在这里做出决定为了你的结果,在性能和质量上进行权衡。为例如,一些开发人员更喜欢在float上进行混合操作点,以处理剪切(d)的效果,但其他我建议不要这样做,因为这会影响性能。有一个关于整数混合的好帖子在这里(它已经在SO中引用了几次)。此外,在此步骤之前(或期间),您可以通过对您想要规范化的通道的样本使用乘法器来实现一些音频规范化过程。
-
最后你可以再次压缩你的混合音频。你可以用
有许多linux的DSP软件包可以为您执行这些步骤中的几个(或全部)。我想到的一个GPL项目是VLC (VideoLan Client)。您可以尝试将其称为外部进程或使用VLM (VideoLan Manager)对其进行调度。来自文档:
计划广播:
new my_media broadcast enabled
setup my_media input my_video.mpeg input my_other_movie.mpeg
setup my_media output #rtp{mux=ts,dst=239.255.1.1,sdp=sap://,name="My Media"}
VLC的输出流自然也可以是本地文件。
编辑:我还发现了一个关于SO的问题,其中公认的答案可能对您有用,它建议使用Sox。从主页:
SoX是一个跨平台的(Windows、Linux、MacOS X等)命令行实用程序,可以转换各种格式的计算机音频文件在其他格式。它还可以对这些声音应用各种效果文件(…)
如果有足够的处理器性能,这可以实时完成。您需要能够读取mp3文件,一些实时软件mp3解码器块(类似于用于制作自己的mp3播放器/可视化器),其速度足以实时运行N个副本/线程,可能还需要一些DSP采样率转换块和DSP混音块。所有的软件。将所有处理线程与队列和数据流绑定在一起。
有一些库代码可用于这些块(解码器,重采样器),但要注意潜在的许可限制。
您可以在audacity中将它们混合为单独的轨道。是不是要求你自己写代码?
当您拥有原始形式的数据流时,您可以将可能的样本值的中点视为零。(8位样品. .256个值可能…127是零…0或255为最大音量)。
调节音量,shift,乘法增加音量,除法减少音量(注意剪辑)
要混合,只需添加每个流的值,一次一个样本(注意剪辑)。
这里也有一个很好的链接:http://www.4front-tech.com/pguide/audio.html
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '