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

x74*_*x61 206 ffmpeg video-editing

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

我可以用 定义开始位置-ss,但找不到结束位置的位置。请问有什么帮助吗?

slh*_*hck 328

安装 ffmpeg

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

或者自己编译

如何在不重新编码的情况下剪切视频

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

ffmpeg -ss [start] -i in.mp4 -t [duration] -c copy out.mp4
Run Code Online (Sandbox Code Playgroud)

使用它来剪切视频[start][end]

ffmpeg -ss [start] -i in.mp4 -to [end] -c copy -copyts out.mp4
Run Code Online (Sandbox Code Playgroud)

此处,选项的含义如下:

  • -ss指定开始时间,例如00:01:23.00083(以秒为单位)
  • -t 指定剪辑的持续时间(相同格式)。
  • 代替-t,您还可以使用-to,它指定结束时间(需要-copytsif -ssis before -i,以便更快地查找)。请注意,如果您使用了-ss,则必须从-to时间戳中减去它。例如,如果您使用 剪切-ss 3 -i in.mp4 -to 5,输出将是五秒长。
  • -c copy将第一个视频、音频和字幕比特流从输入复制到输出文件,无需重新编码。这不会损害质量并使命令在几秒钟内运行。

有关更多信息,请参阅https://trac.ffmpeg.org/wiki/Seeking

如何剪切视频,重新编码

如果您省略该-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
Run Code Online (Sandbox Code Playgroud)

  • @Prateek 复制视频比特流(而不是重新编码)时,只能在[关键帧](https://en.wikipedia.org/wiki/Video_compression_picture_types#Intra_coded_frames.2Fslices_.28I.E2.80.91frames.2Fslices_or_Key_frames)处进行剪切.29)。如果在第 1、2、3 秒有关键帧,但您想在第 1.5 秒剪切,那么 ffmpeg 将等到第 2 秒才能开始剪切。这使它不准确。 (6认同)
  • 即使没有`-copyts`,`-to` 也并不总是“从”`-ss` 开始,@Maggyero 我使用移动`-to` 选项来配置输入而不是输出,因此它只是另一种解决方案。`ffmpeg -ss [start] -to [stop] -i in.mp4 -c copy out.mp4` 这样我的停止时间是正确的,尽管开始时间是正确的。我想知道这是否也是@lustig 将 `-ss` 移动到输出的原因,而他们不知道为什么。答案甚至没有提到`-copyts`!它应该,因为它是这里最简单的解决方案!我更喜欢重新排序参数,但我想它并不简单。 (4认同)

小智 44

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

ffmpeg -i inputFile -vcodec copy -acodec copy -ss 00:09:23 -to 00:25:33 outputFile
Run Code Online (Sandbox Code Playgroud)

也看看ffmpeg Doc,或这个 wiki 页面

  • `ffmpeg -i inputFile -c copy -ss 00:09:23 -to 00:25:33 outputFile` 更简单的版本 (11认同)
  • 我不得不使用`ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy -copyts cut.mp4` 版本(带有`-copyts`),否则剪切不正确(带有黑色)画面一开始)。谢谢你的第二个链接。 (5认同)
  • 这很棒,我最不想要的就是从端点计算持续时间。 (2认同)
  • -to 选项回答了实际提出的问题。其余的答案要么是无礼的,要么是过时的。 (2认同)

mal*_*lat 18

奇怪的是没有人建议使用trim filter

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

ffmpeg -i INPUT -vf trim=60:120
Run Code Online (Sandbox Code Playgroud)

只保留第一秒:

ffmpeg -i INPUT -vf trim=duration=1
Run Code Online (Sandbox Code Playgroud)

删除除第 13 秒到第 58 秒以外的所有内容:

ffmpeg -i INPUT -vf trim=13:58 OUTPUT
Run Code Online (Sandbox Code Playgroud)

  • 是的,很高兴提到 `trim` 和 `atrim`。我通常在过滤时使用这些,但用户应该注意**过滤需要重新编码**。 (18认同)

Chr*_*ian 8

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

ffmpeg 有两种分割视频文件的方法。第一个本身就很好,不仅如此 - 它更快,但有时会创建具有某些缺陷的输出文件。所以对于这些情况,有第二种分割视频文件的方法:它相当慢,输出文件更大,但它们似乎总是与使用的输入文件具有相同的质量水平。

方式一:

ffmpeg -ss <start> -i in1.avi -t <duration> -c copy out1.avi
Run Code Online (Sandbox Code Playgroud)

方式二:

ffmpeg -ss <start> -i in1.avi -t <duration> out1.avi
Run Code Online (Sandbox Code Playgroud)
  • <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
Run Code Online (Sandbox Code Playgroud)

ffmpeg 从 1 小时 19 分 0 秒开始剪切视频文件的一部分。截取的视频序列时长为 5 分 0 秒。

  • [`-sameq` 并不意味着“相同的质量”](http://superuser.com/a/478550/110524) 已从 ffmpeg 中删除。改用`-codec copy`。另外,不要忘记 `-to` 选项。 (3认同)

小智 -3

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

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

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


归档时间:

查看次数:

359128 次

最近记录:

4 年,1 月 前