如何加入/合并许多mp3文件?


59

在Google上搜索如何加入/合并许多mp3文件,这表明我应该将cat它们放在一起。

这可能会“起作用”,但是显然这不是正确的方法,因为每个标头和IDv3标签集也会被串联在一起。

是否存在可以编写脚本来加入/合并许多mp3的Linux程序?

mplayer / mencoder / ffmpeg可以做到吗?

Answers:


79

这将连接两个mp3文件,结果元数据将是第一个文件的元数据:

ffmpeg -i "concat:file1.mp3|file2.mp3" -acodec copy output.mp3

这是因为,对于ffmpeg,整个“ concat:”部分是单个“输入文件”,并且其元数据将属于第一个串联文件。如果要使用第二个文件中的元数据,则必须将其添加为虚拟输入文件,并将其元数据映射到输出的元数据:

ffmpeg -i "concat:file1.mp3|file2.mp3" -i file2.mp3 -acodec copy test.mp3 -map_metadata 0:1

如果要从两个元数据构造元数据,则必须手动完成。您可以使用以下命令转储文件的元数据

ffmpeg -i file1.mp3 -f ffmetadata file1.metadata

在转储两个元数据并构造新的元数据之后,可以使用将其添加到输出文件-metadata,并且可以通过-map_metadata从负输入文件号设置映射来禁用元数据复制。这将设置一个名称值,而不设置其他元数据:

ffmpeg -i "concat:file1.mp3|file2.mp3" -acodec copy -metadata "title=Some Song" test.mp3 -map_metadata 0:-1

仅供参考,这需要特定版本的ffmpeg。如果显示未找到连接文件...请尝试升级并再次运行它
Sameer 2012年

在Gentoo的ffmpeg 0.10.4中可以正常工作。你在用什么 您确定不只是输错了命令吗?
Ambroz Bizjak 2012年

1
只是想为其他人澄清一些事情:-acodec意味着将使用音频编解码器,并且copy意味着仅进行混合和解混合,而不会进行编码/转码(即非常快,并且没有质量损失)
Housemd

1
如果有一个GUI程序,我可以拖放多个文件(例如,按时间顺序排序以按顺序录制的录音,也许还可以编辑一些文件),然后输出一个文件,那就太好了。
詹姆斯·雷

1
这是一个很好的答案,但是几乎在每种情况下,生成的MP3文件之间的连接位置之间的距离都较短(不到一秒)。因此,如果您试图合并MP3曲目以创建无缝播放专辑/设置/其他内容,则效果不佳。
蜥蜴

13

Mp3Wrap-命令行实用程序,可将多个MP3文件包装到一个可播放的MP3中,而不会丢失文件名或ID3信息,并且无需重新编码。还支持在MP3内归档非音频数据,例如播放列表,信息文件和封面图像。这些文件可以稍后解压缩(例如使用mp3splt);普通的MP3解码器可以将整个音频流作为一条长轨道播放。


1
感谢您的建议..比ffmpeg更轻/更简单的解决方案,因为我合并了100多个mp3,并希望选择拆分回原始版本。
joshbaptiste 2014年

此属性不再起作用-尝试串联一些文件并检查其中的输出文件mp3val-它将报告同步错误。这意味着它将不会在Chrome 64+中的第一个块之后播放(请参见bugs.chromium.org/p/chromium/issues/detail?id=794782bugschromium.org/p/chromium/issues/detail?id = 806601#c10
Housemd

在Windows上似乎不起作用。没有保留元数据。
格鲁伯(Gruber)

9

这会将充满MP3的文件夹串联到一个MP3文件中:

1)保存要连接的MP3文件列表,例如,

$ cat mylist.txt
file '/tmp/01.mp3'
file '/tmp/02.mp3'
file '/tmp/03.mp3'
file '/tmp/04.mp3'
file '/tmp/05.mp3'
file '/tmp/06.mp3'
file '/tmp/07.mp3'

2)运行下面的命令(-safe 0不需要如果mylist.txt使用相对路径来代替):

$ ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp3

3

如果要合并当前目录的所有mp3文件:

function join_by { local IFS="$1"; shift; echo "$*"; }
files=(*.mp3)
ffmpeg -i "concat:`join_by "|" $files`" -acodec copy output.mp3

0

如果需要脚本,最好使用ffmpeg解决方案。但是,如果您只需要一个应用程序来完成类似的工作,则可以尝试Audacity。它是开源和跨平台的。我没有用它来加入mp3,但我用它来裁剪掉mp3中的部分并在最后淡出它们。我敢打赌,您也可以加入mp3并相互淡入淡出。


4
据我所知,Audacity可以处理原始声音数据,将mp3与之连接会由于转码而导致音质下降。
Ambroz Bizjak 2011年

0

zsh:

audio-join() ffmpeg -i "concat:${(j:|:)@[2,-1]}" -acodec copy $1

audio-join output.mp3 *.mp3

我们希望答案能包含解释。(并非此页面上的所有答案都是很好的例子。)
Scott

0

根据Miles Wolbe的回答,以下是为我工作的单线工作:

ls *.mp3 | \
    sed -e "s/\(.*\)/file '\1'/" | \
    ffmpeg -protocol_whitelist 'file,pipe' -f concat -i - -c copy output.mp3
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.