我已经(几乎)能够基于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视频效果好了