Video Maker V2 [BETA]
Video Maker V2
- images
- audio
- last_frame
You've animated something - AnimateDiff frames, an LTX or WAN output, a multi-image batch - and ComfyUI hands you... a pile of numbered PNGs. There's no native "Save Video" in the base install, and stitching frames is the step everyone quietly dreads. Video Maker V2 is a self-contained answer: you feed it an IMAGE batch, it writes an MP4 straight into your output/ folder on the server, and then plays the result back inside the node so you can see it without leaving the canvas.
It's the BETA successor to the pack's original Video Maker (now labeled DEPRECATED). The name isn't a lie like some addons - it genuinely encodes H.264 with audio, needs no API key, and doesn't phone home.
Why V2 exists (the one thing to know)
The original Video Maker was true to this pack's gimmick: it streamed your frames to the browser and muxed the MP4 client-side with mp4-muxer, so you got instant preview without a page reload. But browser-side encoding meant the whole clip had to live in tab memory and the audio was capped at whatever the web encoder would give you.
V2 flips it: all encoding happens server-side with PyAV (the av Python package), then the node's small JavaScript widget just loads the finished file for preview. That move buys two things the author calls out: higher audio bitrates (the code writes AAC at a meaty 320 kbps) and reliable background processing on long batches. Same visual-preview payoff, none of the browser limits.
How it works
The node takes your batched images tensor and hands each frame to a libx264 encoder at crf 18, preset medium, yuv420p - a solid default that looks near-lossless without ballooning file size. Two quiet details are worth knowing:
- Odd dimensions get cropped. H.264's
yuv420pneeds even width/height, so if your batch is 513px wide it silently drops the last pixel column/row rather than erroring. Feed it even sizes (most video models already do) and you'll never notice. - Files never silently overwrite. It saves to
ComfyUI/output/, auto-appends.mp4, and ifvideo.mp4already exists it becomesvideo_01.mp4,video_02.mp4, and so on.
If you wire in audio, it opens an AAC stream alongside the video, uses the incoming sample rate, and picks mono or stereo from the channel count. That's where the 320 kbps bitrate lives - good enough to carry real music or dialogue without artifacts.
The inputs that matter
images- your batch of frames. Required. This is the whole job.fps- default 24, range 1–60. Set it to what your motion model generated at, or your "video" is fast-forward or slow-mo.trim_audio(default on) - if your audio is longer than the video, chop it to match. Turn it off if you deliberately want the file to outlast the visuals.audio(optional) - anAUDIOtensor from any node that outputs one (the same type ComfyUI's core audio nodes use), like the original soundtrack of a video you're re-rendering.filename- relative path insideoutput/, e.g.portraits/run_a. You can embed%date%for the current date, and theuse_date_mask+custom_date_formatpair swaps in your own format usingyyyy/mm/ddtokens.
The single output is last_frame (an IMAGE) - handy if you want to chain a save node after it. The real result is the file plus the in-node <video> preview that pops up when execution finishes.
Installing it
ComfyUI Manager is easiest: search DemonAlone-JS_Addon-ComfyUI and install. Or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/DemonAlone/DemonAlone-JS_Addon-ComfyUI
then restart ComfyUI. No model files to download. The pack itself ships no requirements.txt, but the code imports PyAV - most current ComfyUI builds already bundle av (it powers core audio support), so you're usually fine. If the node fails to load with an import error about av, install it into your ComfyUI environment:
pip install av
Where people get burned
The classic trap is odd-resolution output: if your VAE or upscaler produced a 961px-wide image, you'll get a video one pixel narrower than your frames with no warning - check before you render. Second, if you only see "Ready to generate" with no file, confirm the node actually executed; it's an output node, so ComfyUI only runs it if it's not muted or bypassed. And remember it writes to output/, not temp/ - if you're hunting for the file, it's the same folder your SaveImage PNGs land in.
One honest caveat: the pack is explicitly BETA and reads like a one-dev project - the README even credits the LLMs that helped write it. For this node that's fine; the code is small and does one job well. When the clip matters, this beats the browser-muxing equivalent.
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 |
| audioopt | AUDIO | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| last_frame | IMAGE | — |