ffmpeg はキーフレーム間隔 (キーフレーム、ゴップサイズ、ゴップ継続時間) を強制します

1. 関連する背景

例証します:

  1. GOP は、ビデオ内の 2 つのキー フレーム間の一連の画像を指します。一般に、2 つの GOP は互いに完全に独立しています。GOP の最初のフレームはキー フレームです。
  2. この記事では、GOP サイズの指定とキーフレーム間隔の指定は同じです。

h265 を h264 に変換する場合、後続の操作を容易にするために、ビデオの GOP サイズが比較的小さい (2 秒〜 4 秒) 必要があります。しかし、通常のトランスコードではGOPサイズはエンコーダ自身で決まるため、トランスコード時のGOPサイズはどのように指定すればよいのでしょうか?

2. 解決策

ffmpegのパラメータを使用して-force_key_framesGOPサイズを強制的に指定します。ffmpegのforce-key-frame関連ドキュメントを参照できます。

-force_key_frames[:stream_specifier] time[,time...] (output,per-stream)
-force_key_frames[:stream_specifier] expr:expr (output,per-stream)
-force_key_frames[:stream_specifier] source (output,per-stream)
-force_key_frames[:stream_specifier] source_no_drop (output,per-stream)

GOP サイズを 2 秒に指定するコマンドは次のとおりです。

ffmpeg -i input.mp4 -c:v libx264 -force_key_frames "expr:gte(t,n_forced*2)" output.mp4

取得された GOP サイズは約 2 秒ですが、厳密に 2 秒であることを意味するわけではないことに注意してください (2 秒には画像フレームがない可能性があります)。

3. 実験

GOP サイズを 2 秒に指定し、コマンドは次のようになります。

ffmpeg -i input.mp4 -c:v libx264 -force_key_frames "expr:gte(t,n_forced*2)" output.mp4

次のコマンドを使用して、キーフレームの時点を確認し、結果が正しいかどうかを確認できます。

ffprobe -i output.mp4 -skip_frame nokey -select_streams v:0 -show_entries frame=pkt_pts_time -of csv=print_section=0

3 つのビデオをテストし、GOP サイズを変更するとビデオ サイズが変更されました。

  1. GOP のサイズが減少するにつれて、ケース 1 とケース 3 のボリュームは基本的に GOP とともに増加することがわかります。これは実際には合理的であり、通常のビデオの GOP サイズは 2 秒よりも大きい場合が多く、それを強制的に 2 秒にすると圧縮率が低下することになります。
  2. ケース 2 は非常に特殊なビデオなので、ここでは説明しません。
    ここに画像の説明を挿入します

4. まとめ

  1. 強制 GOP サイズを使用することもできます-force_key_frames。結果は正確ではありませんが、基本的には指定された値になります。
  2. GOP サイズを変更すると、ビデオ ファイルのサイズも変更されます

おすすめ

転載: blog.csdn.net/qq_29007291/article/details/127714723