AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 20507
Accepted
Bakhtiyor
Bakhtiyor
Asked: 2011-01-08 11:04:21 +0800 CST2011-01-08 11:04:21 +0800 CST 2011-01-08 11:04:21 +0800 CST

将多个 .mp3 文件连接成一个 .mp3

  • 772

正如这里建议的那样,我正在使用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 文件,这是我所期望的,但我需要确保上面的命令按升序选择文件。

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

谢谢先生!

command-line
  • 9 9 个回答
  • 64340 Views

9 个回答

  • Voted
  1. Best Answer
    Oli
    2011-01-08T11:36:14+08:002011-01-08T11:36:14+08:00

    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. 这很容易解决。

    • 77
  2. bmaupin
    2014-07-31T17:55:22+08:002014-07-31T17:55:22+08:00

    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

    • 43
  3. loevborg
    2011-01-09T03:41:00+08:002011-01-09T03:41:00+08:00

    如前所述,mp3wrap是一个很好的解决方案。不过,它可能并非一直有效。据我所知,mp3wrap假设所有输入文件都具有相同的特征,例如 VBR 与 CBR、比特率等。如果不满足这个假设,它很可能会失败。在这种情况下,唯一的解决方案是将所有 mp3 文件解码为原始格式,例如.wav,将它们与类似的程序连接起来,sox然后将所有文件重新编码为 mp3。

    • 8
  4. josinalvo
    2017-12-24T07:20:45+08:002017-12-24T07:20:45+08:00

    大多数人都在建议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
    

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

    • 6
  5. Stefano Palazzo
    2011-01-08T11:33:28+08:002011-01-08T11:33:28+08:00

    它基于单个字符进行字母排序。这意味着“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 脚本解释了如何执行此操作。


    编辑。投票给奥利的答案,这要好得多。:P
    我会留下我的,因为它添加了一些东西,但你应该使用他的解决方案,

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

    请记住,sort仍然会按照我上面描述的方式对事物进行排序,如果它们的长度不相等,您仍然需要填充文件名。

    • 5
  6. orschiro
    2016-01-21T23:54:17+08:002016-01-21T23:54:17+08:00

    我发现在线服务audio-joiner工作得很好,并保留了正确的时间戳(与 mp3wrap 相反)。

    • 3
  7. MacMartin
    2021-01-19T03:06:13+08:002021-01-19T03:06:13+08:00
    perl -E'say qq(file '\''$_'\'') for <*>' * > file.list && ffmpeg -f concat -safe 0 -i file.list -c copy mybigfile.mp3'
    
    1. 在更改到包含要连接的所有文件的文件夹后,将此行复制到终端(您拥有perl且可用的终端)ffmpeg
    2. 它会导致关于“file.list”的错误(因为“file.list”将被写入“file.list”-file)但没关系,它仍然有效
    3. 总而言之,这只是将文件夹内容写入“file.list”文件并对其进行格式化。
    4. 之后,它将文件合并为一个 mp3 文件ffmpeg
    • 1
  8. zhoux
    2017-02-20T05:38:14+08:002017-02-20T05:38:14+08:00

    我喜欢bmaupin 的评论,但它可以通过使用产生自然排序的(版本)数字sort -V:

    find . -maxdepth 1 -iname '*.mp3' -print0 | sort -Vz | xargs -0 mp3wrap ../tmp.mp3
    

    而且您不必处理' " () [] {}文件名中的特殊字符。

    • 0
  9. Metamorphic
    2021-02-10T17:35:54+08:002021-02-10T17:35:54+08:00

    让我总结一下其他答案:

    • mp3wrap将mp3文件连接成一种特殊的“concatenated mp3 file”格式,这种格式速度更快,因为它不需要重新编码,但缺点是不是一个有长度的普通mp3文件等等。

    • ffmpeg -i "concat:file1.mp3|file2.mp3" -acodec copy output.mp3输入起来很麻烦,但应该很好用,因为它是用于连接视频文件的标准命令。但是,在我的测试中,它在输入文件转换中引入了故障。

    • sox file1.mp3 file2.mp3 target.mp3应该很好用,当然更容易打字,但它也在我的测试中引入了故障。

    • 即使我使用sox先将每个 .mp3 文件转换为 .wav,然后sox file1.wav file2.wav target.wav,输出也包含可听见的故障。

    • 但是,如果我使用mpg123将 mp3 文件解码为 .wav,那么我可以将 .wav 文件与 Sox 连接,而不会听到故障。这表明sox(并且可能ffmpeg)的问题在于 mp3 文件的解码。

    • mp3cat显然效果很好,但我懒得测试它,因为在我的发行版的存储库中找不到它

    奇怪的是还没有人提到mpg123。尽管在其 20 多年的历史早期就受到安全和许可问题的困扰,但它是最初的 mp3 播放器之一,应该相当稳定。由于它在将 mp3 参数发送到声卡之前会自动连接其 mp3 参数(以无故障的方式),因此我们只需使用-w选项告诉它输出到 Wave 文件即可。然后lame将其编码回mp3。这是一个完成此任务的脚本:

    #!/bin/bash
    FILES=("$@")
    OUTPUT=$(mktemp -t mp3-concat.XXXXXX.mp3 -u)
    WAVE=$(mktemp -t mp3-concat.XXXXXX.wav -u)
    mpg123 -w $WAVE ${FILES[@]}
    lame $WAVE $OUTPUT
    cat $OUTPUT
    rm $WAVE $OUTPUT
    

    使用示例:

    $ mp3-concat file1.mp3 file2.mp3 > joined.mp3
    
    • 0

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    我需要什么命令来解压缩/提取 .tar.gz 文件?

    • 8 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Marko Smith

    如何使用命令行将用户添加为新的 sudoer?

    • 7 个回答
  • Marko Smith

    更改文件夹权限和所有权

    • 9 个回答
  • Martin Hope
    EmmyS 我需要什么命令来解压缩/提取 .tar.gz 文件? 2011-02-09 14:50:41 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve