Nodes/ComfyUI-RedNodeStudio/RedNode Save Video
ComfyUI Node

RedNode Save Video

Turn a batch of frames into mp4, webm, gif or webp, filed like your stills

By RedNodeAI·Created 26 days ago·Updated 15 days ago· 0
RedNode Save Video
  • images
  • audio
  • images
  • path
config{"root": "", "subfolder": "%date%/%preset%", "name": "%date%_%time%", "numbering": "counter", "pad": 4, "split_drafts": true, "keep": false, "write_text": true, "write_json": false, "embed_png": true, "prompts_folder": "", "format": "png", "quality": 85, "compress": 4, "container": "mp4", "fps": 16.0, "loop": true, "pingpong": false, "audio_fill": "once"}
fps
positive
negative
seed

The stock video output in ComfyUI is fine until you need your animations actually filed - date, preset, seed, draft vs keeper - the way you file your stills. RedNode Save Video is the video version of RedNode Save: it takes a batch of frames and writes them as mp4, webm, gif or animated webp into the same folder tree, with the same tokens, the same drafts/keepers split, and the same readable text record beside the file. If you already run RedNode Save for stills, this is the same brain with a time axis.

The container choice matters more than it looks: mp4 is what plays everywhere, webm is what the web wants, gif is what chat windows accept, and animated webp does animation without gif's 256-colour ceiling. The node defaults to mp4, which is the right call for a working archive, and lets you drop to webp when you need the smaller animated file.

How it works

Any node that produces a batch of images makes a video here - feed the frames in order and the node encodes them with ffmpeg. The interesting engineering bit: it doesn't make you install ffmpeg. It uses the binary that imageio_ffmpeg brings with it (a Python package that's simply there), falling back to an ffmpeg on your PATH, and for gif/webp it falls back further to imageio. So on a machine where nobody has ever installed ffmpeg, it still works - that's the kind of detail that makes a node quietly pleasant.

The text record is worth a closer look. It digs the prompt out of the queued graph, but video workflows' nodes aren't always shapes it recognises - so the positive and negative inputs exist to wire in the prompt and be certain of what the record says. If you care about knowing what produced a clip later, wire those. The fps input works the same way: wire the frame rate from whatever made the frames and it wins over the panel, so the two can never disagree. That "wired value beats panel" convention is deliberate and worth using.

The inputs that matter

  • images - the frames, in order.
  • config - panel settings: container, fps, quality, loop, pingpong, folder tokens, drafts/keepers.
  • fps (optional) - wired frame rate overrides the panel.
  • positive / negative (optional) - wired prompts for the text record.
  • audio (optional) - muxed into mp4 and webm. gif and animated webp have no audio track, so wiring sound to one of those says so rather than dropping it quietly.
  • seed (optional) - for the seed token and record.

Outputs: images (frames pass through) and path (the file that was actually written).

Installing it

git clone https://github.com/RedNodeAI/ComfyUI-RedNodeStudio.git ComfyUI/custom_nodes/ComfyUI-RedNodeStudio

Restart ComfyUI, or search RedNode Studio in ComfyUI Manager. No model files; the ffmpeg dependency is satisfied by the imageio_ffmpeg package ComfyUI already installs. Python 3.10+.

The gotchas

Loop and pingpong only mean anything for gif and webp - an mp4 is a clip, not a loop, and a "looping" mp4 just means the player restarts. And the path output is the honest one to wire into a review node: you can preview the actual filed file instead of a re-render of the frames. The one thing that bites people is forgetting that positive/negative are the certain path to a correct record - if you care, wire them, because graph-crawling the prompt is best-effort by design.

CategoryRedNode/Video

Inputs (7)

NameTypeDefaultDescription
imagesIMAGEthe frames, in order. Any node that makes a batch of images makes a video here.
configSTRING{"root": "", "subfolder": "%date%/%preset%", "name": "%date%_%time%", "numbering": "counter", "pad": 4, "split_drafts": true, "keep": false, "write_text": true, "write_json": false, "embed_png": true, "prompts_folder": "", "format": "png", "quality": 85, "compress": 4, "container": "mp4", "fps": 16.0, "loop": true, "pingpong": false, "audio_fill": "once"}the panel's settings; edited through the node, not by hand
fpsoptFLOATwire the frame rate from whatever made the frames, and it wins over the panel's own setting so the two cannot disagree
positiveoptSTRINGthe prompt to write into the text record. The record already digs one out of the queued graph, but a video workflow's nodes are not always shapes it recognises, so wiring it here is the certain way.
negativeoptSTRINGthe negative to write into the text record, when wired.
audiooptAUDIOsound for the clip, muxed into mp4 and webm. gif and animated webp have no audio track, so wiring this to one of those says so rather than dropping it quietly.
seedoptINTfor the seed token and the record. Without it the first seed in the queued graph is used.

Outputs (2)

NameTypeDescription
imagesIMAGE
pathSTRING