如何连接两个非常不同的mp3文件(差异比特率,通道,采样率,bitdeph)?

时间:2019-03-05 15:40:22

标签: ffmpeg mp3

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

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

我可以将input.mp3的两个部分串联起来,但是无论如何我都不能与second.mp3串联。

我正在将php和exec和ffmpeg.exe文件一起使用。是否可以编码,所以无论输入如何,我都可以将second.mp3转换为适合串联mp3的内容?

3 个答案:

答案 0 :(得分:1)

  

如何连接两个非常不同的mp3文件(差异比特率,频道,采样率,bitdeph)?

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

  

比特率

这无关紧要。 MP3流可以(而且可以!)更改流中的比特率。只要您加入框架标题,就可以了。

  

位深

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

  

采样率

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

  

频道

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

  

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

这实际上提出了另一个您尚未询问的有关时间的问题。 MP3在相对较大的帧(通常为576个样本)中工作,这成为您可以拼接的分辨率。不好。此外,磁道的起点通常具有一两个初始化帧。

第三个问题是钻头储存器。这是一帧中的内容存储在另一帧中的地方,该帧可能有额外的空间。

最终,您将必须将所有内容解码为常规PCM样本,进行拼接,然后重新编码为MP3。您还必须将所有内容重新采样为通用时钟频率,并混合为特定的通道数。幸运的是,一旦解码为PCM,这都是琐碎且标准的。一旦您的输入流兼容,您就可以在最细粒度的PCM帧上任意拼接。

答案 1 :(得分:0)

使用atrimasetptsconcat过滤器:

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

注意:所有相应的流在所有段中必须具有相同的参数;过滤系统将自动为音频流选择通用的采样格式,采样率和通道布局。这些通用参数将根据输入参数而有所不同,因此,如果要获得一致的结果,请添加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

答案 2 :(得分:0)

如果您要连接或将不同比特率单声道立体声 mp3文件合并为一个mp3文件使用 ffmpeg libmp3lame 库。

命令:

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