Simple Folder Video Combiner
Concatenate every clip in a folder into one video (fades included)
- output_path
If you've ever rendered a batch of clips and then had to stitch them into one video, you know the drill: open an editor, import a dozen files, export, wait. Simple Folder Video Combiner exists to kill that step. Point it at a directory, and it grabs every file matching a glob pattern, sorts them alphabetically, and joins them into a single MP4. It's the "please just merge these" node.
How it actually works
Don't let the "simple" fool you - there's a hidden lever. The node scans the folder with a glob, probes each file's duration with ffprobe, then hands everything to ffmpeg via the ffmpeg-python bindings. If you set cross_fade to 0, it does a straight concatenation, normalizing each clip's audio to a common format first (that's the usual source of concat failures, so it's a thoughtful touch).
But here's the thing nobody warns you about: the default cross_fade is 0.5 seconds. So out of the box this isn't a hard cut - it's a chain of half-second crossfades between every clip, built with ffmpeg's xfade and acrossfade filters. The README bills this as "simple concatenation," which undersells what ships. If you want hard cuts, set cross_fade to 0.
The inputs that matter
- directory_path - where your clips live. It won't run if the folder doesn't exist.
- file_pattern - default
*.mp4. Change it to*.movor*scene*.mp4to be selective. - cross_fade - 0 for hard cuts, anything above that adds a crossfade of that many seconds between clips.
- use_gpu - defaults on and uses
h264_nvenc. Unlike some siblings in this pack, there's no fallback here - if your ffmpeg lacks NVENC and GPU encoding is on, the encode just fails. If you get an encoder error, flip this off. - recursive - process each subfolder separately, one output video per folder, with the folder name baked into the filename.
The output is output_path, a STRING with the full path to the combined file (in recursive mode it's a newline-separated list, one path per folder). Outputs go to ComfyUI's output directory, and it appends _1, _2… to avoid clobbering an existing file.
Installing it
Standard pack install - no model files, nothing heavy:
cd ComfyUI/custom_nodes
git clone https://github.com/scofano/ComfyUI-Simple-video-effects
pip install -r requirements.txt
Restart ComfyUI, or search "Simple Video Effects" in ComfyUI Manager and let it handle both steps. The deps are ffmpeg-python, soundfile, numpy, Pillow and torch - all already in most setups.
Where people get burned
Three things bite, and they're all easy to hit.
It re-encodes, always. The README claims "no re-encoding of content" via ffmpeg's concat demuxer, but the shipped code actually uses the concat filter, which re-encodes every frame (and crossfades obviously require it). It's not a stream copy. For a one-off merge that's fine - but if you need lossless joining, do it in a terminal with the concat demuxer and -c copy instead.
cross_fade longer than your shortest clip fails. There's no clamping in the simple version (the Advanced Folder Video Combiner in the same pack clamps; this one doesn't). If you have a 0.2s clip and a 0.5s crossfade, the xfade filter errors out. Keep cross_fade under your shortest clip.
The output filename edge case. If your output_filename doesn't end in .mp4, it gets appended for you - good - but the unique-filename logic runs on the output directory, so a long batch can leave you scrolling through combined_output_7.mp4 wondering which is which. Rename or move outputs as you go if you're processing many folders.
Worth knowing before you build a big workflow around it: the sorting is plain alphabetical, so name your clips with zero-padded numbers (clip_001.mp4) or they'll come out in lexicographic order, which isn't chronological.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| directory_path | STRING | — | |
| output_filename | STRING | combined_output.mp4 | — |
| file_pattern | STRING | *.mp4 | — |
| cross_fade | FLOAT | 0.5 | — |
| use_gpu | BOOLEAN | true | — |
| recursive | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| output_path | STRING | — |