Ffmpeg 如何连接两个非常不同的mp3文件(不同比特率、通道、采样器、比特数)?

Ffmpeg 如何连接两个非常不同的mp3文件(不同比特率、通道、采样器、比特数)?,ffmpeg,mp3,Ffmpeg,Mp3,作为输入,我得到一个mp3文件(input.mp3),然后我需要将它分成两个独立的部分(这样做),并在这些部分之间插入另一个mp3(second.mp3) 问题是: 我尝试使用每个命令来连接文件,将它们转换为.ts等。 但我总是只听到第一个mp3文件的声音,而第二个mp3文件的声音就消失了。我想我必须将我的mp3文件转换成与input.mp3(比特率、采样率和通道数)文件完全相同的格式,然后才能将其连接到它 我可以连接input.mp3的两个部分,但无论我做什么,我都不能连接second.mp3

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

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

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

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

如何连接两个非常不同的mp3文件(不同比特率、通道、采样器、比特数)

让我们从每个组件开始

比特率

这个没关系。MP3流可以(而且确实如此!)在流中更改比特率。只要在帧头上加入,就可以了

比特深度

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

抽样率

这通常是个问题。大多数玩家并不认为他们会在中途改变输出采样率。大多数玩家不会尝试重新采样以保持他们已经输出的速率。我一点也不奇怪,你会在不断变化的采样率上遇到一些麻烦

渠道

这与采样率问题类似,因为它需要更改输出设备的配置。即使玩家支持它,它也不会天衣无缝。(除非您要从立体声切换到单声道,否则单声道很容易上混到立体声。)

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

这实际上提出了另一个你没有问过的问题。。。时机。MP3在相对较大的帧(通常为576个样本)中工作,这将成为您可以拼接的分辨率。不好的。此外,轨迹的起点通常有一到两个初始化帧

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

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

使用、和过滤器:

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

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

如果要将不同的比特率和单声道和立体声mp3文件连接成一个mp3文件,请使用
ffmpeg libmp3lame

命令:

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

非常感谢,第一个命令确实起了作用,可以说output.mp3的质量将始终与input.mp3的质量相同,保留input.mp3的所有重要参数吗?我有点不懂音频编辑@lukistar No。输入比特率其实并不重要,因为解码器会将音频完全解码为原始PCM音频,然后它将通过
-过滤器复合体
运行,然后进行编码。质量不可能是一样的,因为MP3是有损耗的。听一听:如果它听起来足够好,你可以使用默认值而不做任何额外的事情。如果听起来不够好,请提供更高的比特率。嘿,很抱歉问你一个不同的问题,但是现在我必须做和你的命令类似的事情-但是我不需要剪切第一个音频,而是需要在第一个音频的位置覆盖第二个音频,这样在那个位置第一个和第二个音频同时播放。。。但是再次使用第一个音频的参数。。有点像在witch中给第二个音频明星和第一个一起播放的第二个音频明星几秒钟,听他们两个的声音。@lukistar这个网站鼓励用户在每篇文章中单独问一个问题,所以这应该是一个新问题。哇!非常感谢。现在,我想我更明白我要做什么了
ffmpeg -i "concat:'url1.mp3'|'mono_url2.mp3'|'stereo_url3.mp3'" -c:a libmp3lame output_file.mp3