Nougan Save Video π¬
Save video with the workflow inside it β codecs, CRF and the NVENC trap
- images
- audio
- path
- info
The best thing about ComfyUI is that a PNG remembers how it was made. You drag it back onto the canvas and the entire graph rebuilds. Video has never worked that way - until a saver decides to embed the graph in the container. Nougan Save Video π¬ does, embed_workflow is on by default, and it also plays the result back inside the node instead of spitting a path into your console.
What it does
Frames in (IMAGE), optional audio in, a file out. It drives ffmpeg - found on your PATH first, then via pip install imageio-ffmpeg - and exposes the parts of ffmpeg that actually matter to a person making a clip, without exposing the parts that require remembering what -crf does.
Nine codec/container combinations: H.264 MP4, H.265/HEVC MP4, AV1 MP4, AV1 WebM, VP9 WebM, H.264 MKV, H.265 MKV, ProRes 422 HQ MOV and FFV1 lossless MKV. H.264 MP4 is the right answer 90% of the time; ProRes or FFV1 are for when you're handing off to an editor and don't want a second generation of compression.
The settings that matter
images, fps - the frames and their rate. Get fps from something that also knows your frame count (say, Nougan Duration β Frames β±οΈ) and the video can't disagree with the generator about how long it is.
codec and quality (0β100, default 80). Quality isn't a vibe: it maps onto each encoder's CRF/CQ range, so higher is better and bigger. 80 is near-lossless for most generated content; 92+ is where you stop gaining anything visible and start gaining gigabytes.
encoder - CPU or GPU (NVIDIA NVENC). NVENC is much faster and uses a different quality curve; if it fails it falls back to CPU on its own. speed (fast / balanced / slow) trades time for file size at the same quality.
bit_depth - 8-bit or 10-bit. 10-bit genuinely reduces banding in gradients and skies, and genuinely breaks playback in some players. Know your audience.
resize - original, 480p through 2160p. Never upscales, so picking 4K on a 720p render does nothing.
Hidden behind advanced in the UI, but real: audio_bitrate, save_to_output, embed_workflow (store the workflow and prompt inside the video file), and preview_proxy - which builds a small H.264 copy for HEVC/ProRes/FFV1 so the in-node player works in any browser. The node's player also prints which encoders your ffmpeg actually has, which is the fastest way to find out you're running a stripped build.
filename_prefix allows subfolders (Nougan/clips/scene), which is the difference between a tidy output folder and 400 files called video_00042.mp4.
Audio gets padded with silence or trimmed to the video length - no desync surprises.
Outputs
path (STRING) - where the file went. info (STRING) - the encode summary. It's an output node, so it runs on queue.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Winnougan/Nougan_Nodes
# restart ComfyUI
Or ComfyUI Manager β "Nougan". Then make sure ffmpeg exists:
ffmpeg -version # or: pip install imageio-ffmpeg
For anything beyond H.264 you want a full ffmpeg build (the "full" builds from gyan.dev are the usual recommendation on Windows) - AV1 and HEVC encoders are frequently missing from distro packages. Hard-refresh after restart or the player and chips won't render.
Where people get burned
"This ffmpeg has no <codec> encoder". The node names the missing encoder, which is more than ffmpeg does. Swap codec or install a fuller build. libsvtav1 missing is the common one.
Frame counts that don't line up. Feeding fps by hand while the generator used a formula is how clips come out subtly sped up. Use the fps output from your duration node.
Ten-bit that won't play. Fine for your archive, hostile to WhatsApp. Render 8-bit for anything that leaves your machine.
Big files from "quality 100". You're paying for bits nobody can see. 80β85 is the sweet spot for generated video with typical noise.
Expecting the workflow embed to survive a re-encode. It's stored in the container's metadata; hand it to a service that re-encodes and it's gone - the same way a screenshot strips a PNG's workflow. The preview_proxy file is a good reminder of that: it exists for playback, not archiving.
VRAM pressure on long clips. It reads frames into ffmpeg from a queue rather than holding everything, but the frames themselves came from your sampler. If a run dies before saving, the saver was never the problem - see the usual levers: shorter clips, fewer steps, a smaller resolution, or freeing memory between stages with Nougan Refresh Page π.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | The video frames. | |
| fps | FLOAT | 24.001β240 | Frames per second. |
| codec | COMBO | H.264 (MP4) | Codec and container. |
| quality | INT | 800β100 | Higher is better and larger. 80 is near-lossless for most content. |
| filename_prefix | STRING | Nougan/video | Subfolders allowed, e.g. Nougan/clips/scene |
| save_to_output | BOOLEAN | true | β |
| advanced | BOOLEAN | false | β |
| speed | COMBO | balanced | Slower is smaller at the same quality. |
| encoder | COMBO | CPU | GPU uses NVENC if available and falls back to CPU if it fails. |
| bit_depth | COMBO | 8-bit | 10-bit reduces banding. Not every player supports it. |
| resize | COMBO | original | Downscale to this height. Never upscales. |
| audio_bitrate | COMBO | 192k | 5 options: 96k, 128k, 192k, 256k, 320k |
| embed_workflow | BOOLEAN | true | Store the workflow and prompt inside the video file. |
| preview_proxy | BOOLEAN | true | For HEVC / ProRes / FFV1, make a small H.264 copy so the in-node player works in any browser. |
| audioopt | AUDIO | Optional soundtrack. Padded with silence or trimmed to the video length. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| path | STRING | β |
| info | STRING | β |