AI clips that don't freeze or loop

An image-to-video clip runs about five seconds. A shot often runs seven to eleven. What fills the gap decides whether a generated person looks alive.

Two seconds from each of five videos it made

Three ways to fill it, measured

We hit this making comedy shorts with animated photos: an LTX clip of a person laughing is about five seconds, and the shot it sits in is longer. Each way of filling it was measured on the same 11-second shot. The raw LTX clips measured 0% repeats, so the loop was ours, not the model's.

Frozen and repeated frames on an 11-second shot
Hold the last frame63% frozen, reads as a pause
Play the tail back and forth29% repeats, reads as a rewind
Continue the clip from its own frame0% frozen, 0% repeats
A contact sheet: one settled frame from each scene of a render
Every clip goes on a contact sheet before it is used

Continue, don't stretch

Take the clip's last good frame, run image-to-video again from it with the same prompt, and join the two with a cross-fade of about 0.12 seconds. Repeat for longer shots. Each extension is one more clip, about $0.08 on Modal.

"Last good" matters: continuing from an earlier frame also cuts out a bad stretch. A feet-up kick that grew a third leg never plays if the continuation starts before it.

uv run tools/ltx_extend.py --input people/rob.mp4 --at 4.8 \
    --prompt "A fixed view that never moves ... the same man keeps laughing" \
    --output people/rob-long.mp4
# --times 2 for a third link
Dana, an invented cast member, at her desk
A cast portrait, the input to a clip

Learned the hard way

  • Never continue from a close-up. With only a face to go on, the model invents a new scene.
  • Lock the framing in words, a fixed view with no zoom and no cuts, but don't say "tripod": it draws one.
  • Seek before the end. Grabbing a clip's very last frame with ffmpeg returns nothing.
  • Keep what you paid for. A chain that fails at link two keeps link one, so a re-run doesn't pay twice.
  • Slow a slightly short clip down to about 0.8x before faces look slow-motion; beyond that, extend.
Four colleagues in headsets, from a shot lengthened with ltx_extend.py
The Great Return: its long shots were extended, not held

Catching it automatically

A whole-frame check for movement misses a frozen face, because something else on screen is always moving. qc.py --render looks per region for motion that stops dead: part of the frame moving for three seconds or more, then frozen for two or more while the rest goes on. On four renders it found every clip freeze in the old cuts and none in the fixed ones.

ltx_extend.py on GitHub

Four people on a video call
You're On Mute, checked with qc.py before upload