FFmpeg 版本:4.3.2-2021-02-27-full_build-www.gyan.dev、Windows
当我申请除抖过滤视频,例如:
ffmpeg -i input.mp4 -vf "deshake=rx=64:ry=64:edge=blank" -c:v h264_qsv output.mp4
即使我指定了edge=blank
,背景最终还是变成深绿色,例如:
为什么会发生这种情况?我该如何让它变黑?
这过滤文档说:
edge
指定如何生成像素来填充框架边缘的空白。可用值为:
‘blank, 0’
- 在空白处填充零...
我对“填零”的解释是黑色,但事实似乎并非如此。
我认为下面的答案关于 YUV 0 为绿色是正确的,但deshake
似乎是强制的yuv444p
,我不确定为什么。
例如,尝试转换为 RGB,并showinfo
沿途打印格式(为清楚起见使用换行符):
ffmpeg -i input.mp4
-vf "showinfo=checksum=false,
format=rgb24,
showinfo=checksum=false,
deshake=edge=blank,
showinfo=checksum=false"
-f null -
输出(缩写):
[Parsed_showinfo_0 @ 0000010c55ab2f40] n: 22 pts: 44 pts_time:0.733333 pos: 348574 fmt:yuv420p sar:0/1 s:1280x720 i:P iskey:0 type:P
[Parsed_showinfo_0 @ 0000010c55ab2f40] color_range:unknown color_space:unknown color_primaries:unknown color_trc:unknown
[Parsed_showinfo_2 @ 0000010c5860d500] n: 22 pts: 44 pts_time:0.733333 pos: 348574 fmt:rgb24 sar:0/1 s:1280x720 i:P iskey:0 type:P
[Parsed_showinfo_2 @ 0000010c5860d500] color_range:tv color_space:unknown color_primaries:unknown color_trc:unknown
[Parsed_showinfo_4 @ 0000010c5861df80] n: 22 pts: 44 pts_time:0.733333 pos: 348574 fmt:yuv444p sar:0/1 s:1280x720 i:P iskey:0 type:P
[Parsed_showinfo_4 @ 0000010c5861df80] color_range:tv color_space:unknown color_primaries:unknown color_trc:unknown
换句话说,它正在这样做:
input.mp4
↓ [yuv420p]
format=rgb24
↓ [rgb24]
deshake
↓ [yuv444p] <--- ?????????
encoder / output
我不确定为什么会发生这种情况。为了确认这与输出格式向后传播无关,我还对此进行了测试并验证了它存在同样的问题(GIF 输出使用 rgb8):
ffmpeg -i input.mp4 -vf "format=rgb8,deshake=edge=blank" -c:v gif output.gif
此外,按照这些思路,format=rgb24
再次添加后 deshake
产生同样令人困惑的结果:
input.mp4
↓ [yuv420p]
format=rgb24
↓ [rgb24]
deshake
↓ [yuv444p] <--- ?????????
format=rgb24
↓ [rgb24]
encoder / output
我尝试了一下这个+
选项,-pix_fmt
但也无法让它工作:它被记录为禁用过滤器中的自动转换,但我猜format
过滤器也算作“自动转换”,因为它可以防止所有这些功能正常运行。
答案1
在 YUV 颜色模型中,U 和 V 的值为 0 表示绿色
https://en.wikipedia.org/wiki/YUV
你可以尝试以 0 为黑色的颜色格式
在没有亲自测试过的情况下(并且不知道你的像素格式),尝试类似
-vf "format=rgb24,deshake=rx=64:ry=64:edge=blank"
答案2
你可以使用 vidstabdetect/transform 而不是 deshake
第一次运行
ffmpeg -i input -vf vidstabdetect=shakiness=10:result=info.trf -f null -
然后运行
ffplay -i input -vf vidstabtransform=input=info.trf:crop=black
(或带有输出文件的等效 ffmpeg 命令)并使用参数