Save Video with Generation Data
The video save node that keeps the whole recipe attached
- images
- audio
- pipe_opt
- images
You know how a ComfyUI PNG carries the entire workflow inside the file - drag it back onto the canvas and the whole graph rebuilds? Save Video with Generation Data is that idea, applied to MP4. It takes your frame batch, writes an h264 video, and bakes the generation recipe into the file alongside it: the raw ComfyUI workflow, an A1111-style parameters string, model hashes, and optionally a .json sidecar of the graph. If you've ever come back to a video a week later and had no idea what sampler, seed, or model made it, this node is the fix.
It's the video sibling of the Eclipse pack's Save Images node (same metadata engine, different container). It ships with the r-vage/ComfyUI_Eclipse pack, sits at the end of a video workflow - WanVideo, an image-to-video chain, whatever - and is also the pack's most feature-loaded output node, because it folds in trim and seamless-loop controls that other save nodes don't have.
How it works
The encoding is done in-process with PyAV (Python bindings that bundle the ffmpeg libraries), so there's no external ffmpeg binary to hunt down. It writes with movflags=use_metadata_tags+faststart, meaning the metadata tags land before the media and the file starts playing before it's fully downloaded.
Two metadata streams get attached:
- Raw workflow: with
embed_workflowon (default), it embeds ComfyUI's rawpromptandworkflowdata as MP4 tags - the same payload that normally lives in a PNG's text chunks, just re-homed in the container. - A1111 generation data: with
save_generation_dataon and a PIPE connected, it writes aparameterstag in the flat A1111 dialect - prompt,Negative prompt:, thenSteps:,Sampler:,CFG scale:,Seed:,Size:, model name, and short SHA-256 hashes for models, VAEs, LoRAs, and embeddings. That's the format Civitai's uploader auto-detects, so your video page gets its generation tab filled in for free.
The trim/loop logic runs on the frames before encoding: align video to audio, trim both to the shorter, or find a seamless loop point. Loop matching searches the head and tail (downsampled to 512px for speed) and can crossfade the tail back into the start with loop_match_blend.
The inputs that matter
You only really set a handful; the rest are sensible defaults.
images(required) - your frame batch, straight out of the video decoder or sampler.audioandpipe_opt(both optional) - a WAV-style AUDIO track, and a Generation Data PIPE. That PIPE is what unlocks everything: without it, noparameterstag and no generation placeholders. It's the single most important optional input.filename_prefix- defaults tovideo/ComfyUI_Eclipse, supports placeholders like%today,%basemodel,%seed,%sampler_name,%steps.video/%today/%basemodel_%seedgives you an organized, reproducible output tree.fps,crf(lower = higher quality, 19 is a good default),preset- your encode dials.- The feature chips (
embed_workflow,save_generation_data,remove_prompts,save_workflow_as_json,add_loras_to_prompt,enable_trim) - toggles that hide/show the trim widgets and control what gets embedded.
Output is the trimmed or looped images batch; since this is an output node with a resizable video preview, you mostly ignore it.
Installing it
The usual Eclipse route - either ComfyUI Manager (search "ComfyUI_Eclipse") or:
cd ComfyUI/custom_nodes
git clone https://github.com/r-vage/ComfyUI_Eclipse
pip install -r ComfyUI_Eclipse/requirements.txt
then restart ComfyUI.
Here's the gotcha the README won't warn you about: this node imports PyAV (av) at module load, but av is not in requirements.txt or pyproject.toml. On a fresh environment the whole pack can fail to register nodes with No module named 'av' in the server log. The fix is one line:
pip install av
(On the Windows portable build, that's python_embeded\python.exe -m pip install av.)
Common issues
- Eclipse nodes don't appear after install - check the server log for an import error;
avis the usual culprit on clean installs. - Old shared workflows won't load - r-vage's earlier packs (RvTools, RvTools_v2) are dead, and v4.0 removed all legacy node names. You'll see "unknown node type" for things like
Float to Integer // RvTools. The pack ships a Workflow Migration Tool node and a CLI script (python tools/migrate_workflow.py <workflow.json>) to auto-upgrade them with backups. It's the single most common way people hit this pack, and the migration tool is the fix. - Civitai doesn't parse your workflow - the Comfy parser sometimes chokes on a complex raw graph. Disable
embed_workflowand the A1111parameterstag stays as the unambiguous generation-data source. - Audio fails but video survives - by design. A bad audio track logs a warning and the MP4 still saves with video, so don't be alarmed if you see a
SaveVideoDatawarning in the log.
One trap worth naming: if you feed it just frames with no PIPE, save_generation_data quietly does nothing and generation placeholders fall back to readable names like seed. Want provenance? Wire up a Generation Data pipe.
Inputs (21)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | Required batch of video frames. | |
| features | STRING | embed_workflow,save_gen_data,trim | Feature state used by the combo-chip interface. |
| embed_workflow | BOOLEAN | true | Embed raw ComfyUI prompt and workflow metadata. |
| save_generation_data | BOOLEAN | true | Embed A1111-compatible parameters when PIPE is connected. |
| remove_prompts | BOOLEAN | false | Blank both prompts in generation metadata. |
| save_workflow_as_json | BOOLEAN | false | Write the workflow beside the MP4 as JSON. |
| add_loras_to_prompt | BOOLEAN | false | Append used LoRA names and weights to positive prompt metadata. |
| enable_trim | BOOLEAN | true | Enable trim and loop controls. |
| fps | FLOAT | 24.001–240 | Output video frame rate. |
| filename_prefix | STRING | video/ComfyUI_Eclipse | Relative output prefix. Supported placeholders: %today, %date, %time, %Y, %y, %m/%M, %d/%D, %H, %S, %basemodel, %model, %seed, %sampler_name, %scheduler, %steps, %cfg, %denoise, %clip_skip. |
| format | COMBO | mp4 | Output container format. |
| codec | COMBO | h264 | Output video codec. |
| crf | INT | 190–51 | Quality factor; lower values give higher quality. |
| preset | COMBO | veryfast | H.264 compression-speed preset. |
| trim_mode | COMBO | video_to_audio | Align video/audio or find a seamless loop point. |
| loop_search_pct | INT | 501–99 | Percentage of head/tail frames searched for a loop match. |
| loop_blend_frames | INT | 80–60 | Tail frames blended toward the loop start. |
| loop_metric | COMBO | ncc | Similarity metric used for loop-point detection. |
| loop_trim_start | BOOLEAN | false | Search both the beginning and end for the closest loop pair. |
| audioopt | AUDIO | Optional audio track. | |
| pipe_optopt | PIPE | Optional Generation Data PIPE for metadata and placeholders. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | Frames after trim or loop processing. |