如何以 3 种简单的方式使用 FFmpeg 剪切视频(提取/修剪)
2020 年 10 月 12 日 Krishna Rao Vijayanagar FFmpeg
在本教程中,我们将了解如何使用 FFmpeg 以 3 种不同的方式剪切/修剪/提取视频文件的一部分。有一些快速的方法可以使用不太精确的查找和复制视频来实现这一点,并且有一种帧精确技术,虽然速度很慢,但可以选择重新编码视频。
寻找使用-ss参数
假设您要提取视频的一部分——比如从第 10 秒到第 20 秒。
您需要做的第一件事是告诉 FFmpeg搜索到第 10 秒,对吗?这是使用FFmpeg 命令行中的 -ss
参数实现的,语法为 –
./ffmpeg -ss <time> -i <inputvideo> .......
在这里,时间被指定为HH:MM:SS.MILLISECONDS
。例如,您可以告诉 FFmpeg 寻找01:02:03——即电影 1 小时的第 2 分钟的第 3 秒!
指定结束时间
使用-ss
,我们指定了开始时间。现在,让我们学习指定结束时间。而且,如果我们将这两者放在一起,我们可以使用 FFmpeg 有效地剪切/拼接视频。
-t
范围
您可以使用参数指定所需剪辑的持续时间-t
。例如,-ss 40 -t 10
指示 FFmpeg 从第 40 秒开始提取 10 秒的视频。
-to
范围
您可以使用参数指定结束时间-to。例如,-ss 40 -to 70
指示 FFmpeg 从第 40 秒到第 70 秒提取 30 秒的视频。
注意:如果你同时使用 -t 和 -to,那么只有-t
将被使用。
使用重新编码进行剪切/修剪
如果您在剪切/修剪时重新编码您的视频,那么您将获得一个精确到帧的剪切,因为 FFmpeg 将重新编码视频并从 I 帧开始。这是使用输出搜索的命令行。在此示例中,您将指示 FFmpeg 读取名为inputVideo.mp4 并提取 5 秒的视频,从第 3 秒开始到第 8 秒结束 - 同时使用libx264
.
ffmpeg -i inputVideo.mp4 -ss 00:03 -to 00:08 -c:v libx264 -crf 30 trim_opseek_encode.mp4
您还可以使用此命令行以特定比特率或质量重新编码,使用crf
更改分辨率等。
请记住,此选项将花费大量时间和资源,因为您正在执行重新编码。但是,它确实有不可忽视的优点。
我剪切了一个 5 秒的部分并使用libx264编码. 您可以看到它在请求的时间准确启动,没有任何卡顿或黑框。如果仔细观察,时间戳会表明这一点。
这是因为 FFmpeg 从一开始就对视频进行重新编码,并且可以根据需要插入 I 帧以生成视频的帧精确剪辑。
无需重新编码即可快速剪切/修剪(使用复制和输入搜索)
这是一个简单的命令行,您可以使用它来剪切/修剪/提取视频的一部分——快!
ffmpeg -ss 00:00:03 -i inputVideo.mp4 -to 00:00:08 -c:v copy -c:a copy trim_ipseek_copy.mp4
参数很容易理解。您正在指示 FFmpeg 读取名为 inputVideo.mp4 并提取 5 秒的视频,该视频从第 3 秒开始到第 8 秒结束。
相关: 使用 FFmpeg 进行音频转码 - 使用 FFmpeg 轻松更改音频编解码器
此外,您告诉 FFmpeg 复制音频和视频而不执行重新编码——这非常快!
将输入搜索参数-ss
放在参数-i
之前, 并且非常快,因为 FFmpeg 从I帧跳转到I帧以到达搜索点。
有什么问题吗?
由于搜索操作在 I 帧之间跳转,它不会准确地停止在您请求的帧(或时间)上。它将搜索最近的 I 帧并从该点开始复制操作。
使用不重新编码的输出搜索进行剪切/修剪
如果我们在-i
参数之后插入-ss
参数,则称为输出搜索。
ffmpeg -i inputVideo.mp4 -ss 00:00:03 -to 00:00:08 -c:v copy -c:a copy trimmedVideo.mp4
但是,这里又是一个问题。在视频压缩中,您拥有独立编码的 I 帧,并且您拥有依赖于其他帧进行解码的预测帧 (P, B)。
如果您指定的开始时间落在预测帧上,则复制操作将从该帧开始(称为 X)。输出中可能缺少“X”需要解码的帧!因此,在到达第一个 I 帧之前,输出视频可能不会顺利启动,并且可能会出现一些卡顿或黑色视频。
这是输出。
您可以看到时间戳从第 5 秒左右开始,一直持续到第 8 秒。同样,类似于输入搜索,它无法找到 I 帧来执行准确的剪辑。
结论
有了它——使用 FFmpeg 剪切、修剪、提取部分视频的三种简单方法。这三种方法都满足不同的需求,所以一定要尝试一下,了解您的要求,并为您的项目使用正确的方法!
请在此处访问我们的其他 FFmpeg 教程。
谢谢你,下次见!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。