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

C++ 将多个MP3曲目合并到一个曲目中,c++,linux,audio,mp3,C++,Linux,Audio,Mp3,坦白说,我不知道从哪里开始。我必须有一个程序,将几个mp3曲目合并到一个曲目中(不是串联,而是实际合并它们,有点像一次播放几个音频曲目)。是否有可用的库或其他基本程序可以自动执行此操作?我还需要改变每首歌的音量,我也不知道从哪里开始 速度和效率是其中的一个主要因素,所以我不能只是做一些懒惰的事情,然后播放它们并捕捉它们。你可以在audacity中将它们作为单独的曲目混合。是否要求您自己编写代码 当数据流为原始形式时,可以将可能样本值的中点视为零。。(8位样本..可能有256个值..127为零..

坦白说,我不知道从哪里开始。我必须有一个程序,将几个mp3曲目合并到一个曲目中(不是串联,而是实际合并它们,有点像一次播放几个音频曲目)。是否有可用的库或其他基本程序可以自动执行此操作?我还需要改变每首歌的音量,我也不知道从哪里开始


速度和效率是其中的一个主要因素,所以我不能只是做一些懒惰的事情,然后播放它们并捕捉它们。

你可以在audacity中将它们作为单独的曲目混合。是否要求您自己编写代码

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

要调整音量,请按住shift键,然后乘以增大音量,除以以减小音量(注意剪裁)

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


这里还有一个很好的链接:

如果处理器性能足够好,这可以实时完成。您需要能够读取mp3文件、一些实时软件mp3解码器块(类似于您自己制作的mp3播放器/可视化工具),它们的速度足以实时运行N个拷贝/线程,可能还有一些DSP采样率转换块和DSP混音器块。所有软件。将所有处理线程与队列和数据FIFO绑定在一起


有些块(解码器、重采样器)可能有我的库代码,但请注意潜在的许可限制。

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

  • 您需要将mp3文件解压缩为原始音频。依靠 在您正在开发的应用程序中,您可以使用哪种类型的应用程序 (GPL)或(LGPL)例如

  • 您需要将所有轨迹规范化为 (重新采样),并决定输出

  • 现在您可以混合所有曲目。假设你有两个频道, 其基本思想是计算右图中所有样本的平均值 您的曲目的频道,然后对左侧频道执行相同的操作。 有很多方法可以实现这一点,您必须在这里做出决定 性能/质量与结果之间的权衡。对于 示例一些开发人员更喜欢在float上执行mix操作 点,为了应付,但其他 可能会提出反对意见,因为这会影响性能。有一个 关于基于整数的混合的好帖子(它已经 在SO中多次引用)。此外,在此步骤之前(或期间),您可以通过在要规格化的通道样本上使用乘法器来实现一些过程

  • 最后,您可以再次压缩混合音频。你可以用 例如,在该任务上,或在ffmpeg上执行一次

  • 有很多人可能会为您执行这些步骤中的几个(或全部)。我想到的一个GPL项目是(VideoLan客户端)。您可以尝试将其称为外部进程,或使用(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中的输出流也可以是本地文件

    编辑: 我还发现了一个问题,建议您使用。从主页:

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


    看看瘸子,奥格。您需要一个原始音频流(这实际上是一系列数字,表示每个样本的扬声器线圈获得的功率)。我正在更新我的答案以作进一步解释。