Nodes/ComfyUI-FrameUtilitys/Frame Extender 🎬
ComfyUI Node

Frame Extender 🎬

Stitch clips together without touching a video editor

By lum3onΒ·Created about a year agoΒ·Updated 2 months agoΒ· 16
Frame Extender 🎬
  • source_video
  • additional_frames
  • extended_video
β—„insert_position-1β–Ί
β—„width512β–Ί
β—„height512β–Ί
β—„interpolationbilinearβ–Ί
β—„methodkeep proportionβ–Ί
β—„conditionalwaysβ–Ί
β—„multiple_of0β–Ί
β—„blend_frames0β–Ί
β—„loop_additionalfalseβ–Ί
β—„memory_efficienttrueβ–Ί

You generated a clip and now you want an intro tacked on, an outro appended, or two takes stitched into one longer video. That's what FrameExtender does: it takes a source video and a second batch of frames and splices them together at any position you choose - beginning, end, or a specific frame index. No external video editor, no re-render, just IMAGE tensors in, one IMAGE tensor out. If you're already building video pipelines in ComfyUI, this is the node that saves you from hand-assembling frame stacks with batch-editing hacks.

How it works

The whole pack treats "video" the ComfyUI way: a stack of frames where the batch dimension is the time axis, shape [B, H, W, C] in float32. Both source_video and additional_frames are that kind of IMAGE tensor - the kind LoadImage outputs for a frame sequence or a video loader hands you. Set insert_position to -1 for end, 0 for beginning, or any frame index to splice mid-clip.

The two things that make it more than a dumb concat:

  • Blending. Set blend_frames to a small number like 5–10 and it creates a crossfade between the last frame of one clip and the first frame of the next, so the cut doesn't slam. One caveat: it's plain alpha interpolation between boundary frames - a linear blend, not optical-flow motion interpolation. The changelog calls it "motion-aware," but the shipped code doesn't move pixels, it fades them. Fine for most cuts; don't expect morphing.
  • Looping. loop_additional tiles your add-on clip to cover the source length if the source is longer. Handy when you want a repeating texture behind a longer base clip.

It also matches resolutions and channel counts automatically - an RGB add-on gets an alpha channel when the source is RGBA, and so on.

The inputs that matter

Honestly, the three you'll set are source_video, additional_frames, and insert_position. Then, depending on your clip, blend_frames for smooth transitions and loop_additional if you're using a short loop. memory_efficient (default on) splits long sequences into 32-frame chunks so an hour-long clip doesn't eat your VRAM.

Output: extended_video - wire it into a SaveImage/VideoCombine or further frame nodes.

The trap: default resizing

Here's where people get burned. width and height default to 512, with condition set to always. That means by default your source video gets resized to fit within 512Γ—512 on every run. Feed it a 1080p clip and you get a downscaled video out, and it's not obvious why. If you don't want that, set width/height to your clip's actual resolution and change condition to if different - then it leaves the source alone (the add-on clip still gets resized to match, which it has to anyway to be concatenated). Remember this for the Replacer and Repeater siblings in this pack; they share the same resizing system and the same default.

Installing

ComfyUI Manager: search "ComfyUI-FrameUtilitys" and install. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/lum3on/ComfyUI-FrameUtilitys

Restart ComfyUI. No models to download and no extra pip packages - it runs on what ComfyUI already bundles. A quick workflow shape: LoadImage(s) β†’ FrameExtender β†’ SaveImage, with the second clip feeding additional_frames.

Troubleshooting

  • Output came out tiny - the 512 default resize. Set your real resolution and condition: if different.
  • "Out of memory" on long clips - memory_efficient should be on by default; if you turned it off, turn it back on, or clip first (FrameClipper) and extend after.
  • Frame index out of range - insert_position is clamped to the source length, but if you're scripting values, keep it within 0..length-1.
Categoryimage/video

Inputs (12)

NameTypeDefaultDescription
source_videoIMAGEBase video sequence to extend (IMAGE tensor format)
additional_framesIMAGEFrames to add to the source video
insert_positionINT-1-1–10000Position to insert frames (-1 = end, 0 = beginning)
widthINT51264–8192Target width for frame resizing
heightINT51264–8192Target height for frame resizing
interpolationCOMBObilinearInterpolation method for resizing
methodCOMBOkeep proportionResizing method
conditionCOMBOalwaysWhen to apply resizing
multiple_ofINT00–512Round dimensions to multiple of this value (0 = disabled)
blend_framesoptINT00–50Number of transition frames for smooth blending
loop_additionaloptBOOLEANfalseLoop additional frames if source is longer
memory_efficientoptBOOLEANtrueProcess in chunks to save memory

Outputs (1)

NameTypeDescription
extended_videoIMAGEβ€”