【问题标题】:How to crop a mp3 from x to x+n using ffmpeg?如何使用 ffmpeg 将 mp3 从 x 裁剪为 x+n?
【发布时间】:2010-11-26 07:38:56
【问题描述】:

在this question 之后,我决定使用 ffmpeg 来裁剪 MP3。在another question 我发现了这种方法:

ffmpeg -t 30 -acodec copy -i inputfile.mp3 outputfile.mp3

问题是我不想裁剪前 30 秒,我想从 x 裁剪到 x+n,比如从 30 秒到 100 秒。我该怎么做?

我正在阅读man for ffmpeg,但这并不是很简单,特别是因为我刚刚发现了 ffmpeg,而且我不熟悉音频/视频编辑软件,所以任何指针都将不胜感激。

【问题讨论】:

    标签: mp3 ffmpeg crop


    【解决方案1】:

    看看 -t 和 -ss 参数。他们应该做你想做的。

    -t 持续时间

    限制转码/捕获的视频 序列到指定的持续时间 秒。 hh:mm:ss[.xxx] 语法也是 支持的。

    -ss位置'

    以秒为单位寻找给定的时间位置。 还支持 hh:mm:ss[.xxx] 语法。

    例如,ffmpeg -ss 30 -t 70 -i inputfile.mp3 -acodec copy outputfile.mp3 应该可以解决您提到的范围(30s-100s)。

    【讨论】:

    • 我觉得现在不行了,-acodec 的位置很重要,所以应该是:ffmpeg -ss 30 -t 70 -i inputfile.mp3 -acodec copy outputfile.mp3
    • 看来-i 选项应该是第一个
    • 首先制作 -i 将使其无法跳到前 30 秒,-ss 应始终位于 -i 之前
    • -t 应该在 -i 之后。 ffmpeg -ss 30 -i inputfile.mp3 -t 70 -acodec 复制 outputfile.mp3
    【解决方案2】:

    稍微扩展一下 Michael Madsens 的回答:

    我发现以下任何一种方法都可以满足我的音频文件修剪:

    • ffmpeg -ss -t -i inputfile -c:a copy outputfile
    • ffmpeg -ss -i inputfile -t -c:a copy outputfile

    注意:-acodec 是 codec:a 的别名,也可以指定为 c:a

    如Main Options FFMPEG Documentation中指定

    -t duration (input/output)

    • 用作输入选项时(在 -i 之前),限制从输入文件读取数据的持续时间。
    • 用作输出选项时(在输出 url 之前),在其持续时间达到持续时间后停止写入输出。

    -ss position (input/output)

    • 当用作输入选项时(在 -i 之前),在此输入文件中查找位置。
    • 用作输出选项时(在输出 url 之前),解码但丢弃输入,直到时间戳到达位置。

    duration 和 position 跟随 Time Duration Syntax :

    • [-][HH:]MM:SS[.m...] 或 [-]S+[.m...][s|ms|us]

    旁注:How to detect intervals of silence with FFMPEG 上的答案可能也很有趣。


    作为输入或输出的搜索和持续时间的区别

    请注意,在大多数格式中,不可能精确查找,因此 ffmpeg 将查找位置之前最近的查找点。当转码和 -accurate_seek 启用(默认)时,搜索点和位置之间的这个额外段将被解码并丢弃。在进行流复制或使用 -noaccurate_seek 时,将被保留。

    我对以下文件做了几个测试:

    Input #0, mp3, from 'test16s.mp3':
      Duration: 00:00:16.20, start: 0.025057, bitrate: 128 kb/s
        Stream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 128 kb/s
    

    将 Audacity 中的输出与原始输出进行比较,得到以下结果:

    • ffmpeg -ss 3 -t 5 -i test16s.mp3 -c:a copy out.mp3
      • 开始:3s+00756samples (3.017142857s)
      • 结束:8s+02062samples (8.04675737s)
      • 持续时间:5s+01306samples (5.029614512s)
    • ffmpeg -ss 3 -i test16s.mp3 -t 5 -c:a copy out.mp3
      • 开始:3s+00756samples (3.017142857s)
      • 结束:8s+00910samples (8.020634921s)
      • 持续时间:5s+00154samples (5.003492063s)
    • ffmpeg -i test16s.mp3 -ss 3 -t 5 -c:a copy out.mp3
      • 警告:这会创建一个文件,一些 mp3 解码器在尝试打开时出错。
      • 开始:2s+42184samples (2.956553288s)
      • 结束:8s+01071samples (8.024285714s)
      • 持续时间:5s+02987samples (5.067732426s)
    • ffmpeg -t 5 -i test16s.mp3 -ss 3 -c:a copy out.mp3
      • 警告:这会创建一个文件,一些 mp3 解码器在尝试打开时出错。
      • 开始:2s+42184samples (2.956553288s)
      • 结束:5s+02043samples (5.046326531s)
      • 持续时间:2s+03959 个样本 (2.089773243)

    在尝试查看搜索跳转时,我发现了有趣的结果 使用:

    • ffmpeg -ss -i test16s.mp3 -t 5 -c:a copy out.mp3

      • = 3、2.99、2.98、2.97
        • 开始:3s+00756samples (3.017142857s),持续时间:5s+00154
      • = 2.96
        • 开始:同上,持续时间:4s+41951
      • = 2.95
        • 开始:2s+43704 (2.991020408),结束:7s+42707 持续时间:4s+43103
      • = 2.94,2.93
        • 开始:同上,持续时间:4s+41951
      • = 2.92
        • 开始:2s+42552(2.964897959s),持续时间:4s+43103
    • ffmpeg -ss -t 5 -i test16s.mp3 -c:a copy out.mp3

      • = 3
        • 开始:3s+00756 (3.017142857s),持续时间:5s+01306 (5.029614512s)
      • = 2.99、2.98、2.97
        • 开始:相同,持续时间:5s+00155
      • = 2.96
        • 开始:相同,持续时间:4s+43103
      • = 2.95
        • 开始:2s+43704 (2.991020408),结束:7s+43859 持续时间:5s+00155
      • = 2.94,2.93
        • 开始:相同,持续时间:4s+43103
      • = 2.92
        • 开始:2s+42552 (2.964897959s),持续时间:5s+00155

    结论是,使用 Stream Copy,在我的特定文件中看起来好像是最小搜索分辨率,(音频:mp3,44100 Hz,立体声,fltp,128 kb/s),是:

    • Seek Step of : 1152 个样本,26.122449 ms
    • 寻位误差高达 70 毫秒

    【讨论】:

    • 很好的解释。如果有人遇到错误,请检查 -> stackoverflow.com/a/63431041/7783718
    • 确保将-i input.mp3设为ffmpeg的第一个参数
    • 嗨@Natim,感谢您的评论。您能否详细说明为什么建议将输入作为第一个参数?
    • 当我在 ffmpeg 4.3.1 中使用ffmpeg -ss 59:05 -c:a copy -t 90 -i input.mp3 output.mp3 时,我遇到了Unknown decoder 'copy',通过将-i 放在第一位(或至少在-c:a copy 之前)解决了这个问题
    • aha,是的,它与“选项”-c:a copy 有关,如果您将-c:a copy 放在输入定义之前-i input.mp ffmpeg 试图将解码器强制为您已指定。 copy 不是解码器,而是指示ffmpeg 直接复制,不对输入文件进行解码和重新编码,这就是为什么在流复制的情况下需要在定义输入文件后指定它。 More info on copy
    猜你喜欢
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    相关资源
    最近更新 更多