FFMPEG または類似のプログラムからフレーム内を抽出し、そのまま保存する方法はありますか? を使用してフレームを一連の JPEG 画像に抽出できることは知っています-f image2
。ただし、それらは各フレームの完全な画像です。動きの変化の画像のみをエクスポートしたいので、P フレームと B フレームには動きの変化のみを表示し、画像の変更されていない領域を除外またはマスクします。
これは可能ですか?
私が使用している基本的なフレーム エクスポート コマンド。これにより、指定された FPS で各フレームのフルフレーム画像が得られます。
ffmpeg -i input.mp4 -r 12 -an -b 1024k -y -f image2 frame%4d.jpg
フレームをエクスポートして、最初のフレームが完全な画像で、次のフレームが画像を再描画する必要がある画像データのみになるフレームのフォルダーを作成したいと考えています。2 つのフレーム間の時間的な冗長性を明らかにします (これは I、P、B フレームが行うことではないでしょうか?)
答え1
特定のタイプのフレームを抽出するには、select
フィルター:
select=eq(pict_type\,<x>)
<x>
次のいずれかになります。pict_type (video only) the type of the filtered frame, can assume one of the following values: I, P, B, S, SI, SP, BI
たとえば次のようになります。
ffmpeg -i <inputfile> -vf '[in]select=eq(pict_type\,B)[out]' b.frames.mp4
出力についてさらに理解するには、showinfo
フィルター:
ffmpeg -i <inputfile> -vf '[in]select=eq(pict_type\,B),showinfo[out]' b.frames.mp4
答え2
P フレームと B フレームには通常、変更された領域ごとに新しい画像データは含まれません。むしろ、画像は異なるタイプのマクロブロックに分割されます。一部のタイプのマクロブロックには新しい画像データが含まれますが、ほとんどのマクロブロックは他の参照画像とモーション ベクトルに基づいてコンテンツを計算します。
まさにあなたが求めていたものではありませんが、これは色を使用して各マクロブロックのタイプを表示します。
ffmpeg -debug vis_mb_type -i input.mp4 output.mp4
または
ffplay -debug vis_mb_type input.mp4
これにより、モーション ベクトルも表示されます。
ffplay -debug vis_mb_type -vismv 7 input.mp4
各 MB の色の詳細については、次のリンクを参照してください。