ビデオでクロップを移動する


8

講演をしているスピーカーのHDビデオがあります。各フレームをトリミングしてビデオのサイズを変更したいのですが、ステージの周りを移動するときに、トリミングする長方形をスピーカーの頭の中央に配置する必要があります。

私がすることができ、ビデオの各フレームのためのクロップ矩形のX、Y、幅、高さ&を含むファイルを生成します。

この動くクロップをビデオに適用する最良の方法は何ですか?

うまくいけば

  1. ffmpegを使用して各フレームをフォルダーに抽出する
  2. 別のプログラムを使用して各画像ファイルをトリミングする
  3. ffmpegを使用して、トリミングされた画像ファイルを使用してビデオを再構築します

これを行うより良い方法はありますか?


トリミングフレームの数値説明がある場合、ImageMagickはトリミングを実行できます。ffmpegを使用してイメージシーケンスとしてエクスポートし、ImageMagickを使用してバッチ処理し、ffmpegのムービーとしてremuxすることをお勧めします。おそらくすべてをまとめるために、何らかのシェルスクリプトが必要になります。作物情報を含むファイルの例を投稿すると、詳細がわかります。
stib 2015

そのファイルをどのように生成するか尋ねてもいいですか。私はまったく同じ問題に取り組んでいます。私はffmpeg tblend減算フィルターを使用し、次に作物検出フィルターを使用する概念実証を持っています。より良い方法があるかどうか疑問に思います。
Jannes、2015年

回答:


2

Gyanのオーバーレイ回答と同様に、少しシンプルなバージョンでは、「swaprect」および「crop」フィルターを備えた基本的な-filter_scriptを使用できます。トリミングターゲットを0,0に移動してから、ターゲット領域を0,0でトリミングします。ターゲットは0,0に交換する必要があります。そうしないと、交換した他の四角形が重複する可能性があります。これはffmpegバージョン3.4.6-0ubuntu0.18.04.1で動作しました

フレーム番号が「-ss」で渡されたオフセットに関連していることを確認してください。

4096x2160のソースからの1280x720の作物を対象とする例。ソースは24fpsで、追跡情報は8fpsです。

作物フィルタースクリプト:

swaprect=1280:720:0:0:1568:594:enable='between(n,0,26)',
swaprect=1280:720:0:0:1552:598:enable='between(n,27,29)',
swaprect=1280:720:0:0:1565:583:enable='between(n,30,32)',
swaprect=1280:720:0:0:1603:576:enable='between(n,33,35)',
crop=1280:720:0:0

ffmpeg -ss [start offset] -t [duration] -i input.mov -filter_script:v:0 crop-filter-script -acodec copy out.mov


1

私はすでにに変更しましたavconvので、クラシックffmpegで答えが少し異なる場合はお詫び申し上げますが、それほど大きな違いはないはずです。

フレーム番号とクロップの位置の間に何らかの数式を作成できれば、クロップを移動させることができます。しかし、それを行うための分析ツールはありません。つまり、スピーカーが予測可能な方法で動く場合、理論的には外部アプリケーションなしでそれを行うことができます。

たとえば、話者が写真の左上から右下に移動していると仮定します。あなたは次の線に沿って何かをすることができます:

avconv -i input.ogv -vf 'crop=200:100:n:n' -c:v libtheora output.ogv

ここでは、フレームごとに1ピクセルを移動しています。これは、誰かが移動する方法とは非常に異なります。

avconvのフィルターインターフェースによって提供される数学関数が非常にたくさんあることを覚えておいてください(ffmpegも同様です)。

それでは、1フレームあたり1ピクセルを移動したいとしますが、フレームは200から350までです。その後、行うことができます

min(max(n,200)-200, 150)

200未満のフレームの場合、200 max(n,200)を生成し、200を取り除いて0にし、min350フレームまで最初の部分を返します。その結果、結果は150を超え、定数が返され始めます。

そのような数式を手作業で書くのはかなり退屈ですが、場合によっては役立つかもしれません。

そうは言っても、フレームごとに画像を処理できるソフトウェアにアクセスできるという選択肢があれば、私はその道を進みます。



1

各フレームのクロッピング四角形のX、Y、幅、高さを含むファイル」がある場合、filter_scriptオプションを使用してFFmpegでこれを行うことができます。クロップフィルターはタイムライン編集をサポートしていませんが、オーバーレイフィルターはサポートしています。そのため、ビデオと同じ解像度の空白のキャンバスを作成し、目的の領域が可視領域に重ねられるように、ビデオを座標でオーバーレイすると、目標が達成されます。

基本的な構文は

ffmpeg -i in.mp4 -filter_complex_script file.txt -map "[out]" output.mp4

どこfile.txt次のようになります。

nullsrc=WxH:r=FPS[cv];
[cv][0]overlay=-X0:-Y0:shortest=1:enable='eq(n\,0)'[b0];
[b0][0]overlay=-X1:-Y1:shortest=1:enable='eq(n\,1)'[b1];
[b1][0]overlay=-X2:-Y2:shortest=1:enable='eq(n\,2)'[b2];
...
[bm-1][0]overlay=-Xm:-Ym:shortest=1:enable='eq(n\,m)'[out]

キャンバスでWありH、(固定/静的)作物の寸法と同じである必要がありFPSます。(次いで、ビデオの各フレームはでオーバーレイされる- X、- Y)所望の領域の左上隅が(0,0)であるようにキャンバス。各オーバーレイは1フレームで発生します。効率を上げるために、クロップ領域が静的である間隔がある場合は、betweenエバリュエーターを使用する必要があります。

[bi][0]overlay=-Xi:-Yi:shortest=1:enable='between(n\,1200\,1445)'[bj];

tフレームインデックスの代わりにタイムスタンプを使用して評価することもできます。


私はこのソリューションを実装してみて、どうなるかを確認しました。最初はテスト用のブルートバージョンが必要なので、間に実装していません。最初の3000フレームについて、各フレームの位置を追加しました。私のffmpegメモリは36GBになり、毎分1フレームで動作します:(これはフレームごとに最適なソリューションではないようです
Eek

私は現在町外れですが、トリムフィルターを使用して1つのフレームを分離し、Pngに出力する方法を検討しています。したがって、nフレームに対してnコマンド。次に、画像をビデオに連結します
Gyan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.