
各フレームの一部(顔)をぼかしたいビデオがあります。顔の境界ボックスの座標はありますが、フレームごとに変わる可能性があります。
ドキュメントを調べた結果、これを行うにはフィルターのチェーンを適用することが分かりました。
- 一部を切り取るための切り取りフィルター
- 切り取ったビデオをぼかす
- 切り取られたぼかしのビデオを元の場所に重ねる
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