将多个MP3曲目合并到一个曲目中

时间:2011-11-19 02:08:07

标签: c++ linux audio mp3

坦率地说,我不知道从哪里开始。我必须有一个程序将一些mp3轨道合并到一个轨道(不连接,但实际上合并它们,有点像一次播放几个音轨)。是否有可用的库或其他基本程序会自动执行此操作?我还需要改变每个音轨的音量,我也不知道从哪里开始。

速度和效率是这方面的一个主要因素,所以我不能只是做懒惰的事情并播放它们并捕获它。

3 个答案:

答案 0 :(得分:2)

我将尝试绘制一些您可以遵循的一般步骤:

  1. 您需要将mp3文件解压缩为原始音频。根据 你正在开发什么样的应用程序,你可以使用 例如madlib(GPL)或ffmpeg(LGPL)。

  2. 您需要将所有曲目标准化为same frequency (重新抽样),并决定输出bit-depth

  3. 现在您可以混合所有曲目。假设你有2个频道, 基本思想是计算右边所有样本的平均值 您的曲目频道,然后与左声道相同。 有很多方法,在这里你必须决定 对结果的性能/质量进行权衡。对于 例如,一些开发人员更喜欢在float上进行混合操作 要点,以便处理clipping (d)effects,但其他人 可能会提出反对意见,因为它会影响表现。有一个 关于基于整数的混合here的好帖子(已经有了 在SO中引用了几次。同样在此步骤之前(或期间),您可以通过在要标准化的通道样本上使用乘数来实现一些audio normalization过程。

  4. 最后,您可以再次压缩混合音频。你可以用 lame例如关于此任务,或再次ffmpeg。

  5. 有许多DSP packages for linux可能会为您完成这些步骤中的几个(或全部)。我想到的一个GPL项目是VLC(VideoLan Client)。您可以尝试将其称为外部流程,或使用VLM(VideoLan Manager)进行计划。来自documentation

    预定广播:

    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上找到了accepted answer对您有用的问题,建议使用Sox。从主页:

      

    SoX是一个跨平台(Windows,Linux,MacOS X等)命令行   可以将各种格式的计算机音频文件转换为的实用程序   其他格式。它还可以对这些声音应用各种效果   文件(...)

答案 1 :(得分:1)

您可以将它们混合为大胆的单独曲目。您是否要求自己编写代码?

当您拥有原始形式的数据流时,您可以将可能的样本值的中点视为零..(8位样本..可能的值为256 .. 127为零.. 0或255处的样本处于最大音量)。

调整音量,移位,乘以增加音量,除以减少(注意剪辑)

混合,只需添加每个流的值,一次添加一个样本(注意剪切)。

这也是一个很好的链接:http://www.4front-tech.com/pguide/audio.html

答案 2 :(得分:1)

如果有足够的处理器性能,这可以实时完成。您需要能够读取mp3文件,一些实时软件mp3解码器块(类似于用于制作自己的MP3播放器/可视化器的块),其速度足以实时运行N个副本/线程,可能是一些DSP采样率转换模块和DSP混频器模块。所有软件。将所有处理线程与队列和数据FIFO结合在一起。

我的库代码可用于其中一些块(解码器,重新采样器),但要注意潜在的许可限制。