H3 LongTake Image to Video
One Photo, Thirty Seconds of Video, Without Batching Your Way Off a 16 GB Card
- model
- clip
- vae
- audio_vae
- start_image
- end_image
- face_image
- last_clip
- project_dir
- report
MiniMax H3 generates 4–15 second clips with native stereo audio - the first credible open answer to Veo's advantage. It does not generate a two-minute video. H3 LongTake Image to Video (H3LongTakeImageRender) is the honest workaround: it renders your long video as a chain of H3 clips from a single still, writes each clip to disk as it finishes, and hands off to the pack's Stitch node. You get 30 seconds out of a 16 GB card because only one clip is ever in VRAM.
It's one of three nodes in mark9009's pack, MIT-licensed, depending on ComfyUI core ≥ 0.34 and nothing else. Coming from the source-video side - motion or style transfer - you want H3LongTakeRender instead.
How the chain actually works
Clips are 17k+5 frames long; 124 frames is 5.2 seconds at 24 fps, the default. Clip 0 starts from start_image as a keyframe at frame 0, as the core H3 node does. Every clip after is anchored to the previous one's tail: its last 5 latent frames - video and audio - are pinned as native H3 keyframes at frames 0–4, then trimmed off. Each clip contributes clip_frames − context_frames new frames.
That overlap is the whole trick: the seam measures 0.96 rather than a cut. Chunks land in output/h3_longtake/<project_name>/, audio is muxed into each one, and models are evicted from VRAM between clips - staged in RAM, back in about a second. Kill the run and queue again - it resumes from the first missing clip.
The inputs worth your attention
model and audio_vae pick which H3 you're running. The fl2va model does a plain single-still video; turn on identity_reference or connect face_image and you need ref2va, the variant that takes image references alongside keyframes.
prompts is the unusual one: one block per clip, separated by a line containing ---, so at defaults you write 5.2 seconds of script per block. The last block repeats for the remaining clips, and it warns you if you wrote too many. Each clip only sees its own block, so describe changes in sequence.
duration_seconds is what you're asking for; the node works out the clip count and prints the plan (clip → time → prompt) when dry_run is on. Do that first - it costs nothing.
Then the anti-drift pair - the measured part, not the vibes part. On a 30-second project, ArcFace similarity to your reference face runs 0.27 with no references (a different person by 20 seconds), 0.55 with identity_reference, and 0.60 with face_image alone. The author recommends image plus face, since face-only drags your framing into a close-up. The node prepends the <Picture N> tags itself.
megapixels (start at 0.5) and clip_frames/context_frames (leave at 124 and 5) set the plan. seam_match defaults to color and corrects each clip's first 24 frames toward the previous tail - worth 5.8 down to 0.9 on colour jump. mode handles the essentials: continue skips finished clips, restart wipes them, redo_from redoes from a clip onward, redo_one regenerates one clip with head and tail anchored to its neighbours.
Outputs: last_clip, project_dir (into the Stitch's project_dir socket, or into the Refine), and report.
Installing it
ComfyUI Manager → search H3 LongTake → Install, or:
cd ComfyUI/custom_nodes
git clone https://github.com/mark9009/ComfyUI-H3-LongTake
Restart, then sort out ffmpeg - it uses VideoHelperSuite's if you have it, otherwise imageio-ffmpeg, otherwise your PATH:
python -m pip install imageio-ffmpeg
The models are the heavy part, same for every node in the pack: the H3 diffusion model into models/diffusion_models, the Qwen3-VL-32B text encoder into models/text_encoders (load with CLIPLoader, type minimax), both VAEs into models/vae, the 4-step Turbo LoRA into models/loras. The encoder is the awkward one - int8 is ~26 GB, NVFP4 ~16 GB for the same output with 11 GB more headroom. Take NVFP4 if you're on 64 GB of RAM.
One thing to check first: H3 ships under the MiniMax H3 Community License, which excludes the US, EU, UK and South Korea from its territory. Not the node's problem - but real.
Where people get burned
Changing canvas, clip_frames, context_frames or duration once a project exists makes the node refuse to continue: it compares signatures and tells you to use restart or a new project_name. It'll surprise you once.
Don't hand-delete chunk files - redo_one exists so you don't have to, and a half-missing cache throws a "clip N-1 is missing" error that reads like a crash and isn't.
And don't chase grain with steps: steps, Turbo strength and sigma shift don't measurably move the flat-area noise. The node samples positive-only at CFG 1 because it's built around the Turbo LoRA, and 4 steps is what that LoRA was distilled for. Soft output is softness; the fix is H3LongTakeRefine. Budget ~4:40 per clip at 544×960 on a 16 GB card - an hour for 60 seconds - and start at max_clips = 2 to check the seam.
Inputs (30)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | H3 fl2va model (image -> video) with the LoRAs already applied. identity_reference needs the ref2va (it accepts keyframes too). | |
| clip | CLIP | — | |
| vae | VAE | — | |
| audio_vae | VAE | H3 audio VAE: the generated audio is decoded per clip and put into the chunks. | |
| start_image | IMAGE | First frame of the video (keyframe at frame 0 of clip 0). | |
| prompts | STRING | A slow cinematic push-in on the subject; natural light, ambient sound. --- The subject turns and walks away from the camera. | One block per clip (5.2 s with clip_frames=124), separated by a '---' line. The last block repeats for the remaining clips. It can describe what happens in each stretch: the model only sees its own clip's block. |
| project_name | STRING | longtake_i2v | — |
| duration_seconds | FLOAT | 15.01–3600 | Length of the final video; the plan covers it with clip_frames clips. |
| width | INT | 89632–4096 | Used only with aspect=manual. |
| height | INT | 57632–4096 | Used only with aspect=manual. |
| clip_frames | INT | 12422–362 | Frames generated per clip (17k+5). 124 = 5.2 s per prompt block. |
| context_frames | COMBO | 5 | Previous clip's tail used as anchor (5 = clean seam, measured). |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 41–100 | — |
| sampler_name | COMBO | euler | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 |
| scheduler | COMBO | simple | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 |
| mode | COMBO | continue | continue: skips the clips already on disk. restart: deletes everything. redo_from: redoes from redo_from_clip onwards. redo_one: redoes ONLY redo_from_clip, anchoring head and tail to the neighbouring clips. |
| redo_from_clip | INT | 00–9999 | — |
| max_clips | INT | 00–9999 | 0 = all. |
| dry_run | BOOLEAN | false | Shows only the plan and the prompt blocks, does not generate. |
| end_imageopt | IMAGE | Last frame of the video (keyframe on the last frame of the last clip, as fl2va does). | |
| identity_referenceopt | BOOLEAN | false | start_image also as <Picture 1> (Ref2VA) in every clip: an identity anchor against drift in long chains. Needs the ref2va model. |
| face_imageopt | IMAGE | Close-up of the face as a reference in every clip (<Picture 2>, or <Picture 1> without identity_reference): the strongest anchor for the face. Needs the ref2va model. | |
| prompt_textopt | STRING | Prompt from an external text node (same '---' blocks): when connected it replaces the prompts field. | |
| aspectopt | COMBO | source | Canvas aspect: source = start_image's. width/height count only with manual. |
| megapixelsopt | FLOAT | 0.500.1–2 | — |
| anchor_modeopt | COMBO | keyframe | keyframe: previous clip's latent tail as a guide on frames 0..C-1. inpaint: tail copied into the latent and protected by the mask. none: independent clips. |
| audio_contextopt | BOOLEAN | true | Also carries the previous clip's audio tail. |
| seam_matchopt | COMBO | color | Exposure/hue correction of the first 24 frames towards the previous clip (pixels only). |
| chunk_crfopt | INT | 100–30 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| last_clip | IMAGE | — |
| project_dir | STRING | — |
| report | STRING | — |