キーフレームの間隔が x264-params の keyint で設定した値にならないときは min-keyint を設定してみる【FFmpeg】

確認した環境

本題

H.264形式の動画を生成するときにキーフレームの間隔を指定したいときがあるかもしれません。 (例えばストリーミング再生用に変換する際に、セグメントの秒数を指定したいときなど) その場合、以下のようにx264-paramskeyintパラメータから設定します。単位はフレーム数です。

ffmpeg -i input.mp4 -vcodec h264 -x264-params keyint=150 out.mp4

または、gで設定することも可能です。

ffmpeg -i input.mp4 -vcodec h264 -g 150 out.mp4

これで問題ない場合もあると思いますが、動画によってはこれでは上手くいかないケースもあります。 私が遭遇したケースでは、150フレームを指定したはずなのにデフォルトの250フレーム間隔で出力されたことがありました。 その場合は以下のようにmin-keyintも設定すると解決することがあります。

ffmpeg -i input.mp4 -vcodec h264 -x264-params keyint=150:min-keyint=150 out.mp4
ffmpeg -i input.mp4 -vcodec h264 -g 150 -x264-params min-keyint=150 out.mp4

H.265形式でキーフレームの間隔を設定する場合

ちなみに、H.265形式でキーフレームの間隔を設定する場合はgで設定する方法はありません。 x265-paramsから設定する方法はあります。

ffmpeg -i input.mp4 -vcodec hevc -x265-params keyint=150:min-keyint=150 out.mp4

(2019/5/19追記)force_key_framesを使用したキーフレームの間隔の設定(別記事)

以下の記事にて、force_key_framesを使用したキーフレーム間隔の設定について書きました。 私が試した限りでは、force_key_framesを使用する方法が一番うまくいくことが多かったです。 こちらもご参考ください。

参考

superuser.com