web-dev-qa-db-ja.com

ffmpegでキーフレーム間隔を変更する方法

入力ビデオのキーフレーム間隔を5秒に設定したかった。そうしてはじめて、FFmpegを使用して一定の5秒のHLSセグメンテーションを実現できます。 FFmpegを使用してキーフレーム間隔を5秒に設定する方法は? (FFmpegプロンプトラインコードを高く評価)

19
Samarth Misra

再エンコードする必要があります。 x264のkeyintパラメーターを5 * fpsに設定し、シーンカットを無効にします。たとえば、fpsが24の場合:

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

これは明らかに品質にとって最適ではありませんが、要求に一致します。

ため息少年の提案に従って、no-scenecutscenecut=0に変更するように編集されました。

28
Ely

ため息。

no-scenecutオプションに関する誤った情報は、私が覚えているよりも長く続いています。 no-scenecutの値を入力しないでください。

ドキュメントへのリンクは here にあります。

FFmpegの場合、次の2つのスイッチを使用する必要があります。

-g 120は、120フレームのGOPを定義して、23.976fpsコンテンツの5秒のGOPを作成します。これは、no-scenecutオプションと連動します。

-x264opts no-scenecutは、FFmpegが使用するGOP値ごとにキーフレームを強制的に作成します。 libx264のデフォルトは、シーンの変化を検出したときにキーフレームを作成します。そのオプションなしでMediInfoを使用して出力ファイルを検査すると、scenecut=40が表示されます。適切に行われると、scenecut=0になります。このオプションを使用しないと、ABRコンテンツのキーフレームが不揃いになり、セグメントサイズが予測できなくなります。

私のWordを信じないでください。bashシェルの下で次を実行してください。$ inputfileは分析したいファイルの名前です。上記の2つのスイッチを使用すると、コマンドプロンプトに非常に均一なキーフレームダンプが表示されます。

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

適切なABRフレームアラインコンテンツを作成する方法に関して私が書いた記事を参照することもできます here

15
Navilor