作为输入,我得到一个mp3文件(input.mp3),然后需要将其拆分为两个单独的部分(已完成),然后在这些部分之间插入另一个mp3(second.mp3)。
问题: 我尝试使用每个命令来串联文件,将它们转换为.ts等。 但是我总是只听到第一个mp3文件的声音,而第二个的声音却丢失了。我想我必须将mp3文件转换成与input.mp3(比特率,通道的采样率数量)文件完全相同的格式,然后才能将其连接起来。
我可以将input.mp3的两个部分串联起来,但是无论如何我都不能与second.mp3串联。
我正在将php和exec和ffmpeg.exe文件一起使用。是否可以编码,所以无论输入如何,我都可以将second.mp3转换为适合串联mp3的内容?
答案 0 :(得分:1)
如何连接两个非常不同的mp3文件(差异比特率,频道,采样率,bitdeph)?
让我们从每个组件开始...
比特率
这无关紧要。 MP3流可以(而且可以!)更改流中的比特率。只要您加入框架标题,就可以了。
位深
MP3中不存在采样位深度的概念。您可以以24位捕获,编码为MP3,然后解码器将解码为16位。 (或者,对于某些命令行开关,反之亦然!)这不是问题,因为位深度不适用。
采样率
这通常是一个问题。大多数玩家不认为他们会在中间改变输出采样率。大多数播放器不会尝试重新采样以保持其已经输出的速率。对于采样率的更改您会遇到一些麻烦,我并不感到惊讶。
频道
这类似于采样率问题,因为它需要更改输出设备的配置。即使播放器支持它,也不会是无缝的。 (除非您要从立体声转换为单声道,否则可以轻松地将单声道升混为立体声。)
作为输入,我得到一个mp3文件(input.mp3),然后需要将其拆分为两个单独的部分(已完成),然后在这些部分之间插入另一个mp3(second.mp3)。
这实际上提出了另一个您尚未询问的有关时间的问题。 MP3在相对较大的帧(通常为576个样本)中工作,这成为您可以拼接的分辨率。不好。此外,磁道的起点通常具有一两个初始化帧。
第三个问题是钻头储存器。这是一帧中的内容存储在另一帧中的地方,该帧可能有额外的空间。
最终,您将必须将所有内容解码为常规PCM样本,进行拼接,然后重新编码为MP3。您还必须将所有内容重新采样为通用时钟频率,并混合为特定的通道数。幸运的是,一旦解码为PCM,这都是琐碎且标准的。一旦您的输入流兼容,您就可以在最细粒度的PCM帧上任意拼接。
答案 1 :(得分:0)
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