我正在使用最新版本的 ffmpeg,我已经将图像叠加添加到视频中,并尝试在视频上为图像叠加制作动画,它运行正常,但叠加移动不流畅,抖动/有故障,所以有什么想法可以让动画变得流畅
ffmpeg.exe -y -i small.mp4 -loop 1 -i google.png -filter_complex [1]fade=t=in:st=1:d=1,fade=t=out:st=4.6:d=1[over1];[0:v][over1]overlay=x=20+((t-1)*85):shortest=1:y=66+((t-1)*23.04):enable='between(t,1,5.6)' -c:v libx264 output.mp4
输入视频:http://techslides.com/demos/sample-videos/small.mp4
图像 :https://i.stack.imgur.com/mrdnt.png
输出视频:https://vimeo.com/286859270
更新:覆盖因素说明
x=20+((t-1)*85):最短=1:y=66+((t-1)*23.04)
85? 23.04 ?
85 和 23.04 是 x 和 y 偏移率,我必须通过该偏移率从 x_start 和 y_start 到达目的地 x_end 和 y_end
x_起始 = 20 , y_起始 = 66
x_结束 = 411 , y_结束 = 172
x_diff = 391 y_diff = 106
覆盖开始时间 = 1 覆盖结束时间 = 5.6
持续时间 = 覆盖结束时间 - 覆盖开始时间
持续时间 = 5.6 - 1
持续时间 = 4.6
shift_x_rate = x_diff / 持续时间
shift_x_rate = 391 / 4.6 = 85
shift_y_rate = y_diff / 持续时间
shift_y_rate = 106 / 4.6 = 23.04
x = x_start + (t-overlay_start_time) * shift_x_rate
x = 20 + (t-1) * 85
设 t = 5.6
x = 20 + (5.6-1) * 85
x = 411 // 目的地 x
y = y_start + (t-覆盖开始时间) * shift_y_rate
y = 66 + (t-1) * 23.04
设 t = 5.6
y = 66 + (5.6-1) * 23.04
y = 171 // 目标 y
答案1
这里有多个问题:
a) 尽管您的表情随时间变化连续且流畅,但视频是一系列离散帧,因此实际的时间值序列是量化的。因此,您的运动速度应该是视频帧速率的整数倍,以 x 像素/秒和 y 像素/秒为单位。这样,每帧中的 x 和 y 增量都是恒定的,从而产生直线运动。在您的情况下,由于截断,这些逐帧不同。
b) 由于色度二次采样,叠加层的最终评估位置将进一步向下舍入为偶数值。因此,计算出的 (314.6,56.3) 将舍入为 (314,56),而 (316.8,57.4) 将舍入为 (316,56),从而在该帧中产生水平运动,即使表达式的纯增量是倾斜的。解决方案是告诉叠加层使用完整色度采样进行输出,然后再向下转换。
这些问题在所有叠加动画中都会出现,但由于您的视频分辨率较低,因此故障非常明显。您的视频是 30 fps,因此我将 x 和 y 增量设置为该值的倍数。
所以,
ffmpeg.exe -y -i small.mp4 -loop 1 -i google.png -filter_complex [1]fade=t=in:st=0.9:d=1,fade=t=out:st=4.6:d=1[over1];[0:v][over1]overlay=x=20+((t-0.9)*60):shortest=1:y=66+((t-0.9)*30):enable='between(t,0.9,5.6)':format=yuv444,format=yuv420p -c:v libx264 output.mp4