Nodes/Prompt Deck/Reel Splice
ComfyUI Node

Reel Splice

The unglamorous half of H3 video extension

By omervaner·Created 3 months ago·Updated about 17 hours ago· 4
Reel Splice
  • sampled
  • reel_ctx
  • previous
  • next
  • latent
  • segment
  • frames

The boring node that decides whether the extension works

Reel Guide gets the attention: it pins your previous clip's tail into a fresh window and lets H3 generate forward. But the window you get back isn't the answer - it's tail, new material, and sometimes a head anchor, all sampled together as one blob. Somebody has to cut the anchors back out and glue the new tokens onto the film without stepping on the 17k+5 grid or smearing the audio clock. That's Reel Splice, and the work is a few dozen lines.

You'd be forgiven for thinking this belongs inside the other node. The split is deliberate: the seam arithmetic is what quietly ruins long clips, so it gets its own node, its own error messages, and an output you can inspect alone.

What it does with the window

Reel Splice doesn't guess. reel_ctx - the third output of Reel Guide - carries the whole plan: how many tail video tokens, how many new ones, how many head ones, and the matching audio offsets. Splice slices new_video out at the planned offset and the audio at its own, drops the anchors, then concatenates according to op: extend appends, prequel prepends, bridge inserts between previous and next, and loop appends the new tokens plus the window's regenerated head - because previous + gap alone never lands on the grid - so the film ends with a duplicate of its opening for the exporter to cut at.

Then three checks fire. The spliced film must be exactly the planned frame count. The audio must match round(frames × 40 / 24) within a tick - a foreign clip that joined at the wrong boundary gets trimmed or padded 25 ms rather than allowed to drift. And saves are staged-then-renamed, so a crash never leaves a half-written take looking finished.

Inputs and outputs

sampled is the window after your sampler: the guide's latent goes in, a sampled window comes out, and it lands here. reel_ctx is the plan, and it is not optional or swappable. previous and next must be the very same latents you handed Reel Guide; the node re-reads their frame counts and refuses if they don't match what was planned.

Three outputs, all useful:

  • latent - the whole film, anchors removed, ready to VAEDecode and VAEDecodeAudio, or to loop back into another Reel Guide as previous.
  • segment - the new tokens alone, with their audio. Handy when you want to look at what one window actually contributed, or run a refine pass over just the new material instead of the entire film.
  • frames - the film's total length in pixel frames, as an integer. Wire it into anything that wants a duration instead of counting on your fingers.

One wrinkle: the graph doesn't iterate. One queue = one window. To build a 30-second film you chain Reel Guide → sampler → Splice twice in one graph, feeding the first Splice's latent into the second Guide's previous, or save the take and queue again.

Saving takes

Flip save on Reel Guide - session is its widget too - and Splice writes into the output folder:

output/promptdeck_reel/<session>/<op>@<frame>/take_001/
    latent.safetensors   # video, audio, segment_video, segment_audio
    meta.json            # frames, width, height, op, anchors, loop_point_frame, created, ready

Every run makes a new take_NNN folder, and meta.json carries loop_point_frame so whatever exports your loop knows where to cut. On a long session that directory is your version history - no Save-node gymnastics.

Install

Same pack, same steps, no dependencies beyond ComfyUI itself:

cd ComfyUI/custom_nodes
git clone https://github.com/omervaner/ComfyUI-PromptDeck

Restart the server. Reel Splice needs the same ComfyUI H3 support Reel Guide does - it's manipulating AV NestedTensor latents directly, so an older build won't have the types it wants.

Where people get burned

Wiring the wrong window. Splice compares the sampled tensor's token counts against the plan and errors if they don't line up: "wire the window that this reel_ctx produced." This fires when you've got two windows in one graph and crossed the wires, and it fires when you change new_seconds on Guide without re-queueing.

Forgetting previous. For extend, prequel, bridge and loop, the film is not implied by the context - you have to pass it again. The node says as much when it's missing.

Passing a different film than you gave Guide. Splice re-reads previous frames against previous_frames in the plan. Swapped the source, or re-ran the earlier segment at a different length? It stops.

Joining a clip from somewhere else. A clip that didn't come out of this pipeline won't sit on the global audio boundary, and you'll get an "inputs are not on one timeline" error rather than a video that slowly slides out of sync. That error is a gift. Take it.

None of this requires understanding the token grid. But if you're debugging a seam that reads as a jump cut, the answer is almost always a too-short anchor - 5 frames is a fifth of a second of context, and H3 will happily invent the rest.

CategoryPromptDeck

Inputs (4)

NameTypeDefaultDescription
sampledLATENTThe Reel Guide window after sampling.
reel_ctxPROMPTDECK_REEL_CTX—
previousoptLATENTThe same film you gave Reel Guide.
nextoptLATENTThe same next clip you gave Reel Guide (bridge).

Outputs (3)

NameTypeDescription
latentLATENT—
segmentLATENT—
framesINT—