Fantastic H3 Media Loader
Every H3 Reference You'll Ever Load — With the Right Tag Already On It
- references
MiniMax H3 - the open-weight video model that can match a character, style, voice, or motion from reference media - numbers its references by the order they arrive, not by which slot you plugged them into. Get that wrong and your prompt says <Picture 3> while the model is looking at the wrong person. Fantastic H3 Media Loader is the drag-and-drop way in that does that numbering for you and shows you the exact tag each file will get.
It's one node in the Fantastic H3 Prompt Builder pack, and it's the pack's reference-media front door: drop images, videos, and audio onto it, and it sorts them into the right groups, splits a video's soundtrack off so it can travel on its own wire (ComfyUI has no "video with sound" type), and previews everything - thumbnails carry their pixel size and aspect ratio in the corner, so you can see at a glance which resolution preset a reference matches.
Why you'd reach for it
H3's reference mode wants ref2va checkpoints and a pile of media with a 12-reference cap and strict time budgets. That's exactly the fiddly part this loader exists for. The tags it assigns - <Picture 1>, <Video 2>, <Audio 1> - are what the Prompt Builder inserts into your text, so if the loader says a file is <Picture 2>, that's what you write. Trust the displayed order over intuition; a video's soundtrack gets a low audio number because it's presented right before its own video.
The one output that matters
references - a single H3_REFS bundle. Wire it into the Prompt Builder's references input (one cable, previews and correct tags for free), or into the Reference Splitter when you want individual slots feeding the native H3 node directly. You can also skip the loader entirely and wire your own LoadImage nodes into the builder's per-slot inputs - the loader's advantage is convenience and correct numbering, not capability.
The node's only input is a hidden media_state STRING (the panel's JSON list of what you've loaded). You don't touch it.
The rules it's quietly enforcing
- 12 references max, and a video with its soundtrack enabled counts as two. Set a video's audio to
offand you get a slot back. - 2–15 seconds per clip, and 15 seconds total per type - three clips only fit if they average about five seconds each. The ✂ trim button is the usual fix: it sends just a slice of a clip (or
2s⇥/3s⇥for the tail) without touching the file. - off / paired / alone on a video's sound:
pairedkeeps it as that footage's soundtrack,alonetreats it as a standalone audio reference,offignores it. - A reference you connect but never mention in the prompt still gets handed to the model and costs render time - the editor flags it with an amber dash.
Memory: this is the real gotcha
Reference video is decoded to raw float frames, so a 15-second 1080p clip is roughly 9 GB of RAM, and three of those hurt. Nothing is resized unless you ask: set a size cap in the clip's ✂ editor (1280 px drops that same clip to ~4 GB) and decoding happens at the smaller size. Since the native H3 node rescales every reference to your generation's pixel area anyway, feeding it 1080p while generating at 832×480 spends the memory and throws the detail away. Leave size at full only for motion-continuation sources and clips whose framing you're matching closely.
Install
ComfyUI Manager, search "Fantastic H3 Prompt Builder" - or:
cd ComfyUI/custom_nodes
git clone https://github.com/Adudeguyman/ComfyUI-Fantastic-MiniMaxH3-PromptBuilder
Restart ComfyUI fully (not a page refresh), then it's under conditioning → video_models. It needs ComfyUI 0.30.0 or newer (when H3 support landed) and PyAV for video decode - ComfyUI core requires PyAV, so you already have it. Remember the H3 weights themselves are a separate download under the H3 Community License, which geofences out the US, EU, UK, and Korea; the pack needs no key and calls no API.
Troubleshooting
The loader looking empty after opening a workflow was a real bug, fixed in 1.5.7 - update. If the node shows a plain text media_state widget but no panel, the frontend script didn't load: hard-refresh with Ctrl+Shift+R, check the browser console (F12) for another extension throwing during load, and confirm web/medialoader.js is present. And if videos are rejected outright, PyAV is broken in your environment - a known culprit is aiortc pinning av<17; pip install 'av>=17' into your ComfyUI environment restores it.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| media_state | STRING | [] | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| references | H3_REFS | — |