使用ffmpeg从/到指定位置剪切音频

85

我需要从音频文件中剪辑部分内容,从一个位置到另一个位置。当我尝试使用以下命令时:

ffmpeg -ss 132 -t 139 -i original.mp3 new.mp3

从第132秒开始,将接下来的139秒添加到新文件中。

我需要的是从132秒到139秒的内容。

当我尝试时

ffmpeg -ss 132 -to 139 -i original.mp3 new.mp3

出现错误:

Unrecognized option 'to'
Failed to set value '139' for option 'to'

(我不想告诉你需要多少秒,只是从/到的时间)。

-- 我的ffmpeg版本是0.8.20-6:0.8.20-0+deb7u1(使用gcc 4.7.2于2017年1月19日11:13:36构建)。当我尝试更新它(apt-get install ffmpeg)时,它告诉我“ffmpeg已经是最新版本”。

6个回答

114

使用FFmpeg时,参数的顺序是非常重要的。直接放在输入之前的所有参数将应用于该输入。同样地,对于输出也是如此... 直接放在输出之前的参数将适用于该输出。

考虑以下命令行:

ffmpeg -ss 132 -i input.mp3 output.mp3

-ss是用于定位的参数,因此FFmpeg将输入文件定位到132秒处,并将其视为00:00:00。相对于输出的其余FFmpeg命令不知道或不关心输入来自何处或如何进行定位。因此,当您使用-to-t时,所给出的时间或长度需要相对于输入。也就是说,如果您想要从第132秒到第139秒,您需要将输入定位到132(-ss 132 -i input.mp3),然后运行输出7秒钟(-t 7 output.mp3-to 00:00:07 output.mp3)。

您可以在文档中了解更多信息,以及有关帧精确或非帧精确(用于重新编码或不重新编码)的详细信息:https://trac.ffmpeg.org/wiki/Seeking

至于-to不存在的问题...

正如我上面所示,我拥有最新版本的软件。

你绝对不可能远程拥有最新版本的FFmpeg。你可能拥有任何分支的任何软件包管理器的最新构建版本,而且它可能是今年构建的,但如果你查看下载页面,截至本文撰写时,最新版本是3.3.4。https://www.ffmpeg.org/download.html

你可以处理软件包管理器和依赖关系问题,或者根据你的许可限制获取最近的静态构建版本:https://www.johnvansickle.com/ffmpeg/

最后,请考虑使用-acodec copy来确保你不会通过转码进一步损害音频质量,因为你保持相同的格式。


3
抱歉,我不知道你对进行小幅修改以提高准确性比较敏感。 - llogan
7
@LordNeckbeard,我并不是这样认为的,但你所做的修改远远超出了细微的编辑,没有为我已经写的内容增加任何实质上的东西,并且还添加了一些额外的观点,这些观点将被归属于我。 (并不是我不同意你对于程序漏洞等问题的看法。只是我更希望你将评论保留为归属于你的评论。) - Brad
3
ffmpeg -ss <T0> -i <input file> -t <T1 - T0(duration in seconds)> <out file> or ffmpeg -ss <T0> -i <input file> -t <T0(format 00:00:00) + (T1 - T0)> <out file> for example ffmpeg -ss 00:15:30 -i "a.mp3" -t 25 "b.mp3" or ffmpeg -ss 00:15:30 -i "a.mp3" -t 00:00:25 "b.mp3" - chankruze
1
我的测试表明,如果我使用“-to”来指定结束时间,我需要在“-ss”之前放置“-i input”,例如:ffmpeg -i input.mp3 -ss 00:01:30 -to 00:02:50 output.mp3 - Jason

57

这对我有用

ffmpeg -ss 60 -i input-audio.aac -t 15 -c copy output.aac
  • -ss 60 的意思是,“从第60秒开始”
  • -t 15 表示音频输出的长度为15秒。在这种情况下,输出音频的时长为15秒。

12
ffmpeg -i "original.mp3" -ss 60 -to 70 "new.mp3"

这对我有效。


请注意,这是一种非常低效的查找方式。在开始输出之前,查找输入要高效得多。 - Brad
2
@Brad 这取决于原帖作者的需求。在 -i 之前加上 -ss 意味着先进行搜索,这是一种更快到达起始时间戳的方法。然而,这种方法可能并不总是产生精确的帧切割。如果您使用的是 ffmpeg 2.1 或更高版本,则 -ss 在 -i 之前将会很快,因为现在 -ss 已经是帧精确的了。请参阅此链接以获取更多详细信息:https://trac.ffmpeg.org/wiki/Seeking - Rahul Kadukar

12

-ss 是一个输入选项,而 -t-to 则是输出选项。因此你需要这样做:

ffmpeg -ss 60 -i 'les nuits 128k.m4a' -to 70 -c copy out.m4a

它给了我一个错误:无法识别选项“to”,无法为选项“to”设置值“139”,并且没有创建输出文件。 - Mike
@Mike,那是4年前添加的,所以那就是你的问题。http://github.com/FFmpeg/FFmpeg/commit/2d70446 - user8611714
正如我上面所展示的,我有最新版本的软件。那么你认为问题是什么? - Mike

2

使用 FFmpeg 剪辑音频文件:

开始时间 = 00:00:00, 结束时间 = 00:00:10

音频路径 = audio.mp3, 输出路径 = outputFile.mp3

命令 = "-ss $startDuration -i $audioPath -c copy -t $endDuration $mp3Output"


0

针对 Mac:

brew install ffmpeg

ffmpeg -ss start_second -to end_second -i input.mp3 output.mp3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接