使用FFmpeg从视频文件的开始位置到结束位置剪切部分[重复]


143

这个问题已经在这里有了答案:

我有30分钟的视频文件,但我想从00:09:23到00:25:33提取视频。

我可以使用定义起点-ss,但找不到终点位置。有什么帮助吗?

Answers:


244

安装ffmpeg

确保您下载了最新版本的ffmpeg,并且不要使用发行版随附的版本(例如Ubuntu)。各种发行版中的打包版本通常已过时,并且无法按预期运行。

自己编译

如何剪辑视频,而无需重新编码

使用它从视频剪切[start][duration]

ffmpeg -ss [start] -i in.mp4 -t [duration] -c copy out.mp4

在这里,这些选项的含义如下:

  • -ss指定开始时间,例如00:01:23.00083(以秒为单位)
  • -t 指定剪辑的持续时间(相同格式)。
  • 最近ffmpeg也有一个标志来提供结束时间-to
  • -c copy将第一个视频,音频和字幕比特流从输入复制到输出文件,而无需重新编码。这不会损害质量并使命令在几秒钟内运行。

如何以重新编码的方式剪切视频

如果您不-c copy选择此选项,ffmpeg则会根据您选择的格式自动对输出的视频和音频重新编码。要获得高质量的视频和音频,请分别阅读《x264编码指南》和《AAC编码指南》

例如:

ffmpeg -ss [start] -i in.mp4 -t [duration] -c:v libx264 -c:a aac -strict experimental -b:a 128k out.mp4

1
在Ubuntu 12:10上,-c:v和-c:a不起作用。我不得不使用“ -acodec复制和-vcodec复制”。
塞缪尔·兰帕

1
@Samuel然后,您使用的是过时的版本,它甚至不是真正的FFmpeg,而是Libav分支。请参阅:stackoverflow.com/a/9477756/1109017
slhck

谢谢你!如果您不指定持续时间,它将结束吗?
杰夫

@Jeff是的!(字符最少)
slhck

3
@Prateek在复制视频比特流(而不是重新编码)时,只能剪切关键帧。如果在第1、2和3秒有关键帧,但您想在第1.5秒进行剪切,则ffmpeg将等到第2秒才能开始剪切。这使其不准确。
slhck

26

我认为您现在可以使用以下命令。

ffmpeg -i inputFile -vcodec copy -acodec copy -ss 00:09:23 -to 00:25:33 outputFile

也可以看看ffmpeg Doc此Wiki页面


6
ffmpeg -i inputFile -c copy -ss 00:09:23 -to 00:25:33 outputFile更简单的版本
nwgat

3
我必须使用ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy -copyts cut.mp4(带有-copyts)版本,否则它剪切不正确(开头带有黑屏)。谢谢第二个链接。
Necronomicron

太好了,我最后想要做的就是计算端点的持续时间。
Tomasz Gandor '18

-to选项回答实际提出的问题。其余的答案是无礼的或过时的。
詹姆斯·鲍里

12

奇怪的是没有人建议使用trim 过滤器

删除除输入的第二分钟外的所有内容:

ffmpeg -i INPUT -vf trim=60:120

仅保留第一秒钟:

ffmpeg -i INPUT -vf trim=duration=1

将所有内容从秒13删除到秒58:

ffmpeg -i INPUT -vf trim=13:58 OUTPUT

8
是的,好提trimatrim。我通常在过滤时使用这些,但用户应注意过滤需要重新编码
llogan 2015年

你是我的英雄。我非常需要执行此操作的过滤器。
fahadash

5

您可以使用适用于Windows和Linux的两种方法。

有两种方法通过ffmpeg分割视频文件。第一个本身就不错,而且还不错-速度更快,但有时会创建带有某些缺陷的输出文件。因此,在这种情况下,还有第二种分割视频文件的方法:它速度相当慢,输出文件更大,但是看来它们始终与输入文件具有相同的质量级别。

方法1:

ffmpeg -ss <start> -i in1.avi -t <duration> -c copy out1.avi

方式2:

ffmpeg -ss <start> -i in1.avi -t <duration> out1.avi
  • <start>–视频ffmpeg的开始部分是剪切。格式:00:00:00.0000,表示小时:分钟:秒:毫秒。

  • <duration>–视频ffmpeg部分的持续时间将被删除。与上述格式相同。

例子:

ffmpeg -ss 01:19:00 -i in1.avi -t 00:05:00 -c copy out1.avi
ffmpeg -ss 01:19:00 -i in1.avi -t 00:05:00 out1.avi

ffmpeg从1小时19分0秒开始切出视频文件的一部分。视频片段的持续时间为5分钟0秒。


好的,谢谢。将签出文档,明天再试。
juGGaKNot

3
-sameq并不意味着“质量相同”,因此已从ffmpeg中删除。使用-codec copy代替。另外,不要忘记该-to选项。
llogan 2013年

我已经更正了您引用中的命令,因为它们已经过时了。请不要在未正确引用的情况下复制粘贴信息。
slhck

-1

你可以用这个

ffmpeg -sameq -ss clip_start -t duration  -i  original.ogg  clip.ogg

在这里,您必须提供视频时长。即。00:25:33-00:09:23


1
正如我在另一个答案中提到的那样:使用命令,您将重新编码文件,这绝对不是必需的,并且会导致质量降低和处理时间增加。
slhck 2012年

-2

我使用以下语法用ffmpef剪切视频:

ffmpeg -sameq -ss [start_seconds] -t [duration_seconds] -i [input_file] [outputfile]

-t用于设置持续时间(以秒为单位)-您无法指定结束时间,但这应该适合您。


1
为什么要设置FFmpeg重新编码文件?请注意,这-sameq根本不意味着“相同的质量”。
slhck 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.