将多个.mp3文件串联为一个.mp3文件


45

如此处建议的那样我正在使用cat命令将多个.mp3文件连接为一个.mp3文件。

想象一下,我在当前文件夹中有以下.mp3文件:

001001.mp3 001002.mp3 001003.mp3 001004.mp3 001005.mp3

或者,像这样:

096001.mp3 096002.mp3 096003.mp3 096004.mp3

我需要按升序连接这些.mp3文件,即 001001.mp3+001002.mp3+001003.mp3+etc.

为了将这些.mp3文件合并为一个,我在当前文件夹中执行以下命令:

cat *.mp3 > final.mp3

我测试了最终的.mp3文件,这是我所期望的,但是我需要确保上述命令按升序选择文件。

我可以确定上面的命令总是按升序连接文件吗?

谢谢先生

Answers:


46

cat不是这项工作的正确工具。MP3格式有各种垃圾,可能会在文件的前端和结尾潜伏,因此需要将其清除。mp3wrap是你想要的。它将排除文件中的任何元数据,并将音频粘贴在一起。

sudo apt-get install mp3wrap
mp3wrap output.mp3 *.mp3

在执行此操作之前,请运行ls *.mp3以检查它们的顺序是否正确。当我最初(六年多以前!)写出这个答案时,通配符glob显然表现不佳,但我认为现在可以了。

您可能需要重命名这些文件,如果例如,它们的编号,但不是零填充,{1-11}.mp3将被排序1 10 11 2 3 4 5 6 7 8 9这很容易解决


2
正确-cat将通过在单个mp3文件中“创建数组” mp3文件来改变mp3文件格式。但是,如果播放器软件足够智能,它似乎可以工作。

这对我来说效果更好,因为它可以处理文件名中带有空格的find . -maxdepth 1 -iname '*.mp3' -print0 | sort -z | xargs -0 mp3wrap output.mp3
mp3

@bmaupin很公平,但是我不确定为什么我不只是使用Bash的通配符扩展。*.mp3应该足够了(并且可以使用空格)。
奥利(Oli)

可从Brew Package Manager中用于Mac !$ brew install mp3wrap
鲁本斯

1
在bash中,*.mp3保证保留字母顺序。如果您的文件被命名为09.mp310.mp311.mp3,这可能是你想要的。如果您的文件被命名为9.mp310.mp311.mp3,这可能不是你想要的,但你可以做`ls *.mp3 | sort -n`
乔·利斯(Ju Liss)

26

mp3wrap似乎是一个不错的解决方案,但是当我播放生成的文件时,时间戳不正确。当您将mp3连接到一个您知道以后要分割的文件时,似乎最好使用mp3wrap。

我只是想将一些mp3永久连接在一起。我最终使用ffmpeg连接文件:

  1. 首先,安装ffmpeg

    • Ubuntu 15.04以上

      sudo apt install ffmpeg
    • Ubuntu 14.10及更低版本
      转到http://ffmpeg.org/download.html,下载其中一个静态版本,将其解压缩,然后复制到/ usr / local / bin

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

更多信息:https : //trac.ffmpeg.org/wiki/Concatenate#protocol
https://superuser.com/a/314245


ffmpeg丢失,但avconv将其替换:askubuntu.com/questions/432542/…–
muru

2
是的,我使用avconv已有一段时间了,但是后来我需要ffmpeg具有的功能和avconv没有的功能,此后就没有使用过。这些天来感觉很浪费时间,如果我已经知道ffmpeg的话,看看avconv是否具有我需要的功能。
bmaupin

请感到受邀加入错误报告讨论。
orschiro

我已经尝试过了,但效果不佳;尝试output.mp3通过a 运行mp3val,您会看到各种错误,这些错误会在Chrome64 +中造成播放问题(请参见bugs.chromium.org/p/chromium/issues/detail?id=794782bugs.chromium.org/p/chromium/ issue / detail?id = 806601#c10
NinoŠkopac18年

很棒的解决方案。反正也可以正常化歌曲吗?
ar2015

8

如先前所建议,mp3wrap是一个很好的解决方案。但是,它可能并非始终都有效。据我所知,mp3wrap假定所有输入文件都具有相同的特征,例如VBR vs CBR,比特率等。如果不满足此假设,则可能会失败。在这种情况下,唯一的解决方案是将所有mp3文件解码为原始格式.wav,将它们与程序连接,然后sox通过将所有内容重新编码为mp3完成。


请注意,重新编码mp3文件(也称为“转码”)将导致质量下降。我不推荐它。
马丁·图尔诺伊

5

它基于单个字符进行字母排序。这意味着“ 01”在“ 1”之前,因为naught的值比1小。

这是一个例子。我有一个目录,其中包含名为1、2、3、04、05和06的文件。它们是包含各自文件名的文本文件:

test$ cat *
04
05
06
1
2
3

因此,是的。但是您需要确保所有文件都正确“填充”。

bash脚本的这一漂亮行使您可以直观地比较文件名,从而很容易发现任何错误:

for f in $(ls); do printf "%05s\n" "$f"; done

它的输出将如下所示:

   04
   05
   06
    1
    2
    3

如果不是这样,则将需要填充文件名:用于在StackOverflow上填充文件名的Bash脚本说明了如何执行此操作。


编辑。投票给Oli的答案,这要好得多。:P
我会离开我的,因为这会增加一些东西,但是您应该使用他的解决方案,

mp3wrap output.mp3 `ls -1 *.mp3 | sort`

请记住,sort仍然可以按照我上面描述的方式对内容进行排序,如果文件名长度不相等,则仍然需要填充文件名。


4

大多数人都建议mp3wrap,但它有缺点:生成的文件在某些​​播放器中没有报告其完整长度,因此您无法超越这一点。

mp3cat据我所知,这项工作做得很快而且很好。可以从http://mulholland.xyz/dev/mp3cat/下载该文件,并按以下方式使用:

mp3cat file1.mp3 file2.mp3 file3.mp3

另一种可能性是 sox

sudo apt-get install sox libsox-fmt-mp3
sox file1.mp3 file2.mp3 target.mp3

但它似乎很慢(可能会解码并重新编码音频?)




0

我喜欢bmaupin的评论,但可以使用以下方法产生自然的(版本)数字sort -V

find . -maxdepth 1 -iname '*.mp3' -print0 | sort -Vz | xargs -0 mp3wrap ../tmp.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.