稍微扩展一下 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)
在尝试查看搜索跳转时,我发现了有趣的结果
使用:
结论是,使用 Stream Copy,在我的特定文件中看起来好像是最小搜索分辨率,(音频:mp3,44100 Hz,立体声,fltp,128 kb/s),是:
- Seek Step of : 1152 个样本,26.122449 ms
- 寻位误差高达 70 毫秒