如何在ffmpeg中更改关键帧间隔

时间:2015-06-22 12:12:19

标签: ffmpeg video-streaming keyframe segment hls

我想将输入视频的关键帧间隔设置为5秒。只有这样我才能使用FFmpeg实现恒定的5秒HLS分割。如何使用FFmpeg将关键帧间隔设置为5秒? (FFmpeg提示行代码赞赏)

2 个答案:

答案 0 :(得分:26)

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

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

这显然不是质量的最佳选择,但它可以满足您的需求。

根据叹气男孩的建议,已修改no-scenecut更改为scenecut=0

答案 1 :(得分:13)

叹息。

关于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的文章。