ZZX Video Settings / 视频设置
The 40-knob bundle behind every advanced transcode
- audio_subtitles
- settings
- preset_json
The presets in the advanced converter cover maybe 80% of what you'd do with FFmpeg. ZZX Video Settings / 视频设置 is for the other 20%: trim off the first two seconds, double the speed, rotate the phone video, crop out a letterbox, denoise before encoding, or force 10-bit HEVC.
It's a settings node - one ZZX_TRANSCODE_SETTINGS wire out, plus a JSON text mirror of the same thing. Drop it in front of ZZX Advanced Converter or ZZX Batch Converter and you get access to every field below. Chain ZZX Audio & Subtitles into its audio_subtitles input and you get the audio and subtitle controls too, which is the exact shape of the shipped workflow-AdvancedVideoConverter.json.
The encoding core
container has nineteen options including the audio-only formats (MP3, M4A, AAC, WAV, FLAC, Opus, OGG) and HLS/DASH. video_encoder has twenty-seven: copy, none, the three auto_* probes, libx264/libx265, SVT-AV1 and AOM, VP8/VP9, ProRes, FFV1, MPEG-4/MPEG-2, WMV2, Theora, GIF, and the NVENC, QSV and AMF families.
auto_h264 / auto_hevc / auto_av1 are the smart choices if you're handing a workflow to someone else: they smoke-test NVENC, then QSV, then AMF, and fall back to the software encoder. Explicit hardware encoders never fall back, which is the honest behaviour - you asked for that encode.
rate_control is quality (CRF/CQ/QP), vbr, cbr, or two_pass. quality runs 0–63 and is not cross-comparable between encoders; ProRes ignores it in favour of profile, FFV1 is lossless, GIF uses a palette. video_bitrate_kbps only matters for the bitrate modes, and two_pass works with libx264, libvpx-vp9, mpeg4 and mpeg2video. encoding_speed maps fast/balanced/slow onto each family's own presets - veryfast/medium/veryslow for x264, p1/p4/p7 for NVENC.
The optional picture controls
width / height of 0 keep the source; set one and the other is computed. resize_mode is the useful bit: fit shrinks into the box, pad letterboxes with black, crop scales up and centre-crops, stretch distorts. scaling_filter defaults to lanczos here. Odd dimensions get padded to even automatically for encoders that need it.
frame_rate of 0 leaves it alone; any value converts to constant frame rate by duplicating or dropping frames - not AI interpolation, so don't come to this node for smooth 24→60. start_seconds and duration_seconds trim, with 0 meaning "to the end"; playback_speed covers 0.25–4 and speed-matches audio via atempo. Note that trimming in copy mode is keyframe-limited, so exact cuts need a re-encode.
Then the grading set: four-sided crop_*, rotation, flip, deinterlace, denoise, sharpen, brightness, contrast, saturation. pixel_format defaults to auto (8-bit yuv420p; ProRes gets yuv422p10le), and profile is a free-text passthrough like high, main10 or 3. video_track picks a stream by zero-based index and ignores cover art. metadata keep/strip also decides whether chapters survive.
extra_options_json is a small whitelist of codec flags - -g, -bf, -refs, -threads, -tune, -level:v, -max_muxing_queue_size, -compression_level, -qmin, -qmax, -aq-mode, -aq-strength - as a JSON object like {"-g": 48, "-tune": "film"}. Anything outside that list errors. You can't sneak in filters or extra inputs, so don't try.
Install
Manager: search ZZX (Comfy Registry: ComfyUI-ZZX). Manual:
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
Plus ffmpeg and ffprobe on PATH (or ZZX_FFMPEG / ZZX_FFPROBE), then restart ComfyUI.
The one trap that gets everybody
This node exports its full settings dict, defaults included. The converter resolves built-in preset → connected settings → preset_json, so connecting Video Settings overwrites the preset completely - including the parts you didn't mean to change. Set the converter's preset to Custom and treat this node as the single source of truth. Same story if you also feed preset_json somewhere: that wins over everything.
Second trap: incompatible combinations are rejected up front, and the messages are good - WebM wants VP8/VP9/AV1 with Opus or Vorbis, ProRes requires MOV or MKV, FFV1 requires MKV or AVI, copy can't resize or filter, and muxed subtitles only go into MKV/MP4/MOV. Read the error instead of re-rolling the dropdown.
Third: this is a settings node, so on its own it does nothing at all. No converter downstream, no output, no feedback. That's the deal with every wire-based config node in ComfyUI - see the pattern in rgthree and Efficiency-style context nodes - and it's why the pack ships example workflows instead of prose alone.
Inputs (32)
| Name | Type | Default | Description |
|---|---|---|---|
| container | COMBO | mp4 | 19 options: mp4, mkv, mov, avi, webm, ts, +13 |
| video_encoder | COMBO | libx264 | 27 options: auto_h264, auto_hevc, auto_av1, copy, libx264, libx265, +21 |
| rate_control | COMBO | quality | 4 options: quality, vbr, cbr, two_pass |
| quality | INT | 230–63 | — |
| video_bitrate_kbps | INT | 40001–1000000 | — |
| encoding_speed | COMBO | balanced | 3 options: fast, balanced, slow |
| widthopt | INT | 00–8192 | — |
| heightopt | INT | 00–8192 | — |
| resize_modeopt | COMBO | fit | 4 options: fit, pad, crop, stretch |
| scaling_filteropt | COMBO | lanczos | 4 options: lanczos, bicubic, bilinear, neighbor |
| frame_rateopt | FLOAT | 0.0000–240 | — |
| start_secondsopt | FLOAT | 0.00–100000 | — |
| duration_secondsopt | FLOAT | 0.00–100000 | — |
| playback_speedopt | FLOAT | 1.000.25–4 | — |
| rotationopt | COMBO | none | 4 options: none, 90, 180, 270 |
| flipopt | COMBO | none | 4 options: none, horizontal, vertical, both |
| crop_leftopt | INT | 00–8192 | — |
| crop_topopt | INT | 00–8192 | — |
| crop_rightopt | INT | 00–8192 | — |
| crop_bottomopt | INT | 00–8192 | — |
| deinterlaceopt | BOOLEAN | false | — |
| denoiseopt | FLOAT | 0.00–10 | — |
| sharpenopt | FLOAT | 0.0-2–5 | — |
| brightnessopt | FLOAT | 0.00-1–1 | — |
| contrastopt | FLOAT | 1.000–3 | — |
| saturationopt | FLOAT | 1.000–3 | — |
| pixel_formatopt | COMBO | auto | 6 options: auto, yuv420p, yuv420p10le, yuv422p10le, yuv444p, yuv444p10le |
| profileopt | STRING | — | |
| video_trackopt | INT | 00–100 | — |
| metadataopt | COMBO | keep | 2 options: keep, strip |
| extra_options_jsonopt | STRING | {} | — |
| audio_subtitlesopt | ZZX_AUDIO_SETTINGS | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| settings | ZZX_TRANSCODE_SETTINGS | — |
| preset_json | STRING | — |