我有一个视频,我想模糊掉每一帧的一部分(脸部)。我有脸部边界框的坐标,这些坐标可能会随着每一帧而变化。
在仔细阅读了文档之后,我了解到,实现这一点的方法是应用一系列过滤器
- 裁剪滤镜,裁剪部分
- 模糊裁剪后的视频
- 将裁剪和模糊的视频叠加在原始位置
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