LTX Chunk Assembler (TJ 2.5)
Joining LTX chunks without the ghost at the seam
- final_folder
- info
You rendered your long video as chunks because a 20-second 1080p LTX clip doesn't fit in anyone's VRAM in one pass. Now you have four folders of frames and a seam problem. LTX Chunk Assembler (TJ 2.5) is the node that turns those folders into one file - and its defaults are set up around a specific insight about where two chunks can be joined cleanly.
The mechanism, which explains the defaults
Each chunk was started from a handoff guide: the previous chunk's last N frames dropped in as the guide for the new one. That means the next chunk's first frame is a reproduction of a frame the previous chunk already contains. The two chunks agree perfectly at that moment and then drift apart; by the end of the overlap they've usually diverged.
Old-school cross-dissolving averaged the whole overlap, which blended across frames that no longer match and produced the soft doubling everyone calls ghosting. The seam_mode default, early_cut, cuts exactly at the frame the two chunks share. Identical content, nothing mixed. If the camera is moving and you can see a velocity step more than a content jump, early_scurve ramps across a few frames with an S-curve - soft at both ends, quick through the middle, which is where a velocity change reads as a jerk. early_blend is the same length with a straight fade. dissolve and hard_cut are the old behaviour and you probably don't want them.
Audio gets the same treatment via audio_crossfade, defaulting to auto: it measures each seam and picks between passing identical material through with a linear fade, equal-power for independent generated sound, or a short 15 ms splice for music the model rendered slightly differently in each chunk - a long blend of near-but-not-identical audio flanges, which is a real and ugly sound. Every option consumes the same overlap, so audio never drifts out of sync with picture.
What you actually set
- run_name / runs_folder - must match what the Chunk Writer used. Default folder is
ltx25_one_runsunder ComfyUI'soutput/. - overlap_frames - must equal the
handoff_framesyou rendered with, and you must have started each window that many frames before the previous chunk ended. This is the number people get wrong. - seam_mode / seam_blend_frames - as above. Keep blends short.
- match_levels - off by default, and deliberately so: it only shifts each chunk's average brightness to match the one before, never contrast. Turn it on if one chunk came back noticeably darker; leave it off and grade in your editor if the seams look fine.
- write_video / video_fps / video_crf - produces
<run>_final.mp4next to the stills. CRF 18 is visually near-lossless.
Outputs are final_folder and info, both strings - the folder it wrote and a summary of what it did.
Why it doesn't hand you an IMAGE batch
Because a 16-second 1920×1088 sequence is roughly 10 GB as float32. Handing that to a video encoder through a wire would chew your RAM for no reason, so this node writes to <run>/final/ and tells you where. If what you need is frames on a wire, wire the last chunk's images into Video Combine instead - the writer passes them through.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/designloves2/ComfyUI-TJ_NODE_STUDIO_ONE.git
restart, then run install_requirements.sh (install_requirements.bat on Windows) once, since the pack's other node packs don't come with a Manager install. The mp4 encode goes through PyAV, which ComfyUI already ships; if av is genuinely missing the node degrades to writing stills only rather than failing outright.
Where this bites
If overlap_frames doesn't match the render, you get a visible hiccup at every join and there's no error to tell you why. If you assemble before the last chunk is on disk, the run assembles short. And the writer can call this whole thing for you: with auto_assemble on and total_chunks set, the final chunk triggers assembly automatically, which is the sane path unless you're queueing chunks by hand.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| run_name | STRING | run01 | The run to assemble. Must match what the Chunk Writer used. |
| runs_folder | STRING | ltx25_one_runs | Subfolder of ComfyUI's output directory holding the run. |
| overlap_frames | INT | 80–64 | How many frames each chunk shares with the next. Must match the handoff_frames you rendered with, and you must have started each window that many frames before the previous chunk ended. |
| crossfade | BOOLEAN | true | Blend across the overlap instead of cutting. Off = hard cut, overlap frames taken from the earlier chunk. |
| write_video | BOOLEAN | true | Also encode <run>_final.mp4 alongside the final/ PNG sequence. |
| video_fps | FLOAT | 25.001–240 | Frame rate for the assembled video. Match your timeline. |
| video_crf | INT | 180–51 | h264 quality. Lower is better and bigger; 18 is visually near-lossless. |
| match_levels | BOOLEAN | false | Offset each chunk's brightness to match the one before it. This averages the MEAN over every overlap frame and never touches contrast - unlike the writer's per-frame match, which was unreliable. Still off by default: try the crossfade alone first. |
| audio_crossfade | COMBO | auto | How to blend audio across the overlap. Auto measures each seam and picks: identical material (an inpainted song) passes through untouched with a linear fade; independent generated sound gets equal_power so the level holds; music the model rendered slightly differently in each chunk gets a short 15ms splice, because a long blend of near-but-not-identical audio flanges. Short forces that splice everywhere, off is a hard cut. Every setting consumes the same overlap, so the audio never drifts out of sync with the picture. |
| write_final_frames | BOOLEAN | false | Also write the assembled sequence as stills in <run>/final/. Off by default because the mp4 is the deliverable. Forced on if write_video is off. |
| frame_format | COMBO | jpeg | Format for the final/ stills, when they are written at all. Chunk frames are read in whichever format the writer produced. |
| jpeg_quality | INT | 9570–100 | Only used when frame_format is jpeg. Chroma is never subsampled. |
| seam_mode | COMBO | early_cut | Where to join two chunks. The next chunk's FIRST frame is the handoff guide reproduced, so it is pixel-identical to the previous chunk's frame at (end - handoff_frames). early_cut switches exactly there - identical content, nothing mixed, no ghost. early_scurve blends over seam_blend_frames with an S-curve - soft at both ends, so a difference in camera velocity between the chunks is ramped rather than stepped. early_blend is the same length with a straight fade. dissolve and hard_cut are the old behaviour, which joined at the END of the overlap after the chunks had already diverged. This setting supersedes the crossfade toggle above. |
| seam_blend_frames | INT | 31–32 | How many frames the early_scurve / early_blend seam covers. Clamped to handoff_frames. Short is usually right: the chunks only agree near the start of the overlap, so a long blend reaches into frames that have already diverged. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| final_folder | STRING | — |
| info | STRING | — |