MiniMax H3 • Pack AV Streams
The tiny node that makes H3's two streams one
- video_latent
- audio_latent
- av_latent
This is the smallest node in the pack and one of the easiest to misunderstand. MiniMax H3 doesn't sample video and audio separately - it consumes a single NestedTensor latent holding both streams: a 24-channel video latent and a 32-channel stereo audio latent packed into one object. Pack AV Streams is the thing that does the packing. Feed it an encoded video_latent and an encoded audio_latent, and out comes the av_latent the H3 sampler actually wants.
Inputs and output
Two required inputs, one output:
video_latent- output of the Encode Video Stream node (24-channel H3 video latent).audio_latent- output of Encode Audio Stream (32-channel stereo audio latent).av_latent- the packed result, ready for the sampler, Replace Stream, Merge AV, or a continuation node.
That's the whole node. No settings, no modes. Which is refreshing, and also the trap: the durations must match. The node will not fix a mismatch for you - the H3 sampler needs the video and audio streams to be the same length, and packing mismatched streams produces a latent that fails later with an ugly sync error.
How it fits the workflow
You use it when you're assembling the AV latent by hand rather than letting Long Media Setup do it. Typical flow: encode your frames with Encode Video Stream, encode your soundtrack with Encode Audio Stream (use the target_av input there to force exact duration match if you have a target), then Pack AV Streams to combine them. From there the latent goes into the sampler's initial_av input or into a stream-edit node.
The counterpart node, Split AV Streams, does the reverse - pulls the video and audio apart so you can edit one stream without touching the other. Pack and Split are the same conceptual latch in opposite directions.
A detail worth remembering
The video stream is 24 channels and the audio stream is 32 channels for a reason: those are H3's VAE output shapes, not arbitrary numbers. If you try to pack a latent that isn't one of those shapes, the node or the sampler will reject it. That's a feature - it's the guardrail that catches you feeding an SD-style latent into an H3 pipeline. And because H3's audio is stereo and part of the model's conditioning (that's how it gets native lip-sync and generated dialogue), this little packing step is genuinely load-bearing, not a formality.
Install
Ships in ComfyUI-MiniMax-H3-LongMedia. Manager search "MiniMax-H3-LongMedia", or:
cd ComfyUI/custom_nodes
git clone https://github.com/vizart-vj/ComfyUI-MiniMax-H3-LongMedia
restart. You need the H3 checkpoint plus the video and audio VAEs to produce the inputs (MiniMaxAI/MiniMax-H3 on HuggingFace, ~42.5 GB of weights; the H3 Community License excludes the US, EU, UK and Korea - verify before downloading).
Troubleshooting
The one real failure mode is a duration mismatch, and it usually shows up as a "V318" or sync error at decode, not at pack time. If you hit that, go back to Encode Audio Stream and connect your packed latent to its target_av input so the audio encodes to exactly the right length. And if the sampler rejects the latent outright, run AV Latent Info on it first - it'll tell you the actual frame counts and whether the streams are synchronized, so you're debugging numbers instead of guessing.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| video_latent | LATENT | — | |
| audio_latent | LATENT | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| av_latent | LATENT | — |