πͺ VACE Join (Batch)
Join a whole folder of clips, not just two
- video_1
- video_2
- control_video
- control_mask
- width
- height
- length
- start_images
- end_images
- context_frames
- replace_frames
- new_frames
VACE Join (Batch) is the batch-aware version of the pack's flagship join node. Where plain VACE Join (WanVACEPrep) handles one pair of clips, this one is built to run inside a loop over many clips - a whole folder of footage stitched into one sequence. Same transition math, two extra switches (is_first, is_last), and the edge-case handling that makes it not fall apart on the first and last iterations.
It exists because of a real asymmetry: when you join clip A to clip B, then B to C, the middle clips do double duty. Clip B's tail is consumed by the AβB transition, and its head by the BβC transition. If you naively run a single-pair node in a loop, you'd drop frames at every boundary. This node's flags handle exactly that.
How it works
For each pair, it builds the same control video and mask as the single-pair version - context frames from each facing edge, gray placeholder transition zone, mask 1 over the zone. The difference is in what gets preserved:
- With
is_first = true(first iteration),start_imagesincludes the full beginning ofvideo_1. - On middle and last iterations,
start_imagestrims both edges ofvideo_1- because the head was already consumed by the previous transition. - With
is_last = true(final iteration),end_imagesincludes the full ending ofvideo_2. Otherwiseend_imagesis empty, since the next iteration's join will consume it.
The node also validates more strictly for batch use: middle/last iterations require video_1 to have at least 2Γ(context_frames + replace_frames) frames, because both edges get used. debug logs every input shape and flag, which makes it much easier to spot a wrong iteration.
The inputs and outputs that matter
video_1/video_2- the current pair of clips (IMAGE).is_first/is_last- the flags that gate the edge handling. If you're driving this with the pack's VACE Batch Context node, it computes these for you from the iteration index.context_frames(8),replace_frames(8),new_frames(0) - same meaning and same multiples-of-4 rules as VACE Join.debug- turn it on for per-iteration console logging.
Outputs: control_video, control_mask, width/height/length (to WanVaceToVideo), start_images and end_images (the preserved segments to concatenate around each generated transition), plus passthroughs for context_frames/replace_frames/new_frames.
Install
Same pack, same one-line answer - ComfyUI Manager, search "Wan VACE Prep", install, restart, or:
cd /path/to/comfyui/custom_nodes
git clone https://github.com/stuttlepress/ComfyUI-Wan-VACE-Prep
No extra dependencies. The is_first/is_last flags are plain booleans you can drive from a loop counter or from the companion Batch Context node.
Common issues
- "video_1 needs at least NΓ2 frames" - the strict batch validation kicking in on middle/last iterations. Your clips need to be long enough to survive having both edges consumed. Shrink
context_framesorreplace_frames. - Missing start or end footage - if your final video is missing the opening or closing,
is_firstoris_lastwasn't set on the right iterations. That's exactly what the flags exist for. - This is still VACE - transitions take minutes each at 14B. With a folder of clips, budget for a long session or reach for CausVid-style speed LoRAs.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| video_1 | IMAGE | β | |
| video_2 | IMAGE | β | |
| is_first | BOOLEAN | false | True for first iteration (index=0) - includes full beginning of video_1 in start_images. |
| is_last | BOOLEAN | false | True for last iteration - includes full ending of video_2 in end_images. |
| context_frames | INT | 84β120 | Reference frames from each video edge for VACE interpolation (multiple of 4). |
| replace_frames | INT | 80β120 | Number of frames to regenerate at each transition edge (multiple of 4). |
| new_frames | INT | 00β240 | Number of new transition frames to generate, in addition to the replace_frames (multiple of 4). |
| debug | BOOLEAN | false | Log details to the console |
Outputs (10)
| Name | Type | Description |
|---|---|---|
| control_video | IMAGE | β |
| control_mask | MASK | β |
| width | INT | β |
| height | INT | β |
| length | INT | β |
| start_images | IMAGE | β |
| end_images | IMAGE | β |
| context_frames | INT | β |
| replace_frames | INT | β |
| new_frames | INT | β |