【问题标题】:How to change keyframe interval?如何更改关键帧间隔?
【发布时间】:2015-09-07 21:22:29
【问题描述】:

如何使用 FFmpeg 将关键帧间隔设置为 5 秒?

【问题讨论】:

    标签: ffmpeg keyframe


    【解决方案1】:

    您需要重新编码。将 x264 的 keyint 参数设置为 5*fps 并禁用场景切换。例如,如果您的 fps 为 24:

    ffmpeg -i <input> -vcodec libx264 -x264-params keyint=120:scenecut=0 -acodec copy out.mp4
    

    这显然不是质量最佳,但它会满足您的需求。

    根据 sigh-boy 的建议,将 no-scenecut 更改为 scenecut=0

    【讨论】:

    • 它会损害质量或比特率。当有场景切换时,智能编码器将放置关键帧,以便将来的帧可以有一个干净的参考。如果您强制间隔,关键帧对于未来的帧将根本不是最佳的,这将损害整个流。
    • 我很好奇,因为 sigh-boy 的回答中的链接说:将 scenecut 设置为 0 等同于设置 --no-scenecut。
    【解决方案2】:

    叹息。

    关于no-scenecut 选项的错误信息持续的时间比我记忆中的要长。切勿为no-scenecut 输入值。

    可以找到文档链接here

    对于 FFmpeg,您需要使用以下两个开关:

    -g 120 将定义一个 120 帧的 GOP,为 23.976fps 的内容创建一个 5 秒的 GOP。这与no-scenecut 选项结合使用。

    -x264opts no-scenecut 将强制根据 FFmpeg 使用的 GOP 值创建关键帧。 libx264 的默认设置是在检测到场景变化时创建一个关键帧。如果您使用没有该选项的 MediInfo 检查输出文件,将看到scenecut=40。正确完成后将是scenecut=0。如果不使用此选项,则 ABR 内容的关键帧将不对齐,并且片段大小将不可预测。

    不要相信我的话,请在 bash shell 下运行以下命令,其中 $inputfile 是您要分析的文件的名称。如果您使用上面显示的两个开关,那么您将看到非常均匀的关键帧转储到命令提示符。

    ffprobe -select_streams v -show_frames -show_entries \
      frame=pict_type -of csv $inputfile | grep -n I | cut -d ':' -f 1
    

    您还可以参考我写的一篇文章,了解如何创建正确的 ABR 帧对齐内容here

    【讨论】:

    • 为了完全准确,您应该使用frame=key_frame。可能有不是关键帧的 I 帧。
    猜你喜欢
    • 1970-01-01
    • 2013-08-07
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多