【发布时间】:2015-09-07 21:22:29
【问题描述】:
如何使用 FFmpeg 将关键帧间隔设置为 5 秒?
【问题讨论】:
如何使用 FFmpeg 将关键帧间隔设置为 5 秒?
【问题讨论】:
您需要重新编码。将 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。
【讨论】:
叹息。
关于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 帧。