動いているオブジェクトに ffmpeg フィルターを適用するにはどうすればいいですか?

動いているオブジェクトに ffmpeg フィルターを適用するにはどうすればいいですか?

各フレームの一部(顔)をぼかしたいビデオがあります。顔の境界ボックスの座標はありますが、フレームごとに変わる可能性があります。

ドキュメントを調べた結果、これを行うにはフィルターのチェーンを適用することが分かりました。

  • 一部を切り取るための切り取りフィルター
  • 切り取ったビデオをぼかす
  • 切り取られたぼかしのビデオを元の場所に重ねる
ffmpeg -i input_video.mp4 -filter_complex "[0]crop=200:200:60:30[cropped];[cropped]avgblur=10[croppedblurred];[0][croppedblurred]overlay=60:30" output_video.mp4

これは、ビデオを通じて変化しない境界ボックスの座標には有効です。フレームごとに変化する可能性がある境界ボックスの位置に対してこれを実行するにはどうすればよいですか?

答え1

タイムスタンプがわかっている場合は、trimフィルターを使用して、入力ビデオの特定の期間に必要なフィルターのチェーンを設定できます。以下の例では、10 秒ごとに 3 つの異なるフィルター チェーンを設定します。覚えておく必要があるのは、[ ]の各ステップで異なる名前を使用することだけです-filter_complex

ffmpeg -i input.mp4 -filter_complex ^
 ^"[0:v]trim=start=0:end=10[a]; ^
   [0:v]trim=start=10:end=20,setpts=PTS-STARTPTS[b]; ^
   [0:v]trim=start=20,setpts=PTS-STARTPTS[c]; ^
   [a] here insert your chain of filters for this part of video [aa]; ^
   [b] here insert your chain of filters for this part of video [bb]; ^
   [c] here insert your chain of filters for this part of video [cc]; ^
   [aa][bb]concat[aaa]; ^
   [aaa][cc]concat[video]^" ^
 -map [video]:v -map 0:a -c:v libx264 -crf 18 -c:a copy output.mp4

答え2

これを「手動で」(プログラミングなしで)解くのは現実的ではないと思います。
理論的には、式の評価フレーム番号またはフレーム時間に応じて座標xと座標を設定します。y


合成パターンの構築(デモンストレーション用):

ffmpeg -y -f lavfi -r 10 -i testsrc=size=192x108:rate=1:duration=300 -vf setpts=N/10/TB -vcodec libx264 -pix_fmt yuv444p -crf 17 input_video.mp4

フレーム番号に応じてぼかし領域を配置する例:

ffmpeg -y -i input_video.mp4 -filter_complex "[0]avgblur=10,crop=50:50:'if(lte(n,100), n+10, if(lte(n,200), 210-n, 10))':'if(gte(n,100), 5+(n-100)/5, 5)'[blurredcropped];[0][blurredcropped]overlay='if(lte(n,100), n+10, if(lte(n,200), 210-n, 10))':'if(gte(n,100), 5+(n-100)/5, 5)':format=yuv444" -vcodec libx264 -pix_fmt yuv444p -crf 17 output_video.mp4

サンプル出力(アニメーションGIFに変換):
ここに画像の説明を入力してください

関連情報