Я использую последнюю версию 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.imgur.com/yLqJciB.png

вывод видео: https://vimeo.com/286859270

Обновление: объяснение фактора наложения

х = 20+((т-1)* 85): кратчайшее = 1: у = 66+((т-1)* 23.04)

85? 23.04?

85 и 23.04 - это смещение по осям x и y, через которое я должен добраться до места назначения x_end и y_end из x_start и y_start

x_start = 20, y_start = 66

x_end = 411, y_end = 172

x_diff = 391 y_diff = 106

overlay_start_time = 1 overlay_end_time = 5.6

duration = overlay_end_time - overlay_start_time

длительность = 5,6 - 1

продолжительность = 4.6

shift_x_rate = x_diff / duration

shift_x_rate = 391 / 4,6 = 85

shift_y_rate = y_diff / duration

shift_y_rate = 106 / 4.6 = 23.04

x = x_start + (t-overlay_start_time)* shift_x_rate

х = 20 + (т-1) * 85

пусть если t = 5,6

х = 20 + (5,6-1) * 85

x = 411 // пункт назначения x

y = y_start + (t-overlay_start_time)* shift_y_rate

у = 66 + (т-1) * 23,04

пусть если t = 5,6

у = 66 + (5,6-1) * 23,04

y = 171 // пункт назначения y

1 ответ1

1

Здесь есть несколько проблем:

а) хотя ваши выражения являются непрерывными и плавными во времени, видео представляет собой серию дискретных кадров, поэтому фактический ряд значений времени квантуется. Таким образом, скорость вашего движения должна быть кратна частоте кадров видео, в единицах x-пикселов / с и y-пикселов / с. Таким образом, дельта x и y в каждом кадре постоянны, что приводит к прямолинейному движению. В вашем случае они отличаются кадр за кадром из-за усечения.

b) из-за подвыборки цветности окончательная оцененная позиция наложения подвергается дальнейшему округлению до четного значения. Таким образом, вычисленное значение (314,6,56,3) будет округлено до (314,56), а (316,8,57,4) округлено до (316,56), что приведет к горизонтальному движению в этом кадре, даже если чистая дельта выражений имеет наклон. Решением является наложение оверлея на выход с полной выборкой цветности, а затем преобразование с понижением.

Эти проблемы проявляются во время всей оверлейной анимации, но поскольку у вашего видео низкое разрешение, сбой заметно виден. Ваше видео составляет 30 кадров в секунду, поэтому я установил для x и y delta значение, кратное этому.

Так,

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .