ZZX Advanced Converter / 高级转码
One node, every FFmpeg job you'd normally script
- settings
- output_path
- video_info
- report_json
Here's the pitch in one line: you can hand this node a video path and a preset and get a sensible file back, which is all most people ever want from a "video converter." The deeper reason to care is that the presets cover the jobs you'd otherwise open a terminal for - a 1080p H.264 for Discord, a ProRes for the edit, an FFV1 lossless archive, a remux that doesn't re-encode, an MP3 rip of the audio, a GIF.
ZZX Advanced Converter / 高级转码 is the v1.3 flagship of the pack. It's the same engine as the batch node, worked one file at a time, and it's the one that takes the settings wires if you want to go past what the presets offer.
Presets do most of the work
Fifteen to pick from. The useful defaults: MP4 H.264 - compatible for "will play anywhere," MP4 H.264 - GPU auto which probes NVENC → QSV → AMF and falls back to libx264 rather than failing, HEVC - smaller file, AV1 - smaller file, WebM VP9, 1080p H.264 / 720p H.264 (pad to size), Vertical 1080x1920 (crop to size), ProRes editing, Lossless archive (FFV1 + FLAC in MKV), Remux MKV - no re-encode, Extract MP3, Extract FLAC, GIF 480px, and Custom.
Preset resolution order is built-in preset → connected settings → preset_json. That last one wins outright. Because the Video Settings node exports every field, not just the ones you touched, connecting it effectively replaces the preset - so choose Custom and don't expect 1080p H.264 to hang around.
Remux MKV is the one people should know exists: -c copy for video and audio, all tracks, subtitles copied. It's near-instant because nothing is decoded, and it will refuse to run if your settings ask for any picture processing at all. Which is correct - you can't scale a stream you're not re-encoding.
Wiring and outputs
Four required fields: video_path (absolute path on the ComfyUI server), preset, output_path (directory; blank means ComfyUI/output), output_filename (blank means the source name plus _converted). Optional: settings and preset_json. Files are numbered (_0000, _0001, …) so nothing is overwritten, and the extension is appended for you.
Outputs: output_path as a full path string, video_info as VHS_VIDEOINFO - the same source_/loaded_ prefixed dict the older converter produced, so it drops into VideoHelperSuite's video-info node without VHS being installed - and report_json.
That report is the underrated part. It contains the source and output paths, the resolved video and audio encoders, the entire resolved settings dict, the exact ffmpeg command lines that ran, and the raw ffprobe dumps for both files. When a conversion "didn't work" and you can't tell why, this tells you whether the node or your expectations were wrong. Two-pass encodes show up as two commands, which is also how you confirm two-pass actually engaged.
Caveat on video_info: for audio extraction (MP3/FLAC/WAV presets) it's an empty dict, because there's no video to describe. Don't wire it into a video info node in that workflow.
Install
Manager: search ZZX (Comfy Registry: ComfyUI-ZZX). Manual, into the custom_nodes folder of the install you actually launch:
cd ComfyUI/custom_nodes
git clone https://github.com/ZZXYWQ/ComfyUI-ZZXYWQ
python -m pip install -r ComfyUI-ZZXYWQ/requirements.txt
Windows portable:
python_embeded\python.exe -m pip install -r ComfyUI\custom_nodes\ComfyUI-ZZXYWQ\requirements.txt
FFmpeg and ffprobe must be on PATH, or set ZZX_FFMPEG / ZZX_FFPROBE to the executables. Restart ComfyUI. The node lives under ZZX / Video Advanced in the add-node menu.
What breaks, and why
Hardware encoders are the usual suspect. FFmpeg does not include encoder hevc_nvenc means the binary was built without it or the machine can't load it - run ZZX Media Info with test_hardware on and find out which. Explicit hardware encoders never silently fall back; only the auto_* encoders do, and that's a design choice worth respecting.
Container/codec conflicts fail early with a readable message rather than a wall of FFmpeg stderr: WebM wants VP8/VP9/AV1 with Opus or Vorbis, ProRes wants MOV or MKV, FFV1 wants MKV or AVI, subtitle muxing wants MKV/MP4/MOV. The same goes for copy mode plus filters, audio copy plus volume or channel changes, speed changes with copy/embed subtitles, and odd target dimensions.
quality is CRF/CQ and the numbers are not comparable across encoders - a 23 in libx264 is not a 23 in libsvtav1 or ProRes. And converting to 10-bit doesn't restore detail you never had: pixel_format changes the container's precision, not the picture's information.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| video_path | STRING | — | |
| preset | COMBO | MP4 H.264 - compatible | 15 options: Custom, MP4 H.264 - compatible, MP4 H.264 - GPU auto, HEVC - smaller file, AV1 - smaller file, WebM VP9, +9 |
| output_path | STRING | — | |
| output_filename | STRING | — | |
| settingsopt | ZZX_TRANSCODE_SETTINGS | — | |
| preset_jsonopt | STRING | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| output_path | STRING | — |
| video_info | VHS_VIDEOINFO | — |
| report_json | STRING | — |