如何将 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 秒设置三个不同的过滤器链。您需要记住的只是在 中的[ ]每个步骤中使用不同的名称-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):
在此处输入图片描述

相关内容