CineTimeline|H3 关键帧动态路由
The node that finds your keyframe stills and pins them to the right frames
- clip
- video_vae
- audio_vae
- positive
- av_latent
- mux_audio
- conditioned_prompt
- media_map_json
- report
- refinement_conditioning
The cleverest node in CineTimeline's keyframe chain is also the one that drags the most baggage along. Where the pack's other nodes are careful to stay model-neutral, CineTimelineH3KeyframeConditioning ("CineTimeline|H3 关键帧动态路由") is unapologetically MiniMax H3-specific - and it does two jobs at once.
First it encodes your prompt into H3's conditioning and builds the AV latent (video and audio in one bundle). Then it does the part the name promises: it reads the keyframe plan, loads each pinned still straight from ComfyUI's input folder, and injects it into the conditioning at exactly the frame the plan says - the first-frame image at frame 0, the last-frame image at the final frame, every middle guide at its own spot.
Why this is different from just dropping in images
H3 isn't an image-to-video model the way you're used to. It treats text, image, video and audio as one context, and its "guide" mechanism lets you pin a still at a specific position inside the clip - the same idea that made first-frame/middle-frame/last-frame conditioning a thing for LTX, but with native audio and at H3's quality. So a keyframe here isn't a reference the model vaguely consults; it's a constraint at a frame it must honor.
The node loads each image by asset_id from the plan (plain ComfyUI input paths) and applies it through ComfyUI core's MiniMaxH3AddGuide at the guide's local frame. No image sockets on this node at all - that's the "dynamic routing": it goes and fetches what the plan tells it to.
Inputs and outputs
Required: clip, video_vae, audio_vae, the prompt, width/height (defaults 864×480), length (default 124 frames - about 5 seconds at 24fps), and keyframe_plan_json, which comes straight out of CineTimelineKeyframePlan. The plan's guides are pinned at absolute frames, so keep the length widget in agreement with the plan's frame_count or you'll be conditioning a latent that's shorter than a pinned frame - a confusing failure to debug.
Outputs, in the order you'll care about them:
positive- the conditioning with all keyframe guides baked in. Feed it to your H3 sampler.av_latent- the video-plus-audio latent the sampler actually denoises.mux_audio- the audio companion, for monitoring or muxing while the AV latent does the real work.conditioned_prompt- the exact prompt that went in, handy for a sanity read.media_map_json/report- which assets landed at which frames, and a human summary in Chinese.refinement_conditioning- the plain positive before any keyframe guides were added, saved so an optional HQ refinement pass can sample without re-imposing the stills.
The dependency fine print
This node's imports are lazy - they happen inside build, not at module load. So the node appears in your graph and even queues fine; it only explodes when you actually run it if something's missing. What it needs at run time: ComfyUI with H3 support (for MiniMaxH3AddGuide), the community minimax-h3-audio-T8 node (v1.3.2, which provides the conditioning builder), and the H3 weights plus the qwen3vl text encoder on a serious card - the author tests on an RTX 8188. The README also notes INT8 model files require starting ComfyUI with --disable-dynamic-vram, so add that if you're on the quantized chain.
One licensing thing worth knowing before you build around H3: the H3 open weights ship under a community licence that excludes the US, EU, UK and South Korea from running the local weights. The timeline plugin itself is Apache-2.0 - this is about the model underneath it, not the nodes.
Installing
Same as the rest of the pack - no Python dependencies of its own:
# ComfyUI Manager: search "ComfyUI-CineTimeline"
# or:
cd ComfyUI/custom_nodes
git clone https://github.com/bo341805sg/ComfyUI-CineTimeline
Then restart ComfyUI and install the H3-side requirements (above). Expect a hard error if a plan guide has no asset id, and a ComfyUI LoadImage error if the path it's told to fetch doesn't exist in your input folder. Given how new this all is, treat any mid-run failure on the H3 side as "check the ecosystem versions first" - the pack moves fast.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| clip | CLIP | — | |
| video_vae | VAE | — | |
| audio_vae | VAE | — | |
| prompt | STRING | — | |
| width | INT | 86432–16384 | — |
| height | INT | 48032–16384 | — |
| length | INT | 1245–3600 | — |
| keyframe_plan_json | STRING | — |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| positive | CONDITIONING | — |
| av_latent | LATENT | — |
| mux_audio | AUDIO | — |
| conditioned_prompt | STRING | — |
| media_map_json | STRING | — |
| report | STRING | — |
| refinement_conditioning | CONDITIONING | — |