VACE Video Splice
Splice two videos on one timeline in ComfyUI, grey-fill included, masks preserved
- imagesequence1
- imagesequence2
- mask1
- mask2
- images
- masks
- frame_count
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/mask2if 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/mask2must 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.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| imagesequence1 | IMAGE | — | |
| imagesequence2 | IMAGE | — | |
| frame_offset | INT | 00–2000 | — |
| mask1opt | MASK | — | |
| mask2opt | MASK | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| masks | MASK | — |
| frame_count | INT | — |