Video Loop Composer π
Make that clip loop without a visible seam
- images
- images
- summary
A looping GIF or an infinite-seam video is a small flex, but it's also a genuinely useful output - background ambience, a profile avatar, a short social clip. The problem is that raw AI-generated clips almost never loop cleanly: play them back-to-back and you get a visible jump where the end slams into the start. The Video Loop Composer from TensorVizion/OmniNodes turns a one-way batch into something that reads as a loop, in one of three modes.
It's the finishing step the pack was missing: Latent Interpolate produces a one-way morph sequence, and this node is what turns that into something that can actually loop for a GIF or a social post. Pure tensor math, no dependencies.
The three modes
pingpong(default) - plays the batch forward, then backward. The reversed pass drops the duplicate endpoint frames (images.flip()[1:-1]), so the loop doesn't stutter on a held frame at the turnaround. This is the classic "make anything loopable" trick, and it's why the default is what it is.straight_loop- repeats the batchrepeatstimes as-is. Only truly seamless if the source was already designed to loop (first and last frame match). Use it when your clip is loop-ready and you just want more of it.crossfade_loop- blends the lastcrossfade_framesinto the firstcrossfade_frames, smoothing away the seam so an otherwise non-looping clip reads as a loop. The more aggressive option for footage that isn't loop-friendly.
Inputs and outputs
Inputs: images, mode (the three above), repeats (1β20, how many times the cycle plays), and crossfade_frames (1β64, default 4, the blend length for crossfade mode). Outputs: images (the looped batch) and summary.
Install
Part of OmniNodes:
cd ComfyUI/custom_nodes
git clone https://github.com/TensorVizion/OmniNodes
Or ComfyUI Manager β OmniNodes β restart. No extra dependencies. Under TensorVizion/Video.
Troubleshooting
- Pingpong has a stutter at the turnaround - that's usually the source clip's last frame lingering. If your input is very short (the node needs at least 3 frames to pingpong properly), a longer base clip gives a smoother bounce.
- Straight loop has a visible jump - expected; that mode assumes a loop-designed source. Switch to
crossfade_loopand raisecrossfade_framesuntil the seam hides. - Crossfade looks smeared - a long blend on a fast-moving clip can double-expose. Drop
crossfade_framesto 2β4. - Node missing - restart ComfyUI and check the
[OmniNodes]terminal log.
Reach for it when the output needs to loop: pingpong for anything, crossfade for footage you want to genuinely repeat, straight for clips you designed as loops.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | β | |
| mode | COMBO | pingpong | 3 options: pingpong, straight_loop, crossfade_loop |
| repeats | INT | 11β20 | β |
| crossfade_frames | INT | 41β64 | β |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | β |
| summary | STRING | β |