Ffmpeg 为什么在应用视频过滤器后,我的H.264视频会有一个绿色覆盖?

Ffmpeg 为什么在应用视频过滤器后,我的H.264视频会有一个绿色覆盖?,ffmpeg,rgb,yuv,libx264,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\u w)/2:y=(h-text\u h)/2:text='Henk de Vries'[watermark];[0][watermark]混合=所有模式=差异:所有不透明度=1“输出。mp

执行以下代码时:

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\u w)/2:y=(h-text\u h)/2:text='Henk de Vries'[watermark];[0][watermark]混合=所有模式=差异:所有不透明度=1“输出。mp4

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

我知道输入文件有yuv420p颜色间隔。我认为混合过滤器只支持rgba模式,但我不确定


我怎样才能避免绿色叠加并获得原始颜色?(例如,原始输入视频的外观)

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

Rotem的答案是正确的,但不需要中间文件。只需事先转换为RGB空间


ffmpeg-i input.mov-c:v libx264-preset veryslow-pix_fmt yuv420p-filter_complex“[0]格式=gbrp,拆分=2[text][orig];[text]drawtext=fontfile=font.ttf:fontcolor=white@1:fontsize=h/6:x=(w-text\u w)/2:y=(h-text\u h)/2:text='Henk de Vries'[watermark];[orig][watermark]blend=all\u mode=difference:all\u opacity=1“output.mp4“正确的颜色“?@Gyan:我编辑这篇文章是为了更准确地描述这一点。这对我不起作用。我仍然得到相同的输出。我试图实现的是,我覆盖的文本是底层视频的否定版本。我是否为此使用了正确的方法?经过测试和纠正;blend支持有限的一组RGB格式。太棒了,现在我有了文本,它是底层视频的反转结果。我扩展了您的命令,用lumakey实际过滤掉黑色,并将其覆盖在原始视频上:
ffmpeg-I input.mov-c:v libx264-preset veryslow-pix_fmt yuv420p-filter_complex“[0]format=gbrp,split=3[text][blend][orig];[text]drawtext=fontfile font.ttf:fontcolor=white@1:fontsize=h/6:x=(w-text\u w)/2:y=(h-text\u h)/2:text='Henk de Vries'[watermark];[blend][watermark]blend=all_mode=difference:all_opacity=1,lumakey=16:0:0[colortext];[orig][colortext]overlay”输出。mp4