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

San*_*dra 81 linux bash

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

这可能“有效”,但显然这不是正确的方法,因为每个标头和 IDv3 标签集也将连接在一起。

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

mplayer/mencoder/ffmpeg 能做到吗?

Amb*_*jak 103

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

ffmpeg -i "concat:file1.mp3|file2.mp3" -acodec copy output.mp3
Run Code Online (Sandbox Code Playgroud)

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

ffmpeg -i "concat:file1.mp3|file2.mp3" -i file2.mp3 -acodec copy test.mp3 -map_metadata 0:1
Run Code Online (Sandbox Code Playgroud)

如果要从这两个元数据构建元数据,则必须手动完成。您可以转储文件的元数据

ffmpeg -i file1.mp3 -f ffmetadata file1.metadata
Run Code Online (Sandbox Code Playgroud)

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

ffmpeg -i "concat:file1.mp3|file2.mp3" -acodec copy -metadata "title=Some Song" test.mp3 -map_metadata 0:-1
Run Code Online (Sandbox Code Playgroud)

  • 只是想为其他人澄清一些事情:`-acodec` 意味着将使用音频编解码器,而 `copy` 意味着将只有多路复用和多路分离,但没有编码/转码(即非常快且没有质量损失) (4认同)
  • 当必须连接多个文件时(如原始问题所示),以下代码片段可能会派上用场来构造字符串“file1.mp3|file2.mp3|file3.mp3”等: `s="";对于文件 *.mp3 中的 i;做 s="$s|$i";完毕;回声 ${s:1}` (3认同)
  • 这是一个很好的答案,但是几乎在所有情况下,生成的 MP3 文件在文件连接的位置之间都有一个短的(亚秒)间隔。因此,如果您尝试合并 MP3 曲目以创建无缝播放专辑/集/任何内容,这将不太正确。 (2认同)

Mil*_*lbe 25

这会将一个充满 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'
Run Code Online (Sandbox Code Playgroud)

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

$ ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp3
Run Code Online (Sandbox Code Playgroud)

  • 如果您有一长串短 mp3 文件,这非常有用!谢谢。 (3认同)

小智 14

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


Hap*_*ace 9

zsh:

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

audio-join output.mp3 *.mp3
Run Code Online (Sandbox Code Playgroud)


小智 5

根据 Miles Wolbe 的回答,这是一个对我有用的单线:

ls *.mp3 | \
    sed -e "s/\(.*\)/file '\1'/" | \
    ffmpeg -protocol_whitelist 'file,pipe' -f concat -i - -c copy output.mp3
Run Code Online (Sandbox Code Playgroud)

  • 如果文件名包含空格,则添加“-safe 0”。错误:不安全的文件名“100 Vortrag.mp3”管道:: 不允许操作 (2认同)