Save Video (FFMPEGA)
The node that finally puts your video somewhere you can find it
- images_a
- audio
- mask
- images
- audio
- video_path
- mask_points
- mask
FFMPEGA's Agent renders to a temp file somewhere in ComfyUI's depths, and if you've ever gone hunting for that file, you know the pain this node kills. Save Video (FFMPEGA) takes a video path - typically the Agent's video_path output - copies the file into ComfyUI's output directory, and shows you an inline preview. Crucially, it does no re-encoding. It's a file copy with a preview, which means it's instant and lossless; the encode happened upstream in the Agent.
That no-re-encode detail is worth re-reading, because it's the difference between "add a Save Video node and lose a generation of quality" and "add it and lose nothing." It also writes a workflow PNG thumbnail alongside the video, so you can drag-and-drop the saved file back into ComfyUI later and reconstruct the workflow that made it.
The inputs that matter
video_path- the file to save. Wire it from the FFMPEG Agent'svideo_pathoutput (or Load Video Path). The file already contains its audio; it's copied as-is.filename_prefix- the saved filename's prefix, defaultFFMPEGA. Supports ComfyUI formatting like%date:yyyy-MM-dd%, so you can get date-stamped outputs for free.save_output- default On. When On it copies to the output directory; when Off it still shows the inline preview and emits frames/audio/path but doesn't write a copy. That's the "am I happy with this before committing" switch.overwrite- default Off, which means auto-incrementing counter when a file already exists. Flip it On to replace instead.
Outputs: images (the frames as a batched tensor), audio, video_path (the saved location - chain it into another loader or an editor), and mask_points pass-through.
Installing it
Part of ComfyUI-FFMPEGA: ComfyUI Manager → search ComfyUI-FFMPEGA → Install, or:
cd ComfyUI/custom_nodes
git clone https://github.com/AEmotionStudio/ComfyUI-FFMPEGA.git
cd ComfyUI-FFMPEGA
pip install -r requirements.txt
Restart ComfyUI. FFMPEG on PATH is the pack's one hard dependency (ffmpeg -version).
Where people get burned
The most common mistake is double-saving: leave the Agent's own save_output On and wire in a Save Video, and you get two copies and two previews. Turn the Agent's off - the README says as much - and let one node own the output. The second gotcha is the mental model: because it doesn't re-encode, this is not where you fix quality. If you want a smaller file or a different codec, do that as an effect in the Agent (compress/convert/quality skills), then Save Video just files the result. Think of it as the pack's mailbox, not its workshop.
Inputs (27)
| Name | Type | Default | Description |
|---|---|---|---|
| filename_prefix | STRING | FFMPEGA | Prefix for the saved video filename. Supports ComfyUI formatting like %date:yyyy-MM-dd%. |
| images_aopt | IMAGE | Image batch to encode as video. When connected without a video_path, encodes the images into an MP4 video at the specified fps. More slots appear automatically (images_b, images_c, ...) so you can stack several sources for comparison. | |
| video_path_aopt | STRING | Path to a video file (typically from the FFMPEGA Agent's video_path output). The file already contains audio if the source had it. More slots appear automatically (video_path_b, video_path_c, ...) — connect several and set 'layout' to combine them side-by-side. | |
| layoutopt | COMBO | auto | How to combine multiple connected sources. auto = best-fit grid (2 side-by-side, 4 in a 2x2, ...). horizontal/vertical/grid force a layout. none = save each source as its own file (no combining). |
| label_panelsopt | BOOLEAN | false | Draw a caption on each panel of a combined video using the comma-separated 'labels' field. |
| labelsopt | STRING | Comma-separated panel captions, e.g. 'Original, Upscaled'. Used only when 'label_panels' is on. Extra panels beyond the list stay unlabeled. | |
| panel_gapopt | INT | 40–128 | Pixel gap between panels in a combined video. |
| fpsopt | FLOAT | 24.0000.01–1000 | Frame rate this node encodes at. Fractional rates are allowed, so 23.976 and 29.97 work. Applies whenever the node encodes — that is, when images are connected, or when an output_format other than 'source' re-encodes. A pass-through file ('source (no re-encode)' with a video_path) keeps its own rate; pick an output_format to re-encode it. |
| audioopt | AUDIO | Optional upstream AUDIO pass-through. When connected, forwarded directly to the audio output instead of extracting audio from the video. | |
| mask_pointsopt | STRING | Optional upstream mask_points pass-through. Forwarded as-is to the mask_points output for downstream nodes. | |
| maskopt | MASK | Optional upstream MASK pass-through. Forwarded as-is to the mask output. | |
| save_outputopt | BOOLEAN | true | When On, copies the video to ComfyUI's output directory. When Off, shows the inline preview and outputs frames/audio/path without saving a copy — useful for previewing before committing. |
| overwriteopt | BOOLEAN | false | If true, overwrite the output file if it already exists. Otherwise, auto-increment the filename counter. |
| show_advancedopt | BOOLEAN | false | Show the encoding controls: format, colour policy, quality, bit depth, audio, looping and metadata. The defaults are good, so this stays collapsed until you need it. Hiding it does not reset anything you have already set. |
| output_formatopt | COMBO | source (no re-encode) | Container and codec for the saved file. 'source (no re-encode)' copies the incoming video untouched — the fastest option and the only lossless one. Any other choice re-encodes (or stream-copies, when only the container differs). Images are always encoded with the chosen format. |
| color_policyopt | COMBO | sRGB (recommended) | How image tensors are converted to video colour. sRGB: BT.709 matrix, limited range, tagged with the true sRGB transfer — matches the ComfyUI preview in colour-managed players. BT.709 broadcast: same pixels, transfer tagged bt709 (what VideoHelperSuite intends). ComfyUI native match: no conversion or tags at all — byte-identical to Create Video + Save Video. full range (pc): 0-255 levels, for archival. Only applies when encoding images; a copied video keeps whatever colour it already had. |
| crfopt | INT | 190–63 | Quality: lower is better and larger. 0 is lossless, 19 is visually transparent, 23 is the x264 default, 28+ is noticeably lossy. Ignored by ProRes and FFV1, which have fixed quality. |
| encode_presetopt | COMBO | medium | Encoder speed vs compression. Slower presets make smaller files at the same quality. Only used by H.264/H.265. |
| bit_depthopt | COMBO | 8 | 10-bit encodes from 16-bit frames, which greatly reduces banding on gradients and skies at almost no size cost. Some players and editors only handle 8-bit. |
| audio_codecopt | COMBO | auto | Audio encoder. 'auto' picks one the container accepts (aac for mp4, opus for webm, flac for mkv). 'none' writes a silent video. |
| audio_bitrateopt | COMBO | 192k | Audio bitrate. Ignored by lossless codecs (flac, pcm_s16le). |
| faststartopt | BOOLEAN | true | Move the mp4 index to the front of the file so it starts playing before it finishes downloading. MP4/MOV only. |
| loop_countopt | INT | 00–100 | Extra repeats of the clip. 0 plays it once, 1 plays it twice, and so on. |
| pingpongopt | BOOLEAN | false | Play the clip forwards then backwards for a seamless loop. Only applies when encoding images — reversing an existing video would need the whole clip in memory. |
| trim_to_audioopt | BOOLEAN | false | When On, the video ends when the audio does. When Off, short audio is padded with silence to the full video length. |
| embed_workflowopt | BOOLEAN | true | Write the workflow into the video file itself, so dragging the video onto the ComfyUI canvas restores it. Uses the same convention as ComfyUI's own Save Video. The sidecar PNG is saved either way. |
| frame_outputopt | COMBO | all | How many frames the 'images' output carries when they have to be decoded from the video. 'all' decodes every frame — the only safe choice if you wire this output into another node. 'preview' samples up to 64 frames spread evenly across the clip: cheap, but it keeps the whole action with fewer frames, so re-encoding it plays faster than the source. 'none' skips decoding entirely. An IMAGE batch connected to this node is always forwarded unchanged, whatever this is set to. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| audio | AUDIO | — |
| video_path | STRING | — |
| mask_points | STRING | — |
| mask | MASK | — |