如何连接两个截然不同的 mp3 文件(diff 比特率、通道、采样率、bitdeph)?

How can I concatenate two very different mp3 files(diff bitrate, channels, samplerate, bitdeph)?

作为输入,我得到一个 mp3 文件 (input.mp3),然后我需要将它分成两个单独的部分(完成)并在这些部分之间插入另一个 mp3(second.mp3)。

问题: 我尝试使用每个命令来连接文件,将它们转换为 .ts 等。 但我总是只得到第一个 mp3 文件的声音,而第二个文件的声音丢失了。我想我必须将我的 mp3 文件转换为与 input.mp3(比特率,采样率通道数)文件完全相同的格式,然后才能将它连接到它。

我可以连接 input.mp3 的两个部分,但无论我做什么我都无法连接 second.mp3。

我正在使用 php 与 exec 和 ffmpeg.exe 文件。是否可以对其进行编码,以便无论输入如何,我都可以将 second.mp3 转换为适合连接 mp3 的格式?

How can I concatenate two very different mp3 files(diff bitrate, channels, samplerate, bitdeph)?

让我们从每个组件开始...

bitrate

这个没关系。 MP3 流可以(并且确实!)在流中改变比特率。只要加入帧头就可以了。

bitdepth

MP3 中不存在样本位深度的概念。您可以以 24 位捕获,编码为 MP3,解码器将解码为 16 位。 (或者,使用一些命令行开关,反之亦然!)这不是问题,因为位深度不适用。

sample rates

这通常是个问题。大多数播放器不认为他们会在中途更改输出采样率。大多数播放器不会尝试重新采样以坚持他们已经输出的速率。我对您在更改采样率方面遇到一些麻烦并不感到惊讶。

channels

这类似于采样率问题,因为它需要更改输出设备的配置。即使播放器支持它,它也不会是无缝的。 (除非您要从立体声转到单声道,否则单声道可以很容易地向上混音为立体声。)

As input I get one mp3 file(input.mp3), then I need to split it into two separate parts(done that) and insert between those parts another mp3(second.mp3).

这实际上提出了另一个您没有问过的问题...时间安排。 MP3 以相对较大的帧(通常为 576 个样本)工作,这成为您可以拼接的分辨率。不好。此外,轨道的开始通常有一两帧初始化。

第三个问题是位库。这是一个框架的内容存储在另一个框架中的地方,可能有额外的 space.

在一天结束时,您将不得不将所有内容解码为常规 PCM 样本,进行拼接,然后重新编码为 MP3。您还必须将所有内容重新采样到共同的时钟速率,并混合到特定的通道数。幸运的是,一旦解码为 PCM,这一切都是微不足道的标准。一旦你的输入流兼容,你就可以任意拼接一个 PCM 帧,这是最精细的可能。

使用 atrim, asetpts, and concat 过滤器:

ffmpeg -i input.mp3 -i second.mp3 -filter_complex "[0:a]atrim=end=10,asetpts=N/SR/TB[begin];[0:a]atrim=start=10,asetpts=N/SR/TB[end];[begin][1:a][end]concat=n=3:v=0:a=1[a]" -map "[a]" output

注意:所有相应的流在所有段中必须具有相同的参数;过滤系统将自动 select 音频流的通用采样格式、采样率和通道布局。这些常用参数将根据输入参数而有所不同,因此如果您想要一致的结果,请添加 aformat 过滤器(或等效过滤器):

ffmpeg -i input.mp3 -i second.mp3 -filter_complex "[0:a]atrim=end=10,aformat=sample_rates=44100:channel_layouts=stereo,asetpts=N/SR/TB[begin];[1:a]aformat=sample_rates=44100:channel_layouts=stereo[middle];[0:a]atrim=start=10,aformat=sample_rates=44100:channel_layouts=stereo,asetpts=N/SR/TB[end];[begin][middle][end]concat=n=3:v=0:a=1[a]" -map "[a]" output

如果你想连接或合并不同的比特率单声道Stereo mp3 files into one mp3 file use ffmpeg libmp3lame library.

命令:

ffmpeg -i "concat:'url1.mp3'|'mono_url2.mp3'|'stereo_url3.mp3'" -c:a libmp3lame output_file.mp3