CoachBate H3 Inject Video Latent (img2img)
MiniMax H3 has no video-to-video. This node fakes one properly.
- av_latent
- images
- vae
- av_latent
- report
The hole this fills
MiniMax H3 is built to generate, not to edit. Its own nodes always hand the sampler an all-zeros joint audio-video latent, and the images you feed it are conditioning - re-injected on every step, never a starting point. That's deliberate, and it leaves a gap: no stock way to say "here are real frames, keep them." Which is what breaks any H3 refine pass, where you want the model to sharpen a subject's crops instead of inventing one.
CoachBate H3 Inject Video Latent (img2img) is the bridge. It encodes your real frames into the video stream of H3's AV latent and leaves the audio stream alone, which turns SamplerCustomAdvanced into ordinary img2img.
(One thing worth saying once: H3's community licence geofences the weights out of the US, EU, UK and Korea. That's H3's problem, not this node's - but it's the reason a lot of people can't run any of this locally at all.)
What it actually does
H3's video VAE maps 17k+5 pixel frames onto 5k+2 latents, which means it truncates a frame count that isn't on that grid. Handle that wrong and you get the classic failure: the last frames of your clip encode nothing, the latent gets padded some other way, and the sampler turns that padding into a subtly different scene.
So this node pads the pixel frames first - repeating the last frame until the count reaches H3's grid - and only then encodes. A repeated frame is an honest, temporary freeze - the stitch drops the extra frames anyway. It then checks that the encoded latent matches the AV latent's spatial shape (both are pixels ÷ 16, so your crop canvas and the H3 node's width/height have to agree) and its temporal length. A temporal mismatch is trimmed or padded rather than thrown, but it prints a loud warning in the report, because it means your frame count is off the grid.
The report string isn't decoration: it tells you how many frames it padded and whether it
trimmed, and when something looks wrong downstream it's the first place to look.
Inputs and outputs
Three inputs, all required, all obvious:
av_latent- the LATENT fromMiniMaxH3ReferenceToVideoorEmptyMiniMaxH3LatentAV. It has to be the H3 joint AV latent (a NestedTensor); a plain latent gets you a clear error.images- your real frames. In the refine pipeline this is thecropsoutput of CoachBate H3 Subject Track + Crop.vae- H3's video VAE.
Outputs: av_latent (feed the sampler, or the next node in the chain) and report (a STRING -
wire it to a text preview while you're setting a workflow up).
Set strength with denoise, not with SplitSigmas
This is the trap. H3 is flow-matching with a large sigma shift - 12 by default - and that shift
puts even the last split point of a short schedule at an effective sigma around 0.8. Split the
schedule there and you have asked it to rewrite the frame. Use BasicScheduler's denoise
instead: that builds a full-range schedule and keeps only its lowest sigmas, so your step count
and your strength stay independent controls.
Practically: denoise 0.35–0.55 adds detail without changing the shot. Go higher and the subject
starts drifting against the body. And steps has to follow the turbo LoRA you loaded - 8-step
LoRA, 8 steps; 4-step, 4. Nothing enforces it; a mismatch just quietly costs you quality. If you
don't know, use 8.
If the audio stream matters (and on H3 it usually does, since the lipsync is driven through it), pair this with MiniMaxH3NativeAudioLock so you don't hand the sampler a video latent that doesn't match the audio.
Install
It ships in ComfyUI-CoachBate - ComfyUI Manager, search "CoachBate", or:
cd ComfyUI/custom_nodes
git clone https://github.com/CoachBate/ComfyUI-CoachBate.git
Restart ComfyUI afterwards; the nodes land under CoachBate / H3 Subject Refine. The pack
declares no pip dependencies of its own, and this particular node needs nothing beyond ComfyUI's
H3 nodes and its own pack. The wider refine set does need ultralytics and the Video Helper
Suite, so if you're installing for the whole pipeline, install those too.
Where it bites
- "Expected a MiniMax H3 joint AV latent (NestedTensor)" - you're feeding a plain LATENT. Grab it from an H3 latent node, not from a VAE Encode.
- "Spatial latent mismatch" - the encode doesn't match the AV latent's shape. Almost always your crop canvas size vs the H3 node's width/height; they must be the same in pixels.
- A temporal mismatch warning in the report - your frame count is off H3's 17k+5 grid. It'll work, but fix the count (39, 56, 73, …) rather than living with the warning.
- Everything comes back over-cooked - you're splitting sigmas somewhere. Move strength to
denoiseand try again.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| av_latent | LATENT | — | |
| images | IMAGE | — | |
| vae | VAE | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| av_latent | LATENT | — |
| report | STRING | — |