ffmpeg overlay image

FFmpeg move overlay from one pixel coordinate to another (2)

I'm trying to write a command within FFmpeg that will first overlay one video stream on top of another one. Then I want the overlayed video to move from one pixel coordinate at a known time, and end at another pixel coordinate at a later time.

I'm comfortable with the basics of the -filter_complex, but I cannot figure out how to apply any arithmetic expressions - like the one's referenced here: https://www.ffmpeg.org/ffmpeg-utils.html#Expression-Evaluation

Here's an example of something I'd like to accomplish.

ffmpeg -i [INPUT1] -i [INPUT2] -filter_complex "[0:v][1:v]overlay=shortest=1:x=720:y=0:enable='between(t,10,20)'[overlay];...

In this example the overlay is stationary at pixel coordinate 720x0 from the 10th second to the 20th second.

However, Id like to have it move to a new location in a linear fashion and end at a different pixel coordinate.

For example, during that 10 second overlay, I'd like to have it start at 720x0, but then end at 1000x100.

Is this possible?

Is this about what you're looking for?

This crappy example has a duration of 6 seconds. The red box appears after 2 seconds and ends 3 seconds later.


ffmpeg -i bg.mp4 -i fg.mkv -filter_complex \
"[0:v][1:v]overlay=enable='between=(t,10,20)':x=720+t*28:y=t*10[out]" \
-map "[out]" output.mkv
  • Move x from position 720 to 1000 in 10 seconds. That equals 28 pixels/second.

  • y is easy enough.

  • t is the timestamp in seconds.

  • The overlaid video (fg.mkv in this example) will already be 10 seconds into its duration when it appears.

FFMpeg - move overlay from point a to b to c to d

This step-wise motion has to be constructed using a union of conditional expressions. Basic syntax of each unit is

(origin + (destination - origin)*(t - start time)/duration) * between(t,start time,end time)

Then all units are added together, like in the example below.

Let's say you want to move the clip from (ax,ay) to (bx,by) to (cx,cy) and back to (ax,ay). Let's keep each leg to 10 seconds.

Syntax is overlay=x='(ax+(bx-ax)*(t-0)/10)*between(t,0,10)+(bx+(cx-bx)*(t-10)/10)*between(t,10,20)+(cx+(ax-cx)*(t-20)/10)*between(t,20,30)':y='(ay+(by-ay)*(t-0)/10)*between(t,0,10)+(by+(cy-by)*(t-10)/10)*between(t,10,20)+(cy+(ay-cy)*(t-20)/10)*between(t,20,30)'