Nodes/comfyui-obvpm-timeline/H3 MCtx Assemble (obvpm)
ComfyUI Node

H3 MCtx Assemble (obvpm)

Cut the whole sequence in one node, with no timeline UI

By chanon·Created 21 days ago·Updated 2 days ago· 33
H3 MCtx Assemble (obvpm)
    • path
    • images
    • audio
    sequence
    filename_prefixproject1/cut
    crf19

    The Timeline node is lovely until you want the same cut to happen on a queue run, or in a graph you drive from an API. That's H3 MCtx Assemble: the same sequence, the same seam derivation, no widget, no buttons. Give it an ordered list of clips and it writes one MP4.

    If you've been gluing H3 clips together in a video editor and wondering why every seam has a visible step, this is the node that fixes it - not by clever compositing, but by knowing where the seams actually are.

    How it works

    The sidecars do the arithmetic. Every take saved by this pack records who it continues and at which raw frame that join sits, so given a list in playback order the node derives each cut itself:

    • R extends L - L exits at R.join_raw - L.pinned_head; R enters at 0. A plain tail extend puts the exit exactly at L's delivered end, so no cut is needed at all. A trim-point extension lands it earlier, and the frames that belong to the other seam get cut.
    • L prepends R - L plays whole, R enters at L.join_raw - R.pinned_head. That includes the 12-frame offset a continuation prepend carries.
    • No relation between neighbours - butt join, with a warning in the log.

    Writing is what the author calls SMART-CUT. Each clip's played range is split into copy runs (packet spans from one IDR keyframe to another, stream-copied bit for bit) and bridge runs - the sub-GOP frames around a mid-clip seam, which get re-encoded from already-decoded frames at your crf. A whole-clip sequence is therefore 100% copied, zero video generation loss. Because these saves use x264's default GOP (~250 frames), short takes usually have a single IDR at frame 0, so a mid-clip entry re-encodes exactly one clip.

    Audio is different, deliberately: it's decoded, concatenated sample-accurately and encoded once as a continuous AAC track, because copying AAC packets across a splice always clicks.

    Inputs and outputs

    Three inputs, all you need:

    • sequence - one clip per line, in playback order, output-relative paths like h3/clip_00001.mp4. Append @ N to force a clip to enter at delivered frame N instead of the derived seam. Lines starting with # are ignored, so you can comment your cut.
    • filename_prefix - default project1/cut. The leading folder is the project, matching base_folder elsewhere: an assembly is delivery, so it sits beside the takes rather than inside them.
    • crf - H.264 quality for the bridge frames, default 19. Lower is better and bigger. Most of your frames are copied, not encoded, so this only touches the few around a mid-clip seam.

    Outputs are path (the written MP4), images (the assembled frames) and audio (the assembled audio, present when every clip carries audio). It's an output node, so it runs when you queue.

    Install

    cd ComfyUI/custom_nodes
    git clone https://github.com/chanon/comfyui-obvpm-timeline
    

    Restart ComfyUI. No extra Python deps - the pack declares none, because torch, safetensors and av are already in ComfyUI's own requirements. ComfyUI from 2026-08-13 or later for core H3 support. In Manager, search the pack title comfyui-obvpm-timeline; nodes all end in (obvpm), so searching obvpm in the node menu lists the set.

    Note the pack has no installable models of its own - but the bundled workflow expects H3 weights, an H3 video VAE and an H3 audio VAE, plus the companion packs (comfyui-obvpm, KJNodes, the MiniMax H3 latent upscaler, the H3 turbo loader, Spectrum, rgthree) for the rest of the graph.

    Troubleshooting

    • "Clip not found" means the path isn't output-relative, or your ComfyUI output folder isn't where you think it is. The values are literally the ones the loaders list.
    • A warning about butt joins means the two clips have no recorded lineage between them. They'll still be assembled, but there's no sidecar knowledge of where the join should land, so it cuts at the boundary.
    • Seams step even though the sidecars are right? The level step at a join is real and measurable - see the Timeline node's level_lock/crossfade, which run in the preview/export route, not in this node. Assemble cuts; it doesn't grade.
    • The source takes remain the masters. Nothing here rewrites a clip or its sidecar, so a bad export costs you a re-run, not a re-generation.

    Where I'd actually reach for it: a batch job that renders five variations of the same 40-second cut overnight, or a pipeline where the generation happens in one workflow and the assembly in another. For exploratory work, the Timeline widget's instant preview is the better tool; this is the one you automate.

    Categoryobvpm/h3

    Inputs (3)

    NameTypeDefaultDescription
    sequenceSTRINGOne clip per line, in playback order, as output-relative paths (the same values the H3 loaders list), e.g. h3/clip_00001.mp4. Append ' @ N' to force a clip to enter at delivered frame N instead of the derived seam. Lines starting with # are ignored.
    filename_prefixSTRINGproject1/cutOutput path prefix, like core save nodes. The leading folder is the project, matching base_folder elsewhere; an assembly is delivery, so it sits beside the takes it was cut from rather than inside them.
    crfINT190–51H.264 quality (lower = better, bigger).

    Outputs (3)

    NameTypeDescription
    pathSTRINGPath of the written MP4.
    imagesIMAGEThe assembled frames.
    audioAUDIOThe assembled audio (present when every clip carries audio).