Chill Enhanced Video Combine
The video-combine node that picks your GPU encoder for you
- images
- audio
- frames
- filename
You just generated 81 frames of Wan video and the one thing standing between you and a watchable file is ComfyUI's built-in "save the frames as a GIF or PNG sequence" life. This node is the other option: feed it an IMAGE batch, get an encoded H.264/H.265/VP9/AV1 video out the other side, via real FFmpeg. It's from a small, young pack called Chill Node Collection, and right now barely anyone has even loaded its page - but it's the kind of utility node that earns its place once you've hit the wall of "where do I actually get an .mp4 out of this graph?"
It competes with the heavyweight VideoHelperSuite VHS_VideoCombine, but where that one is a Swiss army knife with a settings panel the size of a CVS receipt, this is closer to "just give me an mp4." The headline feature is honest-to-goodness GPU encoder auto-detection: instead of you knowing whether h264_nvenc exists in your ffmpeg build, the node runs ffmpeg -encoders at runtime and picks the first working candidate - NVENC first, then QSV (Intel), then AMF (AMD), and finally software libx264/libx265. If you've ever pasted a random ffmpeg command from a forum and gotten Unknown encoder 'h264_nvenc', you know why that matters.
Under the hood it's dead simple and reasonably clever: the node writes your frames as raw RGB24 bytes straight into ffmpeg's stdin (no intermediate file), so it's fast and uses almost no disk. mp4 containers get +faststart, which browsers like. There's even a JS extension so the finished video plays back right inside the node.
The inputs that matter
Most defaults are fine. The ones a beginner actually touches:
codec/container- H.264 + mp4 is the safe default. VP9 and AV1 only work with webm/mkv; if you pick a mismatched combo the node silently falls back to the first compatible container and prints a note, so check your console if the file comes out .mkv.quality- this is FFmpeg's CRF, and it's inverted from what you'd guess: lower is higher quality. 20 is a good default; 23+ gets visibly crunchy on animation, 14-17 is near-lossless and huge.frame_rate- match your sampler. Wan frames at 24fps feel right.pingpong- appends the interior frames in reverse for a seamless forward/reverse loop. This is the "make it loop" button, and it's the same trick AnimateDiff users lived on.filename_prefix- supports%date:yyyy-MM-dd%/%time:HHmmss%macros and a subfolder, defaulting tovideo/YYYY-MM-DD/Chill_hhmmss.audio(optional) - plug in a ComfyUIAUDIOvalue and it muxes it in;crop_to_audiotrims the video to the audio's length.
Two outputs: frames (an IMAGE) and filename (a STRING - actually the full output path). Heads-up: frames comes back empty unless you flip on pass_frames, which returns the (possibly ping-ponged) sequence so downstream nodes can keep using it.
Install
Grab it via ComfyUI Manager (search "ComfyUI-ChillNodeCollection"), or the old-school way:
cd ComfyUI/custom_nodes
git clone https://github.com/Megachill/ComfyUI-ChillNodeCollection
pip install -r requirements.txt
The only real dependency beyond ComfyUI is FFmpeg. It uses your system ffmpeg if it's on PATH; otherwise it falls back to the binary bundled with imageio-ffmpeg (installed by requirements.txt), so most people never need to install anything extra. Windows portable users should run the pip line with ../../../python_embeded/python.exe -m pip install -r requirements.txt from inside the node folder.
Gotchas
- "FFmpeg was not found" means neither a
PATHffmpeg norimageio-ffmpegis importable. Install FFmpeg or re-run the requirements install. - It's an output node that always re-runs (
IS_CHANGEDreturnsnan), so it re-encodes every queue even if nothing changed. Fine for one-offs, annoying in long batch loops. - Quality vs. CRF confusion is the #1 "why is my video 4GB" trap. Lower number, bigger file.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| frame_rate | FLOAT | 24.000.1–240 | — |
| codec | COMBO | H.264 | 4 options: H.264, H.265, VP9, AV1 |
| container | COMBO | mp4 | 3 options: mp4, webm, mkv |
| quality | INT | 200–51 | — |
| pingpong | BOOLEAN | false | — |
| save_metadata | BOOLEAN | true | — |
| filename_prefix | STRING | video/%date:yyyy-MM-dd%/Chill_%date:hhmmss% | — |
| save_output | BOOLEAN | true | — |
| pass_frames | BOOLEAN | false | — |
| audioopt | AUDIO | — | |
| crop_to_audioopt | BOOLEAN | false | — |
| audio_codecopt | COMBO | Auto | 4 options: Auto, AAC, Opus, MP3 |
| audio_bitrateopt | COMBO | 192k | 7 options: 64k, 96k, 128k, 160k, 192k, 256k, +1 |
| save_first_frameopt | BOOLEAN | false | — |
| save_last_frameopt | BOOLEAN | false | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| frames | IMAGE | — |
| filename | STRING | — |