Video Maker [BETA]
Turn an image batch into an MP4 — your browser does the encoding
- images
- audio
- last_frame
The other half of the video story: after you've generated 100 frames of an image sequence, you need them out as a file. VideoMakerNode (display Video Maker [BETA]) takes an IMAGE batch, muxes it into an MP4, optionally glues on an audio track, and saves it straight to ComfyUI's output folder. It's from DemonAlone-JS_Addon-ComfyUI, the JS companion pack to the main DemonAlone-nodes repo - and it does something genuinely unusual for a ComfyUI node: the encoding happens in your browser, not on the server.
How it works
The backend (Python) does the cheap parts: it converts each image to JPEG and registers a few HTTP endpoints, then tells the browser "come get them." The frontend (web/videomaker.js) pulls those frames down, feeds them through the WebCodecs API, and muxes the video with mp4-muxer (MIT, by Vanilagy) - all in the tab. It then POSTs the finished blob back to /customvideo/save, which writes it to your output folder with collision-proof naming (video_01.mp4, video_02.mp4, … so you never clobber a previous run).
That browser-side design is the reason there's no ffmpeg dependency in the whole pack. The tradeoff is that the encoding speed and capability are whatever your browser gives you.
The inputs
Required:
images- theIMAGEbatch to mux. Frame order is your batch order.fps- playback speed, 1–60 (default 24).trim_audio- if you feed audio, cut it to the video's length (default on).
Optional:
filename- output name, plus a genuinely handy trick:%date%in the name gets replaced with the date, and it's a relative path insideoutput, sorenders/scene_%date%creates subfolders for you.use_date_mask+custom_date_format- swap the defaultyyyy-mm-ddfordd-mm-yyyyor whatever you like.audio- anAUDIOinput, e.g. straight from LoadVideoNode'saudiooutput. Note the author's warning baked into the description: audio bitrate is capped at 192K, so don't expect a lossless soundtrack.
The output
Just one: last_frame, an IMAGE - the final frame of your sequence. That's mostly for wiring a preview or for chaining to a follow-up node that wants to know what the last frame looked like. The actual MP4 lands in ComfyUI/output/.
Installing it
Standard pack install:
cd ComfyUI/custom_nodes
git clone https://github.com/DemonAlone/DemonAlone-JS_Addon-ComfyUI
Restart (or install "DemonAlone-JS_Addon-ComfyUI" via ComfyUI Manager). No models, no pip packages - the whole thing rides on browser WebCodecs plus the bundled mp4-muxer.
Where people get burned
The big one: this needs a Chromium-family browser with WebCodecs enabled. Firefox is a no-go for the encoding path, and if your ComfyUI lives headless (remote box, no browser session actively open), this node can't work at all - there's no browser tab to do the muxing. That's the flip side of the zero-dependency design, and it's the first thing to check when a run saves nothing.
Second, performance: every frame crosses the network as JPEG data and gets decoded and re-encoded in the tab. A few hundred frames is fine; several thousand high-res frames will be slow and can eat the tab's memory. For long sequences, consider muxing in smaller chunks or using a ffmpeg-based saver instead.
And don't expect server-grade codec control - you get what WebCodecs gives you, which is good-enough MP4, not a tuned encoding pipeline. If you need frame-accurate h264 tweaks or serious speed, a native ffmpeg node is the better tool. But for the common case - batch of generated frames into a viewable, shareable MP4 with sound - this is the most painless button in the pack.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| fps | FLOAT | 24.001–60 | — |
| trim_audio | BOOLEAN | true | — |
| filenameopt | STRING | video | Relative path inside `output`. Use %date% for date. |
| use_date_maskopt | BOOLEAN | false | — |
| custom_date_formatopt | STRING | yyyy-mm-dd | Date format if custom mask is enabled (e.g., yyyy, dd-mm-yyyy) |
| audioopt | AUDIO | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| last_frame | IMAGE | — |