应用视频滤镜后,为什么我的H.264视频有绿色的覆盖层?

时间:2019-06-07 16:07:31

标签: ffmpeg rgb yuv libx264

执行以下代码时:

ffmpeg -i input.mov -c:v libx264 -preset veryslow -pix_fmt yuv420p -filter_complex "drawtext=fontfile=font.ttf:fontcolor=white@1:fontsize=h/6:x=(w-text_w)/2:y=(h-text_h)/2:text='Henk de Vries'[watermark];[0][watermark]blend=all_mode=difference:all_opacity=1" output.mp4

输出文件具有绿色覆盖。使用其他混合模式时,结果会有所不同,其中一些模式显示正确的颜色,而其他模式显示绿色和粉红色。

我知道输入文件具有yuv420p colorspacing。我认为Blend过滤器仅支持rgba模式,但我不确定。

如何避免绿色覆盖并获得原始颜色? (例如原始输入视频的样子)

1 个答案:

答案 0 :(得分:1)

您正在以差异模式将视频与几乎相同的副本混合,因此大多数像素将被归零。在YUV编码中,两个色度通道中的0值像素代表绿色。亮度通道(Y)并非纯粹表示亮度,因此亮度0以及两个色度均为0时会导致呈现绿色。

Rotem的答案在右行,但不需要任何中间文件。只需预先转换为RGB空间即可。

ffmpeg -i input.mov -c:v libx264 -preset veryslow -pix_fmt yuv420p -filter_complex "[0]format=gbrp,split=2[text][orig];[text]drawtext=fontfile=font.ttf:fontcolor=white@1:fontsize=h/6:x=(w-text_w)/2:y=(h-text_h)/2:text='Henk de Vries'[watermark];[orig][watermark]blend=all_mode=difference:all_opacity=1" output.mp4