Nodes/ComfyUI-RGnodes/VACE Video Splice
ComfyUI Node

VACE Video Splice

Splice two videos on one timeline in ComfyUI, grey-fill included, masks preserved

By rgamevfx·Created 7 months ago·Updated 7 months ago· 3
VACE Video Splice
  • imagesequence1
  • imagesequence2
  • mask1
  • mask2
  • images
  • masks
  • frame_count
frame_offset0

VACE Video Splice is the transition-and-extension node of the pack: it lays two video sequences onto one timeline, offset against each other, and produces the grey-filled, white-masked output that VACE wants when you ask it to fill the gap. If you've been cutting clips together in DaVinci and round-tripping them back into ComfyUI, this is the thing that lets you do the timeline edit without leaving the graph.

The README's framing is honest about what it's for: "transitions, clip extensions, and edits." Sequence 1 is your base, sequence 2 gets overlaid starting at a frame_offset, and any frame neither covers becomes a solid grey placeholder with a white mask - the exact "generate here" convention VACE uses for extension and inpainting. So you splice a hard cut, VACE regenerates the join, and you get a transition without ever exporting an intermediate video.

How it works

Everything happens in two timelines built in parallel. First it validates the two sequences match in resolution and channel count (no scaling, no silent stretching), and that frame_offset is within 0–2000. Then:

  • Images: start from sequence 1, pad with grey frames (127/255) up to the total length, then overlay sequence 2 at the offset. Output length is max(seq1_count, offset + seq2_count).
  • Masks: start from an all-white "gap" canvas, then paint black where each sequence's video content sits - or paint your supplied mask1/mask2 if you connect them. The mask output is what keeps VACE from regenerating frames you already have content for.

It stays on your device (no CPU round-trip), clones rather than mutates, and hands you the final frame count as a third output - handy when the sampler needs to know how long the spliced clip is.

Inputs and outputs that matter

  • imagesequence1 (required, IMAGE) - the base clip.
  • imagesequence2 (required, IMAGE) - the clip overlaid on top. Same resolution and channels as sequence 1, or it errors.
  • frame_offset (required, INT, 0–2000) - which frame of the timeline sequence 2 starts at. Larger offset = longer gap = more grey for VACE to fill. This is your transition-length knob.
  • mask1 / mask2 (optional, MASK) - per-frame masks for each sequence. Omit them and the node treats the content regions as solid black (keep), gaps as white (generate).

Outputs: images, masks, and frame_count (INT) - the total timeline length, which you can wire into anything that needs the batch count.

Installing it

This node lives in rgamevfx/ComfyUI-RGnodes, a four-node pack with no dependencies beyond ComfyUI's own torch. Fastest via ComfyUI Manager - search "ComfyUI-RGnodes" - or:

cd ComfyUI/custom_nodes
git clone https://github.com/rgamevfx/ComfyUI-RGnodes.git

Restart, done. No requirements.txt, no model downloads. The included example workflow loads videos via VideoHelperSuite and runs the splice into a Wan VACE sampler, so if you want a reference graph, that's in the pack's workflows/ folder.

Troubleshooting

  • "Resolution mismatch" - the two clips must be identical pixel dimensions. Resize both to the same size (and height/width) before splicing; the error names the mismatch.
  • "Channel mismatch" - RGB vs RGBA collision. Convert one so both are the same depth.
  • Mask count or resolution errors - mask1/mask2 must have one mask per frame and match the video's resolution exactly.
  • Output shorter than you expected - remember it's max(seq1, offset + seq2), not seq1 + seq2. If sequence 2 slides entirely inside sequence 1's range, the splice overlays rather than appends, and the timeline length reflects that.
CategoryVace/VFX

Inputs (5)

NameTypeDefaultDescription
imagesequence1IMAGE
imagesequence2IMAGE
frame_offsetINT00–2000
mask1optMASK
mask2optMASK

Outputs (3)

NameTypeDescription
imagesIMAGE
masksMASK
frame_countINT