如何使用ffmpeg将mp3从x裁剪为x + n?

时间:2009-09-07 19:43:13

标签: mp3 ffmpeg crop

关注this question我决定使用ffmpeg裁剪MP3。在another question我发现了这种方式:

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

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

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

2 个答案:

答案 0 :(得分:57)

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

  

-t持续时间

     

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

     

-ss position'

     

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

例如,ffmpeg -ss 30 -t 70 -i inputfile.mp3 -acodec copy outputfile.mp3应该为您提到的范围(30s-100s)提供技巧。

答案 1 :(得分:1)

进一步说明迈克尔·麦德森(Michael Madsens)的答案:

对于修剪音频文件,我发现以下两种令人满意的方法:

  • ffmpeg -ss <开始位置> -t <持续时间> -i inputfile -c:a copy outputfile
  • ffmpeg -ss <开始位置> -i inputfile -t <持续时间> -c:a copy outputfile

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

根据Main Options FFMPEG Documentation

中的规定

-t duration (input/output)

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

-ss position (input/output)

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

durationposition跟随Time Duration Syntax

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

侧面注:关于How to detect intervals of silence with FFMPEG的答案可能也很有趣。


搜寻和输入或输出持续时间之间的差异

请注意,在大多数格式中,无法精确搜索,因此ffm​​peg将搜索到位置之前最接近的搜索点。启用转码和-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
    • 开始:3 s + 00756样本(3.017142857s)
    • 末尾:8秒+02062个样本(8.04675737秒)
    • 持续时间:5s + 01306samples(5.029614512s)
  • ffmpeg -ss 3 -i test16s.mp3 -t 5 -c:a copy out.mp3
    • 开始:3 s + 00756样本(3.017142857s)
    • 末尾:8s + 00910个样本(8.020634921s)
    • 持续时间:5s + 00154个样本(5.003492063s)
  • ffmpeg -i test16s.mp3 -ss 3 -t 5 -c:a copy out.mp3
    • 警告:这会创建一个文件,某些mp3解码器在尝试打开该文件时会出错。
    • 开始:2s + 42184个样本(2.956553288s)
    • 末尾:8s + 01071个样本(8.024285714s)
    • 持续时间:5s + 02987样本(5.067732426s)
  • ffmpeg -t 5 -i test16s.mp3 -ss 3 -c:a copy out.mp3
    • 警告:这会创建一个文件,某些mp3解码器在尝试打开该文件时会出错。
    • 开始:2s + 42184个样本(2.956553288s)
    • 末尾:5秒+02043个样本(5.046326531秒)
    • 持续时间:2s + 03959样本(2.089773243)

为了尝试查看寻道跳跃,我发现了有趣的结果 使用:

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

    • <秒> = 3、2.99、2.98、2.97
      • 开始:3s + 00756采样(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

使用流复制得出结论,就好像我的特定文件中的最小搜索分辨率一样,(音频:mp3、44100 Hz,立体声,fltp,128 kb / s)< / em>是:

  • 搜索步骤:1152个样本,26.122449毫秒
  • 寻找位置误差高达70毫秒