FrameFuse
Prepend one edited frame and your whole video edit falls in line
- video_frames
- frame
- audio
- STITCHED_VIDEO
- AUDIO
- FRAME_COUNT
- REPORT
FrameFuse looks like a two-line utility - take a frame, glue it onto a video batch - but the reason it exists is a genuinely sneaky workflow trick. Its author built it for what he calls temporal scaffolding: prepend an edited still to the start of a clip so a downstream video pass (Edit Anything LoRA, LTX, whichever) gets to see the look you want in its first frames instead of reconstructing it from a text prompt. That's the difference between a video model half-following your edit and actually holding the wardrobe, the accessory, the whole intended state. Nail one image in Flux.2 Klein or even Photoshop, fuse it in, and let the rest of the pipeline take it from there.
What it actually does
Under the hood it's pure tensor math, no video container, no ffmpeg. Your video arrives as a ComfyUI IMAGE batch - the thing VHS_LoadVideo.IMAGE hands you - which is a torch tensor shaped [B, H, W, C], frames stacked on the batch axis. FrameFuse picks one frame out of a second image input, repeats it, and torch.cats it onto the front or back of that batch. If the frame doesn't match the video's resolution, it bilinearly resizes it (clamped to 0–1, dtype preserved) before stitching.
The audio half is what makes it smarter than a hand-rolled ImageBatch node. ComfyUI AUDIO is a little dict of waveform + sample_rate; FrameFuse appends (or prepends) a run of zeros to the waveform exactly long enough to match the stitched frames - repeat_count / fps seconds of silence - so your clip stays in sync when you recombine. No audio connected? It skips the math and just passes None through. Nothing breaks.
The inputs that matter
- video_frames - your source
IMAGEbatch. This is the clip you're extending. - frame - a still or another batch to sample from. frame_index (default
-1) picks which frame; negative counts from the end, so-1means "the last frame," which is what you want for a hold-on-the-ending shot. - repeat_count - how many copies of that frame to stitch in. The author's own demo uses 10 prepended frames at 30 fps as a reference window.
- placement_mode -
append_end(hold on a final frame) orprepend_start(scaffold at the front). - resize_frame_to_video - default on. Leave it on unless you know the sizes match; off with mismatched sizes is a hard error.
- fps and extend_audio_with_silence - only matter when you wire in audio; fps drives how long the silence is, so match it to the video's real rate.
Outputs: STITCHED_VIDEO feeds straight into VHS_VideoCombine.images, AUDIO into its audio input, FRAME_COUNT if a downstream node needs the length, and REPORT is a plain-English string ("Appended 10 frame(s) from frame index 0…") - patch it into a text node when something looks off and you'll know instantly what it did.
Installing it
ComfyUI Manager is the easy route: search "FrameFuse", hit install, restart. Or the manual way:
cd ComfyUI/custom_nodes
git clone https://github.com/headline-design/comfyui-framefuse
Restart ComfyUI and grab the node from the search. That's the whole install - the requirements.txt is empty and the only import is torch, which ComfyUI already ships. No model downloads, no version pinning, nothing to fight. (Same pack gives you the Trim End node below.) An example workflow lives on the author's Hugging Face if you want to see the scaffold idea wired up end to end.
Where people get burned
- Wrong fps drifts your audio. The silence is computed as
repeat_count / fpsseconds. Type 24 when the clip is really 30 and by the end your audio is visibly late. - Negative
frame_indexindexes theframeinput, not the video.-1grabs the last frame of whatever you fed in - the intended last still, not the video's last frame. - Size mismatch with
resize_frame_to_videooff throws instead of silently warping. Keep the resize on; it's the friendly default. - Audio errors when silence is on but the input isn't valid AUDIO. If your audio source isn't a proper VHS-style
AUDIOdict, either fix the source or just disconnect the input.
It's a small node with a specific job, and honestly the "prepend an edited reference frame so the model stops drifting" trick is the reason to install it. If that sounds like your workflow, this is the cleanest way to do it.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| video_frames | IMAGE | Video represented as a ComfyUI IMAGE batch, such as VHS_LoadVideo.IMAGE. | |
| frame | IMAGE | Still frame or IMAGE batch. The selected frame is stitched onto the video batch. | |
| frame_index | INT | -1-100000–100000 | Frame index to use from frame. Use -1 for the last frame in that batch. |
| repeat_count | INT | 11–1024 | How many copies of the selected frame to add. |
| placement_mode | COMBO | append_end | Add the selected frame(s) to the end or the beginning of the batch. |
| resize_frame_to_video | BOOLEAN | true | Resize frame to match video_frames before stitching. |
| fps | FLOAT | 24.001–240 | Frame rate used when extending audio with silence. |
| extend_audio_with_silence | BOOLEAN | true | Add matching silence to the audio in the same direction as the stitched frames. |
| audioopt | AUDIO | Optional audio to pass through or extend with silence. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| STITCHED_VIDEO | IMAGE | — |
| AUDIO | AUDIO | — |
| FRAME_COUNT | INT | — |
| REPORT | STRING | — |