Nodes/noEmbryo nodes/H3 AV Latent from Video /noEmbryo
ComfyUI Node

H3 AV Latent from Video /noEmbryo

Turn a real video into an H3 context clip — audio included

By noembryo·Created 3 years ago·Updated 4 days ago· 46
H3 AV Latent from Video /noEmbryo
  • video_vae
  • audio_vae
  • images
  • latent
  • audio
  • latent
◄source_fps24.000►

MiniMax H3 is the 33B omni-modal video model MiniMax dropped in August 2026: text, image, video and audio in one context, 4–15s clips at 24fps, with the audio generated jointly rather than bolted on afterwards. ComfyUI had day-zero support. What it does not have is a friendly way to say "here is a video I already have, continue from it, and keep its soundtrack."

That's the hole this node fills.

Why you'd wire it up

H3 Motion Context (NikoDemon80's pack) is how people make anything longer than fifteen seconds: you generate one clip at a time, save each approved clip as a clip_00001.safetensors archive, feed the approved clips back in as context, and stitch them at the end. The chain is native to that pack.

This node is the door in the side of the chain. It takes a video you already have - real footage, an older render, a clip you made in another tool - and converts it into the exact AV latent form that the H3 sampler and the H3 Motion Context Save Latent node expect. So you can seed a context chain from something that wasn't generated by H3.

How it actually works

You hand it frames plus audio, and it hands back one latent.

The frame path is the interesting part. H3 runs at 24fps natively and your source probably doesn't, so the node resamples by time, not by dropping every other frame: it computes the clip's duration from source_fps, works out how many output frames that is at 24fps, and picks the nearest source frame for each one. Same idea as VHS's force_rate, and the reason audio stays in sync instead of creeping. Those frames go through the H3 video VAE into a [B,C,T,H,W] latent where the batch axis is time. The audio is resampled to the audio VAE's sample rate and encoded separately, and the two are wrapped into a stream pair exposing unbind() - the same interface core's LTXVSeparateAVLatent and the H3 sampler code already understand, which is why this drops into an existing H3 graph with no adapters.

No audio connected? It encodes silence of exactly the right length instead. That's deliberate: the archive format always carries an audio stream, so a "silent" clip still needs one - same length, just empty.

There's a second path in through the optional latent input, for when you don't have frames. A nested AV latent from LTXVConcatAVLatent is used directly, its audio stream and all. A plain [B,C,H,W] latent from a VAE Encode gets wrapped as a one-frame H3 video stream, and you connect your audio separately - or leave it off and get silence matched to the frame count.

The inputs you actually set

video_vae and audio_vae are required: the MiniMax H3 video VAE (FP16 or INT8 ConvRot - INT8 ConvRot is the one that works on 30-series cards that have no fp8) and the H3 audio VAE in FP32. Then source_fps - set it to the true rate of your file, and remember the node assumes constant frame rate, so a variable-rate phone clip or screen recording will drift.

Connect images or latent, never both, and connect audio if you have it. The single output, latent, goes to H3 Motion Context Save Latent, which writes it into the numbered archive the chain reads back.

Install

ComfyUI Manager → search noEmbryo → install and restart. Or by hand:

cd ComfyUI/custom_nodes
git clone https://github.com/noembryo/ComfyUI-noEmbryo

Restart ComfyUI. The pack's project metadata declares no Python dependencies and there's no requirements.txt, so there is nothing for pip to chew on - the install is about as painless as custom nodes get. The heavy lifting is the models: the H3 VAEs, plus whatever weights your H3 graph uses (the full model is ~42.5GB, so quantization is the norm). The nodes land under Add Node → noEmbryo → MiniMax H3.

Where people get burned

  • "Connect either images or latent, not both." The node refuses ambiguity rather than picking one. Same for a latent path with no audio connected and no audio stream inside - it wants audio_vae so it can synthesise the silence.
  • Wrong VAE, wrong noise. H3's VAEs are not LTX's. Feeding an LTX or Wan VAE here gives you a latent that looks plausible in the graph and decodes into mush later.
  • Batch size has to be 1. An ordinary latent with a batch dimension of 4 gets rejected outright - H3 Motion Context latents are single-clip objects.
  • Encoding is the memory peak in the graph. A long, high-resolution source is a lot of frames through a VAE at once; cap the incoming resolution if you're tight on VRAM.
  • The licence is a real constraint, not a formality. The MiniMax H3 Community License excludes the US, EU, UK and South Korea from its Applicable Territory - users there aren't licensed to run the local weights at all. Check that before you build a pipeline on it; the hosted Hailuo API is the licensed path in those regions.
CategorynoEmbryo/MiniMax H3

Inputs (6)

NameTypeDefaultDescription
video_vaeVAEMiniMax H3 video VAE (FP16 or INT8 ConvRot).
audio_vaeVAEMiniMax H3 audio VAE FP32.
source_fpsFLOAT24.0001–240The frame rate of the loaded video. Frames are resampled to H3's native 24 fps by time-based frame picking, so audio stays in sync at any source rate.
imagesoptIMAGEThe whole video as frames (e.g. from VHS Load Video). Leave un-connected when using the latent input.
latentoptLATENTOptional alternative to images. Accepts either a nested AV latent from LTXVConcatAVLatent (its audio stream is used directly) or an already-encoded H3 video LATENT from VAE Encode. A standard [B,C,H,W] latent is wrapped as a one-frame H3 video stream; connect AUDIO separately when it has no audio stream.
audiooptAUDIOThe video's audio (e.g. from VHS Load Video). Leave un-connected for a silent clip. Ignored when latent already contains an audio stream.

Outputs (1)

NameTypeDescription
latentLATENT—