Search code examples
videoffmpeg

FFmpeg move overlay from one pixel coordinate to another


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?


Solution

  • Is this about what you're looking for?

    making a movement

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

    Example:

    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.

    • it is important that t corresponds to real time. if the start time of the overlay is different from zero, there will be a discrepancy