[Movie Tools] Load images and create video
Turn a folder of frames into an MP4 without nuking your RAM
- audio
You just generated a 500-frame video with Wan or LTX. Now the graph is full of tensors and you need a real .mp4 on disk. The obvious move - load all those frames into one batch and hand them to a video encoder - is exactly how you get a process that crawls and then dies. LoadImagesAndCreateVideo is the alternative that actually scales: it reads an image sequence from a folder and pipes it straight into ffmpeg, never holding more than a few frames in memory at once. No OOM, no ten-minute batch concat.
It's the third node in ComfyUI-Movie-Tools, a small pack from nazgut (the same person who posts LTX workflows on r/comfyui and hosts files at big-idea.tech). Its sibling LoadImagesFromSubdirsBatch is the in-graph tensor loader, and that node itself warns past ~300 images: use this one instead. That's the whole pitch. It calls no API, needs no key, and does everything locally.
How it works
Under the hood it's a small, carefully written pipeline. The node walks the folder you point at, collects .jpg/.jpeg/.png/.webp, sorts them, and applies start_index and image_load_cap if you set them. Frames get decoded on a bounded thread pool - at most workers × 3 frames are ever resident at once, so a sequence of thousands costs the same memory as a sequence of ten. Each decoded frame is resized to a uniform canvas, written as raw RGB to ffmpeg's stdin, and ffmpeg handles the encoding: libx264, your crf and preset, yuv420p pixel format (which is why the node forces even frame dimensions), and +faststart so the file plays on a phone without being fully downloaded. The output lands in your ComfyUI output directory with an inline preview.
The optional audio input is the nice touch - it takes an AUDIO tensor (say, from a LoadAudio node) and runs a second ffmpeg pass that muxes it in as AAC at 192 kbps, padding with silence or trimming so it matches the video length. Handy for that Suno track you want under the footage.
The inputs that matter
Most of the widget list you can leave alone, and that's the point. The few you'll actually touch:
directory- a dropdown of subfolders inside your ComfyUI output folder (it recurses). Drop your frame sequence somewhere underComfyUI/outputand it'll show up in the list. An absolute path still works if you're driving it via the API.frame_rate- default 24. Match this to however you generated the frames.filename- saved to the output directory..mp4gets appended if you forget it, and a subfolder likemy_folder/videoworks. Existing files are silently overwritten, so don't reuse a name you care about.
Then the ones worth tuning: max_side downscales so the longest edge doesn't exceed N pixels - at 0 it keeps source resolution, but a 2048px frame at 24fps encodes way slower than a 1080px one for no visible gain in most cases. crf (default 19, lower = higher quality/bigger file) and preset (default veryfast) are the x264 controls; veryfast is a sensible default, drop to medium only if you care about file size. num_workers parallelizes decode, default 0 = auto (CPU count, capped at 8). It's an output node, so it returns nothing - just writes the file and shows you a preview.
Installing it
The cleanest path is ComfyUI Manager: search for ComfyUI-Movie-Tools and install. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/Big-Idea-Technology/ComfyUI-Movie-Tools
# restart ComfyUI
The pack has no requirements.txt - the code only needs torch, numpy, and Pillow, which ComfyUI already ships. The real hidden dependency is ffmpeg on your PATH. On Windows, winget install ffmpeg or put the binary somewhere in PATH; on Linux/macOS it's usually already there. If you'd rather not touch the system, pip install imageio-ffmpeg gives the node a fallback binary to find, and the MOVIE_TOOLS_FFMPEG_PATH environment variable overrides everything.
Troubleshooting
The one error you'll actually hit, and it's a classic:
RuntimeError: ffmpeg was not found. Install ffmpeg and make sure it is on PATH, or pip install imageio-ffmpeg.
This is the same wall every ffmpeg-backed ComfyUI node hits, and it bites hardest right after a ComfyUI reinstall - the imageio-ffmpeg fallback is the community-standard fix. Install ffmpeg, restart, move on.
Two quieter gotchas. Mixed-resolution frames get squashed to the first frame's dimensions - this node resizes rather than aspect-preserving, so keep your sequence uniform or you'll get stretched frames. And the directory widget only lists output-dir subfolders; if your frames live elsewhere, enter an absolute path via the API or move them under output/. Plus the overwrites: pick a fresh filename per render.
It's a work-in-progress pack (the README even says so), but this node is the one genuinely worth pulling in. The memory-bound streaming is exactly what a real frame sequence needs - when your other video nodes OOM on long clips, this one chews through thousands of frames in seconds.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| directory | COMBO | Folder with the image sequence, relative to the ComfyUI output directory (recurses into subdirectories). | |
| frame_rate | FLOAT | 24.00.1–1000 | — |
| filename | STRING | video | Output file name in the ComfyUI output directory. May include a subfolder, e.g. 'my_folder/video'. '.mp4' is appended if missing. Existing files are overwritten. |
| audioopt | AUDIO | Optional audio to mux into the video. Trimmed/padded to match the video length. | |
| image_load_capopt | INT | 0 | — |
| start_indexopt | INT | 0 | — |
| max_sideopt | INT | 00–8192 | Downscale so the longest side does not exceed this many pixels (0 = keep original resolution). Smaller frames encode much faster. |
| crfopt | INT | 190–51 | x264 quality. Lower is higher quality/larger file. |
| presetopt | COMBO | veryfast | x264 speed/efficiency tradeoff. Faster presets encode quicker at a slightly larger file size. |
| num_workersopt | INT | 00–64 | Parallel image decode threads. 0 = auto (CPU count, capped at 8). |
Outputs (0)
No outputs