ビデオのすべてのフレームを単一の画像にまとめる効率的な方法

ビデオのすべてのフレームを単一の画像にまとめる効率的な方法

約20分の長さの720pビデオファイルがあります。単一の演算子(明るく、暗くなど)を使用してビデオの各フレームを合成して単一の画像出力を生成したいと思います。

私の考えは、Imagemagickの変換機能を使用して次のようにこれを実行できることでした。

convert video.mp4 -compose Lighten output.jpg

しかし、数分間実行するとメモリが不足します。たくさんほとんどのメモリを許可するようにポリシーを設定しました。)内部的にはffmpegを呼び出すようですが、何が起こっても非常に非効率的なようです。複数の720pフレームをRAMに一度にロードするには、数十GBのRAMが必要です(1つは合成用で、もう1つは新しいフレーム用)。

ビデオを画像に合成するより高速で効率的な方法は何ですか?

ベストアンサー1

これはffmpegを使用して効率的に実行できますが、組み合わせる必要があるフレーム数を正確に知る必要があります。tblend隣接するフレームをマージするには、フィルタを設定する必要があります。各フィルタはフレーム数を半分に分割します。

私の場合は72,000フレーム(20分@ 60fps)がありました。 16のステージを選んだのですが、こうすると映像が65536に分かれるからです。tblend文書説明する:

デフォルトでは、最長入力が終了すると出力も終了します。

これから、私は最後の除算が完全な長さの入力と正しく結合されるべき短い入力を生成する必要があるため、131072に分割する必要があると予想しました。しかし、ステップ17を使用すると出力が生成されるため、ステップ16に減りOutput file is empty, nothing was encoded、その時点で画像出力が出ました。

最後のコマンドは次のとおりです。

ffmpeg -i $I -vf "tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,tblend=lighten,framestep=2,setpts=1*PTS" -f image2 $O.png

ここで、$I は入力ファイル、$O は拡張子が削除された入力ファイルです。

これに比べて、convert20分の長さのビデオファイルに対して上記のコマンドでffmpegを使用すると、1分余りかかり、無視できるほどの処理メモリを使用します。

おすすめ記事