Nodes/CoachBate/CoachBate H3 Inject Video Latent (img2img)
ComfyUI Node

CoachBate H3 Inject Video Latent (img2img)

MiniMax H3 has no video-to-video. This node fakes one properly.

By CoachBate·Created 3 months ago·Updated 22 days ago· 2
CoachBate H3 Inject Video Latent (img2img)
  • 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 from MiniMaxH3ReferenceToVideo or EmptyMiniMaxH3LatentAV. 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 the crops output 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 denoise and try again.
CategoryCoachBate/H3 Subject Refine

Inputs (3)

NameTypeDefaultDescription
av_latentLATENT—
imagesIMAGE—
vaeVAE—

Outputs (2)

NameTypeDescription
av_latentLATENT—
reportSTRING—