Nodes/TKNodes/Cross Dissolve Effect
ComfyUI Node

Cross Dissolve Effect

Make your stitched-together video segments feel like one take

By trashkollector·Created about a year ago·Updated a day ago· 1
Cross Dissolve Effect
  • curr_scene
  • prev_tail
  • IMAGE
curve
numDissolveFrames20

Generate video in chunks and you earn the right to stitch, but hard cuts between chunks look exactly like what they are: separate generations. A cross dissolve is the cheap, classic fix - fade one segment out as the next fades in - and Cross Dissolve Effect does it on the fly, in the tensor, right after your chunks come out of the sampler. It's the difference between "four clips taped together" and "one video that happens to have been rendered in four passes."

This is the kind of node that makes sense the moment you've done chunked generation, which - with LTX 2.3 being the current local favorite for long clips - is basically everyone working in long-form video right now. It belongs in the same family as the pack's TKFadeInVideo and TKTransitionDetector: finishing tools for stitching, not generation tools.

How it works

Two required inputs: curr_scene (the current segment's IMAGE tensor) and curve - a choice between linear and ease_in_out for how the blend ramps. An optional prev_tail (IMAGE) is the tail of the previous segment, and numDissolveFrames (default 20) says how many frames to overlap.

The mechanism is straightforward alpha blending: over n frames it takes the tail of the previous segment and the head of the current one, and cross-fades between them - (1 - a) * prev + a * curr with a going 0→1. ease_in_out applies a smoothstep (a²(3-2a)) so the transition eases rather than ramping at constant speed. If numDissolveFrames is 0, it dissolves over the full length of prev_tail; if it's positive, only the last N frames of the previous segment participate. The rest of the current scene passes through untouched.

Output is a single IMAGE tensor - the blended scene, ready to feed the next segment in your chain or the final combiner.

The inputs that matter

Honestly, just three: curr_scene and prev_tail (the two things being blended) and numDissolveFrames (how long the blend takes - 20 frames at 24fps is a snappy ~0.8s dissolve, which is a good starting point). The curve choice is taste; ease_in_out reads more "produced", linear is fine for quick stitches. On the first segment there is no prev_tail, so leave it unwired - the node detects an empty input and just passes the scene through.

Common issues

The dissolve only covers min(prev_tail, curr_scene) frames, so if your dissolve length exceeds the current segment's length you'll get a shorter blend than you asked for - it clamps rather than errors, which can surprise you if you set numDissolveFrames high. And since it works on already-decoded IMAGE frames, it's a post-sampling effect: put it after VAE decode and before your combiner, not in the latent path. It also doesn't re-time anything - if your segments have different lengths, the dissolve blends the overlapping region and the rest just concatenates.

Installing it

Part of trashkollector/TKNodes ("ComfyUI Handy Nodes"). Install via ComfyUI Manager (search "Handy Nodes") or:

cd ComfyUI/custom_nodes
git clone https://github.com/trashkollector/TKNodes

Restart, and it's under the TKNodes category. Pure tensor math - no extra dependencies beyond the pack itself.

CategoryTKNodes

Inputs (4)

NameTypeDefaultDescription
curr_sceneIMAGEthe current video segment.
curveCOMBOselect Cross dissolve effect.
prev_tailoptIMAGEprevious video segment to cross-dissolve.
numDissolveFramesoptINT200–1000number of frames to cross-dissolve. if <=0, uses the full length of prev_tail instead.

Outputs (1)

NameTypeDescription
IMAGEIMAGE