H3 Concat A/V
Stitch two stages into one take, and hide the focus snap between them
- images_a
- audio_a
- images_b
- audio_b
- images
- audio
The two-stage episode render produces two finished segments: stage A (ref2va, establishing the scene and characters) and stage B (fl2va, the continuation chain). H3ConcatAV is the node that welds them into one file - video and audio, seam matched. It's the last stop before SaveVideo, and it exists because naively concatenating the two segments leaves a visible scar.
The scar is real and it's a property of the checkpoints, not a bug. Stage A renders on ref2va, whose soft reference conditioning pulls the image toward the refs' texture - a softer, more consumer-camcorder look. Stage B renders on fl2va, which is crisper with higher micro-contrast. Measured on an actual take, the seam between them was a +119..174% Laplacian sharpness step plus +5% luma. That's a visible focus snap mid-take, like the camera racked focus at exactly the moment you tried to hide a cut. Steps parity can't fix it, because you can't equalize two different checkpoints.
How it works
In: images_a and audio_a (required), images_b and audio_b (optional). Out: images and audio, the concatenated take. Leave images_b unconnected - or mute the stage B group - and it passes stage A through unchanged for a single-shot render.
The match_b switch (default match_to_a) is the clever part. When on, it measures the seam and matches segment B's texture down to segment A's: an auto-tuned gaussian (sigma searched until B's Laplacian lands on A's) plus a luma affine, done in float tensors before any encode. Matching downward is the correct direction - stage A's softer look is the intended aesthetic of the piece, so B gets blurred to meet it, not A sharpened to meet B. It skips itself when the seam is already within 15%, so you don't pay a blur pass on a clean join.
Install
Part of the H3 Multishot pack:
cd ComfyUI/custom_nodes
git clone https://github.com/jlucasmcrell/ComfyUI-H3-Multishot
or ComfyUI-Manager → H3 Multishot. Restart; ComfyUI v0.30.0+.
Two things to know before you queue. First, the stage B input is optional by design - the shipped workflow treats "no stage B" as "single shot," which is a nice escape hatch for testing. Second, if you're feeding this node from the two-pass upscale path, remember the resolution guard: both segments must be the same size, which is exactly why the pack ships H3IntScale to keep the round trip on-grid. Mismatched dimensions are the most common reason a ConcatAV run refuses to join.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| images_a | IMAGE | — | |
| audio_a | AUDIO | — | |
| images_bopt | IMAGE | Stage B. Leave unconnected, or MUTE the stage B group, for a single-shot render - stage A then passes through unchanged. | |
| audio_bopt | AUDIO | — | |
| match_bopt | COMBO | match_to_a | Match segment B's sharpness/tone to segment A at the seam (the two stages render on different checkpoints with different texture character). |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| audio | AUDIO | — |