我想模糊视频的 3 个区域。这是代码:
$ ffmpeg -i ACCT.mp4 -an \
-filter_complex \
"[0:v]crop=850:100:140:175,boxblur=10[blur1]; \
[0:v]crop=125:285:815:395,boxblur=10[blur2]; \
[0:v]crop=80:30:730:640,boxblur=10[blur3]; \
[0:v][blur1]overlay=140:175:enable='between(t,0,26)'[ovr1]; \
[ovr1][blur2]overlay=815:395:enable='between(t,0,2)'[ovr2]; \
[ovr2][blur3]overlay=730:640:enable='between(t,7,29)'" \
blurredVideo.mp4
不幸的是,ffmpeg报告以下错误:
[Parsed_boxblur_5 @ 0x7fcfbb805b40] Invalid chroma_param radius value 10, must be >= 0 and <= 7
[Parsed_boxblur_5 @ 0x7fcfbb805b40] Failed to evaluate filter params: -22.
[Parsed_boxblur_5 @ 0x7fcfbb805b40] Failed to configure input pad on Parsed_boxblur_5
Error reinitializing filters!
Failed to inject frame into filter network: Invalid argument
Error while processing the decoded data for stream #0:0
Conversion failed!
该代码基于有效答案到另一篇文章。
答案1
问题
boxblur 有大小限制。请参阅boxblur 过滤器文档了解所有详细信息。
解决方案
使用不同的模糊滤镜
用作 avgblur、dblur、gblur、sab、smartblur、unsharp、yaepblur。请参阅FFmpeg 过滤器。
$ ffmpeg -i ACCT.mp4 -an \
-filter_complex \
"[0:v]crop=850:100:140:175,avgblur=10[blur1]; \
[0:v]crop=125:285:815:395,avgblur=10[blur2]; \
[0:v]crop=80:30:730:640,avgblur=10[blur3]; \
[0:v][blur1]overlay=140:175:enable='between(t,0,26)'[ovr1]; \
[ovr1][blur2]overlay=815:395:enable='between(t,0,2)'[ovr2]; \
[ovr2][blur3]overlay=730:640:enable='between(t,7,29)'" \
blurredVideo.mp4
或者在裁剪之前使用 boxblur
这会比你原来的命令慢。
$ ffmpeg -i ACCT.mp4 -an \
-filter_complex \
"[0:v]boxblur=10,crop=850:100:140:175[blur1]; \
[0:v]boxblur=10,crop=125:285:815:395[blur2]; \
[0:v]boxblur=10,crop=80:30:730:640[blur3]; \
[0:v][blur1]overlay=140:175:enable='between(t,0,26)'[ovr1]; \
[ovr1][blur2]overlay=815:395:enable='between(t,0,2)'[ovr2]; \
[ovr2][blur3]overlay=730:640:enable='between(t,7,29)'" \
blurredVideo.mp4
或者添加格式过滤器
$ ffmpeg -i ACCT.mp4 -an \
-filter_complex \
"[0:v]crop=850:100:140:175,format=yuv444p,boxblur=10[blur1]; \
[0:v]crop=125:285:815:395,format=yuv444p,boxblur=10[blur2]; \
[0:v]crop=80:30:730:640,format=yuv444p,boxblur=10[blur3]; \
[0:v][blur1]overlay=140:175:enable='between(t,0,26)':format=auto[ovr1]; \
[ovr1][blur2]overlay=815:395:enable='between(t,0,2)':format=auto[ovr2]; \
[ovr2][blur3]overlay=730:640:enable='between(t,7,29)':format=auto,format=yuv420p" \
blurredVideo.mp4
另请参阅
答案2
视频通常有三个组件来描述一个像素:一个亮度组件和两个色度组件。在最常见的方案 (yuv420) 中,色度值仅针对宽度和高度上的一半像素设置,因此与亮度平面W/2 x H/2
相比,色度平面的大小只有四分之一 ( )。
在 boxblur 滤镜中,当未明确指定时,色度平面的模糊半径默认为亮度平面的半径。滤镜将在每个像素周围绘制一个计算半径的圆来计算其输出值,整个圆需要位于视频帧内,因此平面的模糊半径最多需要为较小边的一半。
在 中[0:v]crop=80:30:730:640,boxblur=10[blur3]
,裁剪的视频高度为 30,因此色度平面高度为 15,色度半径必须为 7 或更小。
你可以使用表达式来保持在技术限制之内,像这样,
[0:v]crop=80:30:730:640,boxblur=10:cr=min(10\,min(cw\,ch)/2)[blur3]