MiniMax H3 Skin Finish Quality Stream / 语义低内存肤质收尾 (Advanced EXP)
The two-pass quality stream
- source_video
- video
- saved_path
- report_json
The standard way to post-process a video in ComfyUI is to decode it into one giant IMAGE batch, run your filters, and re-encode - which works great until the batch is 768 frames and your system RAM is crying. The Quality Video Stream node is the escape hatch: a file-backed, two-pass route that never materializes a full IMAGE batch. Pass 1 keeps only face metadata; pass 2 runs the whole semantic-mask → Skin Finish → Frequency Split → Texture Guard → Safety Audit chain on bounded chunks, then incrementally encodes H.264 and packet-copies the verified source audio. The author's own 768-frame, 32-second test ran at a ~2GB peak working set versus ~10.4GB for the full-IMAGE equivalent. That's the pitch, and it holds up.
How it works
You feed it a file-backed source_video (VIDEO) - not a frame batch. Pass 1 reads the file and retains only pinned-YuNet face metadata plus small source digests. Pass 2 lazily loads the CPU ParseNet, builds semantic skin masks per chunk (chunk_frames default 2 - the conservative CPU/RAM default), applies the non-generative finish with source-detail Frequency Split and Texture Guard, runs the Safety Audit with exactly one prior frame at each chunk boundary, encodes that chunk, and releases everything in finally. No full candidate or mask batch is ever retained.
The controls are the family set: preset (subtle), amount, texture_keep, shine_control, the YuNet detection knobs (detection_threshold 0.45, minimum_face_height_px 32, maximum_faces 4), the frequency-split params (low_frequency_strength, source_detail_gain, separation_radius_percent), shadow/highlight protection, maximum_temporal_effect_jump (0.04), plus crf (18) and filename_prefix for the encode. Outputs: video, saved_path, report_json.
The one behavior you must internalize
accept_candidate defaults to false, and the tooltip spells out the contract: "False returns the exact source VIDEO without analysis or writes. Enable only to render a candidate for human review; the node never accepts aesthetic quality automatically." So with the default, this node does literally nothing but pass your video through. That's not a bug - it's the fail-closed spine of the entire pack. Flip it on only when you're ready to render a candidate for review.
Accepted runs also preflight a reviewed 2048 MiB available-system-RAM floor when host measurement is possible; below that, the node returns the exact source and writes no file. The floor is deliberate and not user-lowerable - it's derived from the author's real ~1.16GB working-set increase plus margin.
Why you'd reach for it
Long clips, limited RAM, or both. If your 124-frame clips already make the full-IMAGE route sweat, this is the only Skin Finish path designed for the long haul. It also keeps audio lossless-by-packet-copy and validates the H.264 strict-decode after encoding.
Installing it and gotchas
Pack install: ComfyUI Manager "MiniMax H3 Audio T8", or clone https://github.com/T8mars/comfyui-minimax-h3-audio-T8.git into custom_nodes, update ComfyUI core, restart. Needs the pinned ParseNet checkpoint in models/facedetection/, and FFmpeg available on PATH (the pack lists it as an external runtime dependency for the crash-isolated AAC encode / atomic MP4 mux). Missing FFmpeg fails closed with the source untouched.
Where people get burned: forgetting accept_candidate and wondering why nothing writes; expecting HDR/wide-gamut handling (it's explicitly SDR 8-bit Rec.709 only, and rejects PQ/HLG/BT.2020 sources); and pushing chunk_frames up to speed things along - two frames is the validated conservative default for a reason.
Inputs (28)
| Name | Type | Default | Description |
|---|---|---|---|
| source_video | VIDEO | — | |
| preset | COMBO | subtle | 2 options: subtle, oil_control |
| amount | FLOAT | 0.300–1 | — |
| texture_keep | FLOAT | 0.950–1 | — |
| shine_control | FLOAT | 0.250–1 | — |
| detection_threshold | FLOAT | 0.450.1–0.95 | — |
| minimum_face_height_px | FLOAT | 328–512 | — |
| minimum_detail | FLOAT | 0.0100.001–0.1 | — |
| bbox_ema_alpha | FLOAT | 0.550–1 | — |
| scene_cut_threshold | FLOAT | 0.280.05–1 | — |
| maximum_faces | INT | 41–12 | — |
| crop_expansion | FLOAT | 1.451–3 | — |
| minimum_class_probability | FLOAT | 0.550–1 | — |
| feature_protection_px | INT | 40–64 | — |
| mask_feather_px | INT | 00–8 | Zero is the conservative semantic default; extra feathering may approach eyes or lips and requires review. |
| proxy_long_side | INT | 640128–1280 | — |
| low_frequency_strength | FLOAT | 1.000–1 | — |
| source_detail_gain | FLOAT | 1.000–1.25 | — |
| separation_radius_percent | FLOAT | 1.00.1–5 | — |
| maximum_radius_px | INT | 321–128 | — |
| shadow_protection | FLOAT | 0.100–0.9 | — |
| highlight_protection | FLOAT | 0.940.1–1 | — |
| minimum_texture_ratio | FLOAT | 0.780–1 | — |
| maximum_temporal_effect_jump | FLOAT | 0.0400–1 | — |
| chunk_frames | INT | 21–8 | Two frames is the conservative CPU/RAM default. |
| filename_prefix | STRING | MiniMaxH3/SkinFinish/quality_stream | — |
| crf | FLOAT | 180–51 | — |
| accept_candidate | BOOLEAN | false | False returns the exact source VIDEO without analysis or writes. Enable only to render a candidate for human review; the node never accepts aesthetic quality automatically. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| saved_path | STRING | — |
| report_json | STRING | — |