I'm trying to add overlays to an input video with ffmpeg that appear some time after the video starts.
The basic way to add an overlay is:
ffmpeg -i in.avi -vf "movie=overlay.avi [ovl]; [in][ovl] overlay" out.avi
But this adds the overlay video (or image) from the start of the input video until one of the videos ends.
I know how to offset the overlay video using movie=overlay.avi:seek_point=1.4
, but what about an offset on the input video?
I could always clip the video to the desired point, add overlay on the second clip, then stitch the two but that's not very efficient.
According to the limited FFmpeg overlay documentation, the process expects that both videos have the same
timestamp
(e.g., 0:00:00:00) value to keep things in sync, and warns if not done then theavi.out
will have an unwanted offset from theoverlay.avi
video file used.However, you can use that that fact and take advantage of it!
It's then conceivable that if the
overlay.avi
video has a startingtimestamp
with the desired offset which is required on thein.avi
input video, then theoverlay.avi
video will fire at that sametimestamp
(provided byin.avi
) to create the expected outcome for theout.avi
video.The only bad news is the
.avi
container doesn't have timestamps, unlike.mp4
or.mkv
file formats that do. You will have to switch to a file format that supports*timestamps*
for this to work (e.g.,overlay.mp4
oroverlay.mkv
) for creating the final output video file required.Expanding on arttronics' insightful, but speculative answer, video can indeed be easily be overlaid offset using the
-itsoffset
flag.The
-itsoffset
flag works like so:(NB: Despite the phrase "input files", the flag actually applies only to the input immediately following it. Note also this bug about offsets not applying to audio streams. H/T attronics.)
So overlaying with an offset is as simple as:
This works regardless of the container type.