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

Sam*_*sra 19 ffmpeg video-streaming keyframe segment http-live-streaming

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

Ely*_*Ely 28

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

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

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

编辑更改no-scenecutscenecut=0,按照叹息男孩建议.

  • 它会伤害质量或比特率.智能编码器会在有场景切割时放置关键帧,以便将来的帧可以有一个干净的参考.如果强制使用间隔,关键帧对于将来的帧将根本不是最佳的,这将损害整个流. (2认同)

小智 15

叹.

关于无场景切换选项的错误信息持续的时间比我记忆中的要长.永远不要为无场景切换输入值.

可以在此处找到文档链接.

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

-g 120将定义120帧的GOP以创建用于23.976fps内容的5秒GOP.这与无场景切换选项一起使用..

-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
Run Code Online (Sandbox Code Playgroud)

您还可以参考我撰写的关于如何在此处创建正确的ABR帧对齐内容的文章.

  • 为了完全准确,您应该使用`frame=key_frame`。可能有不是关键帧的 I 帧。 (3认同)