web-dev-qa-db-ja.com

ffmpegを使用してビデオにキーフレームを追加するにはどうすればよいですか?

特定の間隔(20フレーム)に基づいてキーフレームをビデオに追加したい。

したがって、私はffmpegで次のコマンドを使用しました。

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

出力は、20フレームごとにキーフレームを取得することです。

しかし、元のビデオにはキーフレームがありました。 frame 1, 12, 89....

今、フレーム1, 21, 41....にキーフレームがあります

すでにあったキーフレームを入れ替えたくない。キーフレームを追加したいので、次のようにします。

frame 1, 12, 21, 41, 89....

これどうやってするの?

4
jjulianf

短い答え:できません

長い答え:FFMpegを再エンコードで使用する場合(つまり、copy以外のコーデック)、入力ストリーム内のすべての画像が解凍され、完全なビットマップとして使用できます。これは、パイプラインのこの時点で、フレーム1、12、および89がもはや「特別」ではないことを意味します。これらは他のイメージと同じです。

libx264を介して圧縮すると、キーフレームを含むビデオが作成されます。これらは、設定した場所に配置されます。この場合、20フレームごとに配置されます。

3
Eugen Rieck

force_key_framesには、ソースストリームのキーフレームケイデンスをミラーリングするオプションがあります(まだ文書化されていません-私のtodoでは)。ただし、これをf_k_fの他の式と組み合わせることはできません。

ただし、使用できるのは

-force_key_frames source -x264-params keyint=20:scenecut=0

ソースフレームがキーフレームの場合、これによりキーフレームが設定されます。ただし、keyintは常に最後のキーフレームセットから測定されるため、ソースのn=0,34,55,64にKFがあった場合、結果にはn=0,20,34,54,55,64,84のKFがあります-40,60,80にKFがないことに注意してください。また、54,55の連続するKFにも注意してください。ソースKFを無視して、シーンカットを機能させるのが最善です。

1
Gyan