FFMPEGはフレーム内I、P、Bフレームを抽出します。

FFMPEGはフレーム内I、P、Bフレームを抽出します。

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 の色の詳細については、次のリンクを参照してください。

マクロブロックとモーションベクターのデバッグ FFMpeg ドキュメント

関連情報