Video Concat / Splice π
Stitching clips end-to-end, crossfade optional
- clip_a
- clip_b
- clip_c
- clip_d
- images
- frame_count
- summary
In ComfyUI, a video is just a batch of images - a stack of frames in one IMAGE tensor. That convention is why a "video concat" node is really a "join these batches" node, and it's exactly what the Video Concat / Splice from TensorVizion/OmniNodes does: it takes up to four IMAGE batches and joins them end-to-end into one sequence. The "splice" in the name comes from the optional crossfade - blend the tail of one clip into the head of the next instead of cutting hard.
It's the assembly step for everything the pack's video tools produce: per-scene segments from Video Trim/Extract, separate generation runs, or Latent Interpolate outputs that need to become one timeline. And it color-matches well with the rest of the workflow - run Video Color Match first so the joined clips actually look like they belong together.
Inputs and outputs
Inputs: clip_a (required) plus optional clip_b, clip_c, and clip_d (unused slots are skipped). crossfade_frames (0β64, default 0) sets the blend length at each seam - a value of 0 is a hard cut. When crossfading, the node consumes frames from the end of the earlier clip and the start of the next, so the blended region isn't duplicated on top of a hard edit. Outputs: images (the joined batch), frame_count (handy for downstream FPS/duration math), and summary.
One genuinely thoughtful touch: if a later clip's resolution differs from clip_a's, it's resized (bilinear) to match before splicing. Mismatched resolutions would otherwise crash or produce a malformed batch, and the author removed that footgun rather than documenting it.
Install
Ships with OmniNodes:
cd ComfyUI/custom_nodes
git clone https://github.com/TensorVizion/OmniNodes
Or ComfyUI Manager β OmniNodes β restart. Pure PyTorch, no extra dependencies. Found under TensorVizion/Video.
Troubleshooting
- Crossfade looks duplicated/smeared - you may be double-blending: if your source clips already overlap (you trimmed them with overlap), a crossfade stacks frames. Cut clips with a clean end, or use
crossfade_framessmall enough to stay inside each clip's own frames. - Joined clip is the wrong length - check
frame_countagainst the sum of inputs; if it's short, a clip was skipped (an optional input left unwired) or an input resolved to empty. - Visual jump at the seam - that's a hard cut doing its job; either raise
crossfade_framesor run the clips through Video Color Match first so the cut at least lands on matching grades. - Node missing - restart ComfyUI and check the
[OmniNodes]terminal log.
Reach for it when separate clips need to become one timeline. It's the unexciting node that makes a multi-shot video possible.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| clip_a | IMAGE | β | |
| crossfade_frames | INT | 00β64 | β |
| clip_bopt | IMAGE | β | |
| clip_copt | IMAGE | β | |
| clip_dopt | IMAGE | β |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | β |
| frame_count | INT | β |
| summary | STRING | β |