ZZX Media Info / 媒体与编码器信息
The first node to run when a transcode dies
- media_json
- encoders_json
Most transcoding problems are really information problems. You picked hevc_nvenc, it failed, and you don't know whether FFmpeg lacks the encoder, the driver is too old, or the file is 10-bit and the card hates it. ZZX Media Info answers the boring half of that question and the interesting half: it dumps the full ffprobe result for a file, and - if you ask it to - actually tries each hardware encoder on your machine instead of trusting a list.
Reach for it before you touch any other ZZX node, and again whenever something with a video_path throws. It's a diagnostic node, not part of the render chain.
What it does
There are three widgets, and two of them are booleans that change what you get back.
video_path is a path on the ComfyUI server. It's optional in practice: leave it blank and the media dump comes back as {} instead of erroring, so you can use the node purely as an encoder-checker. A path that doesn't exist does raise.
test_hardware = false gets you the cheap answer: the node runs ffmpeg -encoders and lists which of the encoders ZZX knows about are compiled into your FFmpeg build. Fast, and also incomplete in the way that matters - a build can include h264_nvenc while the machine has no usable NVIDIA driver, and the list will still happily show it.
test_hardware = true is the honest answer. For every NVENC, QSV and AMF encoder in the pack's list, the node encodes exactly one 256×256 frame of a synthetic colour source to -f null. If that returns without an error, the encoder is reported as working. It costs a second or two, and it's the only way to know whether "GPU auto" will actually pick your card.
refresh = true clears the cached results and re-probes. The node caches both the compiled-encoder list and the per-encoder smoke test, so after installing a new FFmpeg build or updating drivers, flip refresh or you'll keep reading yesterday's answer.
The outputs
media_json is raw ffprobe -show_streams -show_format output as a JSON string - codec, profile, pixel format, duration, frame rate, language tags, track indices, all of it. encoders_json is the capability report: the two compiled lists, a hardware_smoke_test map of encoder → true/false, and a note reminding you that a passing 8-bit test doesn't certify every profile, resolution or 10-bit mode.
Both are just strings, so the useful workflow is to wire media_json into a text/preview node or read the finished values from the node's own UI panel - the node is an output node, so ComfyUI displays the media and encoder payloads under it after each run. The language and stream-order fields are exactly what you need to fill in Audio & Subtitles' audio_tracks / subtitle_track, which are zero-based indices you'd otherwise be guessing at.
Install
Manager: search ZZX (Comfy Registry name 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
Needs ffmpeg and ffprobe on PATH, or ZZX_FFMPEG / ZZX_FFPROBE. Restart ComfyUI. Nothing about this node needs a GPU or a model.
Gotchas worth knowing before you trust it
The node reports float("nan") from IS_CHANGED, which is ComfyUI's way of saying "run me every queue." That's right for a probe - you want fresh numbers, not a cached answer from before you swapped files - but it means this node never lets the queue short-circuit, so don't leave it in the middle of a heavy graph you're iterating on.
Compiled does not mean working, and working does not mean suitable. A true result for hevc_nvenc on one 8-bit frame says nothing about whether your 4096×2160 10-bit source will encode - the tests are deliberately cheap. The author is upfront about this in the node's own note field, which is more honesty than most encoder checks offer.
Finally, if media_json comes back empty after you pasted a path, check for a trailing space or a Windows path handed to a Linux ComfyUI. The value is a server-side path; it doesn't resolve through the browser or your local machine.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| video_path | STRING | — | |
| test_hardware | BOOLEAN | false | — |
| refresh | BOOLEAN | false | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| media_json | STRING | — |
| encoders_json | STRING | — |