如何使用 ffmpeg 向视频添加额外的关键帧?

jju*_*anf 5 video ffmpeg iframe frame video-encoding

我想在特定间隔(20 帧)的基础上向我的视频添加关键帧。

因此我在以下命令中使用了ffmpeg

ffmpeg -i <input> -vcodec libx264 -x264-params keyint=20:scenecut=0 -acodec copy out.mp4
Run Code Online (Sandbox Code Playgroud)

输出是,我每 20 帧获得一次关键帧。

但是原始视频有一个关键帧,例如在 frame 1, 12, 89....

现在我在帧中有关键帧 1, 21, 41....

我不想替换已经存在的关键帧。我想添加额外的关键帧,所以它看起来像这样:

frame 1, 12, 21, 41, 89....
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Gya*_*yan 6

force_key_frames有一个选项可以镜像源流的关键帧节奏(尚未记录 - 在我的待办事项中),但是这不能与 f_k_f 中的其他表达式组合。

但是,您可以使用的是

-force_key_frames source -x264-params keyint=20:scenecut=0

如果源帧是关键帧,这将设置关键帧。但是 keyint 始终是从最后一个关键帧集开始测量的,因此,如果您的源在 处具有 KF,n=0,34,55,64则结果将在 处具有 KF n=0,20,34,54,55,64,84- 请注意,在 处缺少 KF 40,60,80。另请注意 处的连续 KF 54,55,因此最好忽略源 KF 并让场景剪切工作。


Eug*_*eck 3

简短回答:你不能

长答案:当使用 FFMpeg 进行重新编码(即除 之外的任何其他编解码器copy)时,输入流中的每个图像都将被解压缩并可用作完整位图。这意味着,在管道中的这一点上,帧 1、12 和 89 不再“特殊”——它们与其他图像一样。

现在通过 压缩时libx264,您创建一个具有关键帧的视频 - 这些关键帧将放置在您配置的位置,在您的情况下每 20 帧放置一次。

  • 那么为什么要使用 `scencut=0` 呢?让 scencut 发挥它的魔力! (2认同)