ComfyUI Node

Video Maker [BETA]

Turn an image batch into an MP4 — your browser does the encoding

By DemonAlone·Created about a month ago·Updated a day ago· 1
Video Maker [BETA]
  • images
  • audio
  • last_frame
fps24.00
trim_audiotrue
filenamevideo
use_date_maskfalse
custom_date_formatyyyy-mm-dd

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 - the IMAGE batch 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 inside output, so renders/scene_%date% creates subfolders for you.
  • use_date_mask + custom_date_format - swap the default yyyy-mm-dd for dd-mm-yyyy or whatever you like.
  • audio - an AUDIO input, e.g. straight from LoadVideoNode's audio output. 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.

Categoryvideo

Inputs (7)

NameTypeDefaultDescription
imagesIMAGE
fpsFLOAT24.001–60
trim_audioBOOLEANtrue
filenameoptSTRINGvideoRelative path inside `output`. Use %date% for date.
use_date_maskoptBOOLEANfalse
custom_date_formatoptSTRINGyyyy-mm-ddDate format if custom mask is enabled (e.g., yyyy, dd-mm-yyyy)
audiooptAUDIO

Outputs (1)

NameTypeDescription
last_frameIMAGE