1. 関連する背景
例証します:
- GOP は、ビデオ内の 2 つのキー フレーム間の一連の画像を指します。一般に、2 つの GOP は互いに完全に独立しています。GOP の最初のフレームはキー フレームです。
- この記事では、GOP サイズの指定とキーフレーム間隔の指定は同じです。
h265 を h264 に変換する場合、後続の操作を容易にするために、ビデオの GOP サイズが比較的小さい (2 秒〜 4 秒) 必要があります。しかし、通常のトランスコードではGOPサイズはエンコーダ自身で決まるため、トランスコード時のGOPサイズはどのように指定すればよいのでしょうか?
2. 解決策
ffmpegのパラメータを使用して-force_key_frames
GOPサイズを強制的に指定します。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 サイズを変更するとビデオ サイズが変更されました。
- GOP のサイズが減少するにつれて、ケース 1 とケース 3 のボリュームは基本的に GOP とともに増加することがわかります。これは実際には合理的であり、通常のビデオの GOP サイズは 2 秒よりも大きい場合が多く、それを強制的に 2 秒にすると圧縮率が低下することになります。
- ケース 2 は非常に特殊なビデオなので、ここでは説明しません。
4. まとめ
- 強制 GOP サイズを使用することもできます
-force_key_frames
。結果は正確ではありませんが、基本的には指定された値になります。 - GOP サイズを変更すると、ビデオ ファイルのサイズも変更されます