使用ffmpeg -filter_complex置换时出现鬼影问题



我已经(几乎)能够基于2个动画高斯噪声视频应用位移,但我有鬼图像的问题。一幅图胜过千言万语。

这里有一个脚本来复制这个问题:

ffmpeg -y -t 2 -f lavfi -i color=c=blue:s=160x120 -c:v libx264 -tune stillimage -pix_fmt rgb24 00_empty.mp4
ffmpeg -y -i 00_empty.mp4 -vf "drawtext=text=string1:y=h/2:x=w-t*w/2:fontcolor=white:fontsize=60" 01_text.mp4
ffmpeg -y -t 2 -f lavfi -i color=c=gray:s=160x120 -c:v libx264 -tune stillimage -pix_fmt rgb24 02_gray.mp4
ffmpeg -y -i 01_text.mp4 -i 02_gray.mp4 -i 02_gray.mp4 -filter_complex "[0][1][2]displace=edge=mirror" 03_displaced_text.mp4

它创建了一个带有滚动文本和灰色虚拟视频的测试视频。然后应用基于灰度视频的位移。如果我理解正确的话,因为灰色的视频是100%灰色,它应该离开视频不变(或者取代一切固定供方确认的像素),但它会创建一个"shadow"。我尝试了3种不同的像素格式(yuv420p, yuv444p, rgb24),因为我在stackoverflow上发现了这个问题:

  • 为什么ffmpeg中的位移复合滤波器使Cb和Cr平面与lum的位移不同?

ffmpeg version 5.0.1-full_build-www.gyan.dev

任何想法都欢迎。
谢谢!

解决方案:使用-pix_fmt rgb24并在所有命令中添加-c:v libx264rgb来修复它:

ffmpeg -hide_banner -y -t 2 -f lavfi -i color=c=blue:s=160x120 -tune stillimage -c:v libx264rgb -pix_fmt rgb24 00_empty.mp4
ffmpeg -hide_banner -y -i 00_empty.mp4 -vf "drawtext=text=string1:y=h/2:x=w-t*w/2:fontcolor=white:fontsize=60" -c:v libx264rgb -pix_fmt rgb24 01_text.mp4
ffmpeg -hide_banner -y -t 2 -f lavfi -i color=c=gray:s=160x120 -tune stillimage -c:v libx264rgb -pix_fmt rgb24 02_gray.mp4
ffmpeg -hide_banner -y -i 01_text.mp4 -i 02_gray.mp4 -i 02_gray.mp4 -filter_complex "[0][1][2]displace=edge=mirror" -c:v libx264rgb -pix_fmt rgb24 03_displaced_text.mp4

感谢voondethray在论坛videohelp.com上的回答:

真正的原因是02_grey .mp4的8位RGB到YUV灰度转换变成YUV 126,128,128(从8位转换的精度损失)https://github.com/FFmpeg/FFmpeg/blob/master/libavfilter/vf_displace.c
如果你提供一个真正的128128128年灰色YUV视频效果好了

相关内容

  • 没有找到相关文章

最新更新