H3 Infinite - Seamless AV Join v1.2
Seamless AV Join v1.2 — Where the Rendered Clips Actually Meet
- previous_images
- next_images
- previous_audio
- next_audio
- next_handover
- previous_full_images
- previous_handover
- images
- audio
- join_info
Generation nodes make the clips; this node is what makes them one video. H3ContinuousSeamlessJoinV11 takes the rendered output of clip N and clip N+1 and merges them with a context-aligned seam - short video blend, short audio de-click, and a clever trick called Safe Tail Bridge. It's the v1.2 join node, and if you're running the v1.2 or v1.3 workflow chain, this is what sits between your Continue nodes and your final render.
Why a plain concat isn't enough
When a continuation clip reuses a head of the previous latent, the rendered next clip contains that duplicated head. If you just concatenate the two rendered videos, you get the seam problem in its purest form: the next clip's first frames are a re-render of the previous clip's last frames, so you either see double motion or a hard jump. The join node fixes this by being context-aware - you tell it how many frames were reused (next_head_context_frames, wired from the Continue node's actual_head_context_frames), and it removes and aligns against exactly that.
Then there's the FL2VA freeze problem. Phase alignment can lose a few rendered frames to the grid, and the first couple of continuation frames can be unstable. Safe Tail Bridge (max_safe_tail_bridge_frames, default 2) replaces those first few wobbly continuation frames with detector-approved pixels from the previous clip. It only borrows frames that are safe - never from the freeze safety margin - which is the honest-sounding version of "we fixed the flicker without inventing footage."
video_crossfade_frames- 4 is the tested default; 0 disables the blend.audio_crossfade_ms- 15 ms audio de-click; keep it short or you get phasing/doubled transients.luminance_match- experimental fallback for a persistent brightness seam; off by default.
Inputs and outputs
Required: previous_images (your already-combined timeline; for the first join, Clip 1's Stitch Ready is fine), next_images (the full decoded render of the next clip - it needs the reused head present so it can trim it), next_output_mode (Stitch Ready for intermediate clips, Final Clip for the last one so its ending is preserved), plus the crossfade/trim controls. Optional: previous_audio, next_audio, next_handover, previous_full_images, previous_handover - the audio and handover inputs are what let the join stay audio-synced. Outputs are images, audio, and join_info for diagnostics.
Install
Part of the Herrgotts-H3-Infinite-Continuation-Suite pack:
cd ComfyUI/custom_nodes
git clone https://github.com/HerrgottMargott/Herrgotts-H3-Infinite-Continuation-Suite.git
Restart ComfyUI, reload. No pip deps, no bundled weights - H3 models/VAEs come from Comfy-Org's MiniMax-H3 repo.
Gotchas
The classic mistake is leaving next_head_context_frames unconnected - the node then doesn't know how much duplicated head to remove and the seam lands in the wrong place. If a brightness seam persists after all this, luminance_match is the escape hatch, but treat it as a diagnostic, not a fix. And note v1.2's join predates the v1.4 masked path; the v1.4 join node (same class family) handles the new shared-boundary geometry - use the join version that matches the generation version you're running.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| previous_images | IMAGE | Already prepared/combined previous timeline. For the first join, Clip 1 Stitch Ready is fine. | |
| next_images | IMAGE | FULL decoded render of the next clip. Its reused context head is needed for the context-aligned seam. | |
| next_output_mode | COMBO | Stitch Ready | Intermediate next clip = Stitch Ready. Current last clip = Final Clip so its complete ending is preserved. |
| next_head_context_frames | INT | Connect actual_head_context_frames from the next Continue from Latent node. | |
| video_crossfade_frames | INT | 40–16 | Short context-aligned video blend after Safe Tail Bridge. 4 frames is the recommended default; 0 disables the blend. |
| audio_crossfade_ms | FLOAT | 150–100 | Short audio de-click crossfade. 15 ms is the tested default; keep it short to reduce phasing/doubled transients. |
| luminance_match | BOOLEAN | false | Experimental fallback only. Safe Tail Bridge is the release default; enable luminance matching only if a persistent brightness seam remains. |
| luminance_fade_frames | INT | 160–96 | Experimental luminance-match fade length. Ignored when luminance_match is off. |
| max_luminance_correction_percent | FLOAT | 10.00–25 | Experimental luminance-match safety clamp. Ignored when luminance_match is off. |
| max_safe_tail_bridge_frames | INT | 20–4 | Recommended: 2. Reuses only detector-approved rendered frames lost to phase alignment; never borrows from the freeze safety margin. |
| previous_audioopt | AUDIO | — | |
| next_audioopt | AUDIO | — | |
| next_handoveropt | H3_CONTINUOUS_HANDOVER | Required when next_output_mode is Stitch Ready so the next clip's freeze-safe tail is removed. | |
| previous_full_imagesopt | IMAGE | Optional FULL decoded render of the previous individual clip. Connect this together with previous_handover to enable Safe Tail Bridge. | |
| previous_handoveropt | H3_CONTINUOUS_HANDOVER | Previous clip handover metadata. Together with previous_full_images it exposes up to 1-2 safe rendered frames that latent phase alignment had to discard. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| audio | AUDIO | — |
| join_info | STRING | — |