为什么去抖动背景是绿色的,怎样才能将其变成黑色?

为什么去抖动背景是绿色的,怎样才能将其变成黑色?

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 命令)并使用参数

相关内容