使用FFmpeg根据开始和结束时间剪切视频
1. 概述
在本教程中,我们将了解如何使用 Linux 命令行剪切视频。我们将介绍一些使用 FFmpeg 剪辑视频的方法,FFmpeg 是为视频操作提供的一套工具。
2. 安装最新版本
较新版本的FFmpeg 支持更多选项和过滤器。因此,我们需要最新版本的 FFmpeg。大多数发行版的包存储库中都提供了ffmpeg包。我们可以使用yum或apt 来安装 FFmpeg。
此外,我们还可以使用Snap 安装最新版本的 FFmpeg:
$ sudo snap install ffmpeg
一旦安装了FFmpeg,我们可以通过以下命令进行验证:
$ ffmpeg -version
ffmpeg version n4.4 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 11.1.0 (GCC)
3. 重新编码剪辑
基本而言,视频编码是压缩和准备视频以供输出的过程,从而使视频尺寸合理地小且处理速度快。使用 FFmpeg,我们可以剪切视频的一部分,重新编码该部分,最后将其保存为文件。
默认情况下,重新编码将使用原始视频中使用的编解码器。让我们看看它的实际效果:
$ ffmpeg -i my_video.mp4 -ss 00:00:15 -t 00:00:10 -async -1 clip.mp4
frame= 250 fps= 19 q=-1.0 Lsize= 5297kB time=00:00:09.98 bitrate=4346.5kbits/s speed=0.767x
video:5132kB audio:157kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.167893%
现在,让我们回顾一下我们在这里使用的每个选项和参数:
- -i参数用于指定输入文件。
- -ss参数寻找指定为参数的时间戳。
- -t参数用于指定剪辑的持续时间。在这种情况下,它是 10 秒。
- -async选项指定是收缩还是拉伸音频以匹配时间戳*。*值 1将更正流的开始,而无需稍后进行任何更正。
上面的命令将处理my_video.mp4输入文件并在视频中向前搜索 15 秒。接下来,它将视频从00:00:15 剪切到00:00:25。-t的值被添加到寻找的时间戳,即 15 秒。最后,它将执行音频校正以匹配时间戳并使用原始my_video.mp4编解码器重新编码视频。
或者,如果我们需要更精确的时间剪辑,我们可以手动将关键帧添加到剪辑视频的开头和结尾:
$ ffmpeg -i my_video.mp4 -force_key_frames 00:00:15,00:00:25 clip.mp4
我们使用了*-force_key_frames*选项,因为视频剪辑发生在关键帧处。但是,如果第一帧不是关键帧,则剪辑中第一个关键帧之前的帧将无法播放。因此,我们强制 FFmpeg 在第一帧和最后一帧添加关键帧,以确保我们编码一个完美的剪辑。此外,为了限制错误,我们应该避免添加大量关键帧。
我们应该注意到,重新编码所花费的时间取决于所使用的编解码器的大小和类型。但是,我们将在下一节中介绍另一种方法。
4. 通过 Stream Copy 即时剪辑
在某些情况下,我们可能不想重新编码视频。幸运的是,FFmpeg 允许将编解码器从原始视频复制到修剪后的视频,这只需几秒钟。
一个视频可能有两个编解码器——一个用于视频轨道,另一个用于音频轨道。如果我们需要将两个编解码器复制到剪切剪辑,我们可以简单地使用*-c*选项:
$ ffmpeg -i my_video.mp4 -ss 00:00:15 -to 00:00:25 -c copy clip.mp4
frame= 247 fps=0.0 q=-1.0 Lsize= 3455kB time=00:00:09.98 bitrate=2835.6kbits/s speed= 745x
video:3279kB audio:167kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.263277%
让我们回顾一下我们在命令中使用的选项:
- -to选项指定剪辑的结尾。也就是说,视频将从00:00:15 剪切到 00:00:25
- -c选项告诉 FFmpeg将音频和视频编解码器从my_video.mp4容器复制到clip.mp4容器
如果我们对输入和输出视频使用相同的容器,则上述命令效果很好。如果我们使用不同的容器,我们将看到容器不匹配错误。幸运的是,有一个解决方法。如果我们有两个不同的容器,我们可以分别指定复制选项:
$ ffmpeg -i my_video.mkv -ss 00:00:15 -to 00:00:25 -acodec copy -vcodec copy clip.mp4
请注意,输入文件使用的是 MKV 容器,而输出文件使用的是 MP4 容器。
5. 使用trim过滤器进行剪辑
这是第一种方法的替代方法,它也对剪切的视频进行重新编码。当我们有一个简短的视频时,它很有用,最好不到一分钟,我们想剪掉它的一小部分:
$ ffmpeg -i my_video -vf trim=10:25,setpts=PTS-STARTPTS clip.mp4
仔细查看上述命令中的选项:
- -vf选项指定我们正在使用视频过滤器。
- 我们为trim过滤器提供了值10:25,它将视频从00:00:10切片到00:00:25。
- setpts过滤器为剪辑中的每个视频帧设置演示时间戳。在我们的例子中,我们将其值设置为PTS-STARTPTS以确保我们的剪辑在开始时不会延迟或停止,并且帧相对于setpts值(即 0)是同步的。