JR MiniMax H3 Enhanced Video Combine
The video output node that tries every encoder before it gives up
- images
- audio
- frames
- filename
The last mile of any video workflow is getting frames off the GPU and into a file that plays everywhere, and that's where most stock combine nodes show their age. The JR H3 Enhanced Video Combine is this pack's output node: it takes an IMAGE batch, encodes it with FFmpeg, and gives you an in-node video preview with autoplay, download, and save-first/last-frame buttons. The filename STRING output is the real "what did you write" answer, and frames (the IMAGE passthrough) feeds downstream nodes when pass_frames is on.
How it decides what to use
The codec/container/dimension decisions are set by dropdowns: codec (Auto/AV1/VP9/H.265/H.264), container (Auto/WebM/MKV/MP4/Animated WebP/Animated AVIF), bit_depth (Auto/8-bit/10-bit), quality (0–51, lower is better), frame_rate (default 24 - H3's native cadence), plus audio options (audio_codec AAC/Opus/MP3, audio_bitrate 64k–320k) and a crop_to_audio toggle. Behind the scenes it walks an encoder priority list - NVENC → QSV → AMF → VAAPI → software - and picks the first one FFmpeg actually has. That's why "it just works" on most rigs: it's not one encoder, it's a fallback chain.
The fallback story is the interesting part. H.264 NVENC tops out around 4096 pixels wide, and when a horizontal stitch produces something like 4352×2880, the node recognizes Windows' EPIPE/EINVAL (Errno 22) encoder failure and quietly falls back to libx264. The file still saves - it's just noticeably slower. Browser compatibility is handled too: HEVC, 10-bit, and MKV outputs get a temporary H.264 stream for preview, while Download always points at the original saved file. Repeated runs never overwrite - it scans all extensions and appended markers for the same basename. Every execution returns a fresh preview_id, so the browser doesn't keep showing last round's cached video.
The outputs and the pass-through trap
frames(IMAGE) - an echo of the input batch, only populated whenpass_frames=true.filename(STRING) - the actual saved path, for metadata or a text logger.
save_first_frame / save_last_frame write PNGs for convenience; note they do not create IMAGE outputs on their own. If you want the last frame as an IMAGE in the graph, you wire frames (with pass_frames=true) into the separate Last Frame node.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Goldlionren/ComfyUI_JR_MiniMaxH3Node
<your-comfyui-python> -m pip install -r ComfyUI_JR_MiniMaxH3Node/requirements.txt
or ComfyUI Manager → search ComfyUI_JR_MiniMaxH3Node. The one required dependency is imageio-ffmpeg, which supplies an FFmpeg binary when none is on your PATH. A hard browser refresh after updating matters here - the preview UI is JavaScript.
Troubleshooting
- Ultra-wide renders crawl - that's the software fallback doing its job. If delivery allows, switch codec to H.265 or AV1, or keep one side within the hardware encoder's width limit.
- Preview shows H.264 but the file is different - expected: the preview is a compatibility stream; Download is the real file.
- No filename coming out - check
save_outputis on, and that FFmpeg can actually be found (imageio-ffmpeg installed).
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| frame_rate | FLOAT | 24.000.1–240 | — |
| codec | COMBO | Auto | 5 options: Auto, AV1, VP9, H.265 (HEVC), H.264 |
| container | COMBO | Auto | 6 options: Auto, WebM, MKV, MP4, Animated WebP, Animated AVIF |
| bit_depth | COMBO | Auto | 3 options: Auto, 8-bit, 10-bit |
| quality | INT | 200–51 | — |
| log_level | COMBO | Standard | 2 options: Standard, Verbose |
| pingpong | BOOLEAN | false | — |
| save_metadata | BOOLEAN | true | — |
| filename_prefix | STRING | video/%date:yyyy-MM-dd%/%date:hhmmss% | — |
| save_output | BOOLEAN | true | — |
| pass_frames | BOOLEAN | false | — |
| crop_to_audio | BOOLEAN | false | — |
| audio_codec | COMBO | Auto | 4 options: Auto, AAC, Opus, MP3 |
| audio_bitrate | COMBO | 192k | 7 options: 64k, 96k, 128k, 160k, 192k, 256k, +1 |
| save_first_frame | BOOLEAN | false | — |
| save_last_frame | BOOLEAN | false | — |
| audioopt | AUDIO | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| frames | IMAGE | — |
| filename | STRING | — |