Save Video π
The video saver that knows what 'lossless' means
- frames
- audio
- video
- file_path
The end of every video workflow is the same disappointment: you rendered something beautiful and the save node mangled the colors, dropped the timing, or shipped a file that loops with a visible jump. Save Video π is the AusBoss pack's answer - one node that encodes frames (or a connected core VIDEO) to a real spread of formats, tags them properly, and doesn't freeze the UI while it works.
The formats
The format dropdown covers the realistic choices:
- mp4 h264 - plays everywhere. The default, and the right default.
- mp4 h265 - roughly half the size at the same quality where supported.
- mp4 h264/h265 nvenc - the same codecs encoded on an NVIDIA GPU instead of the CPU. Much faster, slightly larger.
- webm vp9 / webm av1 - for the web, muxing Opus audio.
- mov prores - a ProRes HQ editing master.
- mkv ffv1 - bit-exact lossless, and yes, very large. This is the "archive the master" option.
- gif / webp - silent, loop forever, and hold every frame in memory, so keep them to short clips.
crf (default 19) is the quality dial - lower is better and larger. 19 is visually lossless for h264; vp9 tolerates a few points higher on the same scale.
The details that make it feel finished
- bt709 tagging on the video formats, so platforms don't shift your colors. The sort of thing you only notice when it's missing.
save_metadata(default true) embeds the prompt and workflow in the file - drag that mp4 back onto the canvas and the graph restores. Turn it off when sharing a file you don't want your prompts inside. gif/webp never carry metadata.pingpongbounces the clip forward then backward for a seamless loop without repeating the turnaround frames. The standard "make it loop" trick, built in.- Encoding runs off the executor thread with per-frame progress, so a long export doesn't freeze the UI.
Wiring it right
fps defaults to 16 - wire it from Load Video's fps output to preserve source timing, or connect a video input and the clip brings its own rate (a differing widget rate is logged once, then ignored). audio muxes a track in, e.g. Load Video's audio output. The frames input is a BHWC batch; video supersedes frames and audio when both are connected.
One honest caveat in the tooltip: when you feed a core VIDEO, ComfyUI decodes the whole file into memory before this node sees a frame, and that phase reports no progress and doesn't stop on Cancel. Wiring frames instead keeps the whole run interruptible.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/ausboss/ComfyUI-AusBoss.git
Restart ComfyUI and search for AusBoss (Manager: ComfyUI-AusBoss). No extra Python dependencies - encoding uses PyAV, bundled with ComfyUI. Minimum ComfyUI 0.27.1. NVENC needs an NVIDIA GPU with an encode-capable encoder; everything else runs on CPU.
Troubleshooting
If an NVENC format errors on a non-NVIDIA GPU, that's expected - switch to the CPU pair. If a long clip's export appears frozen, that's the decode phase on a connected VIDEO; wire frames for interruptibility. And if colors shift when you upload a result, check that you're not saving gif/webp (no color tagging) - mp4/mov/webm get the bt709 tag automatically.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| fps | FLOAT | 160.01β240 | Playback frame rate; wire Load Video's fps output to match the source. A connected video input brings its own rate and overrides this widget. Fractional rates like 23.976 and 29.97 can be typed in. |
| filename_prefix | STRING | AusBoss/video | Saved under the output folder; subfolders are created automatically. |
| crf | INT | 190β51 | Encode quality: lower is better and larger. 19 is visually lossless for h264; h265 and vp9 read the same scale (vp9 tolerates a few points higher). |
| framesopt | IMAGE | BHWC frame batch to encode. Not needed when a video is connected. | |
| audioopt | AUDIO | Optional track muxed into the file, e.g. Load Video's audio output. | |
| videoopt | VIDEO | Optional core VIDEO. When connected, its frames and audio supersede the frames and audio inputs, and its own frame rate wins over the fps widget; a differing widget rate is logged once to the console. ComfyUI core decodes the whole file into memory before this node sees a frame: that phase reports no progress and does not stop on Cancel, which takes effect once the encode starts. Wiring frames instead keeps the whole run interruptible. | |
| formatopt | COMBO | mp4 h264 | Container and codec. mp4 h264 plays everywhere; mp4 h265 halves the size at the same quality where supported; the nvenc pair encodes on an NVIDIA GPU instead of the CPU (much faster, slightly larger); webm vp9 and webm av1 suit the web and mux Opus; mov prores is a ProRes HQ editing master; mkv ffv1 is bit-exact lossless and very large. gif and webp are silent, loop forever, and hold every frame in memory - keep those to short clips. |
| pingpongopt | BOOLEAN | false | Play the clip forward then backward so it loops seamlessly. Roughly doubles the frame count and the encode time; the first and last frames are not repeated at the turnaround. |
| save_metadataopt | BOOLEAN | true | Embed the prompt and workflow in the file, so an mp4 dragged back onto the canvas restores its graph. Turn off to share a file without your prompts and node graph inside it. gif and webp never carry metadata. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| file_path | STRING | Absolute path of the file this run saved, for downstream nodes that want the file itself. |