ffmpeg 使叠加动画流畅

ffmpeg 使叠加动画流畅

我正在使用最新版本的 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

相关内容