π¬ Auto-Edit Workbench
Slam a whole folder of clips into one video, without leaving ComfyUI
- images
- audio
- fps
ComfyUI has no built-in "dump 20 clips in a folder, get one finished video out" node. If you've been hand-wiring Load Video β concat nodes β save, clip by clip, you know the pain. AutoEditWorkbench - the entire content of the ComfyUI-Video-Workbench pack, as it happens - does the whole assembly step in a single node. Point it at a directory, wire three outputs into a save node, and it hands you one continuous clip with audio and a consistent framerate. No ffmpeg command line, no separate editor, no juggling files.
It reads every video file out of directory_path, normalizes them all to one resolution and FPS, and concatenates them. The mechanism is plain MoviePy under the hood - there's no model, no API key, no VRAM involved. It's CPU-only number crunching, which is exactly why it's useful: this is a batch-job node, not a creative tool. You reach for it when the task is "just concat the renders."
How it actually works
The node scans the folder for .mp4, .mov, .avi, .mkv, and .webm files, sorts them per sort_strategy, then opens each with MoviePy. It picks a target resolution and FPS from your strategies - "First Video" reads only the first file's metadata (fast), while Smallest/Largest/Lowest/Highest scan every file to find the extreme. Each clip gets resized, forced to the target FPS, and joined with concatenate_videoclips(method="compose"). Then it converts every frame into a torch tensor (batch of HWC floats in 0β1) and, if the clip has audio, samples it at 44.1kHz into the standard ComfyUI AUDIO dict {"waveform", "sample_rate"}.
The author's own framing is honest about the tradeoff: this is a mini editing studio, not a timeline editor. No transitions, no per-clip trimming, no color pass. It automates the boring normalization + concat part that video workflows always need.
The inputs that matter
directory_path- absolute path to your clips. The default./input/my_footagewill not exist on your machine; that's the #1 "why is it erroring" moment.resize_mode-Crop (Fill Screen)fills the frame and cuts edges (right choice when mixing portrait and landscape clips, e.g. Shorts/Reels),Fit (Black Bars)letterboxes so nothing is lost,Stretchjust distorts. Crop is the default for a reason.limit_duration_sec- cap the output length. This is your memory safety valve; treat it as mandatory on the first run (more below).resolution_strategy/fps_strategy- "First Video" defaults are sane when your clips are consistent. UseCustom+custom_width/custom_height/custom_fpswhen they aren't.
Outputs and the save path
Three outputs: images (IMAGE), audio (AUDIO), fps (FLOAT). The fps output is a small blessing - it feeds straight into the frame_rate input of a save node, so the encode matches the timeline.
To save with audio, use VideoHelperSuite's VHS_VideoCombine (the included example workflow does exactly this): images β images, audio β audio, and fps β frame_rate (convert the widget to an input). Set format to video/h264-mp4.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Verolelb/ComfyUI-Video-Workbench.git
pip install -r requirements.txt # moviepy + numpy
Or use ComfyUI Manager's "Install via Git URL" with that repo. No model files to download, and the dependency list is just moviepy and numpy - lighter than most packs. Restart ComfyUI and it shows up under VideoTools/Editing.
Where people get burned
- Memory is the real weakness. The whole montage gets materialized in RAM as one numpy stack before it becomes a tensor. Minutes of 1080p60 will happily eat several gigabytes. Keep
limit_duration_secset while iterating, and don't be ashamed to test at 720p. - Corrupt or unreadable clips are skipped with a console warning, not a crash - which is nice, but check the console if the output seems short.
- Audio only exists if the source clips had audio. Silent sources produce a
Noneaudio output; VideoCombine survives it, but you'll get silence. - MoviePy wants ffmpeg.
imageio-ffmpegusually bundles it, but ffmpeg-related errors on first run are the classic snag - make sure ffmpeg is on PATH if you hit them.
If you're putting together a quick reel from renders or batch-testing a montage, this is the one you reach for. It won't replace your editor, but it ends the "which node concatenates with matching FPS again?" hunt for good.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| directory_path | STRING | ./input/my_footage | β |
| sort_strategy | COMBO | 5 options: alphabetical_asc, alphabetical_desc, date_oldest, date_newest, random | |
| resize_mode | COMBO | Crop (Fill Screen) | 3 options: Crop (Fill Screen), Fit (Black Bars), Stretch |
| resolution_strategy | COMBO | First Video | 4 options: First Video, Smallest (Min Area), Largest (Max Area), Custom |
| custom_width | INT | 51264β4096 | β |
| custom_height | INT | 51264β4096 | β |
| fps_strategy | COMBO | First Video | 4 options: First Video, Lowest FPS, Highest FPS, Custom |
| custom_fps | INT | 241β120 | β |
| limit_duration_sec | FLOAT | 0.00β3600 | β |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | β |
| audio | AUDIO | β |
| fps | FLOAT | β |