57

这个问题之后,我决定使用 ffmpeg 来裁剪 MP3。在另一个问题上,我发现了这种方法:

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

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

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

4

2 回答 2

99

看一下 -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)做技巧。

于 2009-09-07T19:48:58.687 回答
10

扩展一下 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

主要选项 FFMPEG 文档中所述

-t duration (input/output)

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

-ss position (input/output)

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

durationposition遵循持续时间语法

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

旁注:关于如何使用 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+03959samples (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,似乎我的特定文件中的最小搜索分辨率(Audio: mp3, 44100 Hz, stereo, fltp, 128 kb/s)是:

  • 寻道步长:1152 个样本,26.122449 毫秒
  • 寻找位置误差高达 70 ms
于 2020-12-01T22:41:30.203 回答