Nodes/ComfyUI-JNodes/Save Video (With Options)
ComfyUI Node

Save Video (With Options)

The video muxer with the encoder dropdown you actually want

By JaredTherriault·Created 3 years ago·Updated about a month ago· 91
Save Video (With Options)
  • images
  • audio_options
    frame_rate8
    loop_count0
    filename_formatComfy_%date%_%time%_%counter%
    output_format
    save_to_output_dirtrue
    quality95
    save_metadatatrue
    save_workflowtrue
    batch_size128
    save_prompt_server_prompttrue
    additional_metadata_json

    You generated a batch of frames - AnimateDiff, Wan, whatever - and now you need them as an actual video file with the right codec, the right frame rate, and ideally the metadata baked in so you can drag the file back into ComfyUI later. That's this node. It's the current, non-deprecated save-video node in JNodes (there's an older JNodes_SaveVideo that literally tells you to use this one instead), and the "With Options" in the name is the whole pitch: it hands you the encoder choice, quality, filename tokens, and audio muxing in one box.

    If VHS_VideoCombine looks familiar, that's not a coincidence. JNodes is a quality-of-life suite that Jared Therriault (Jarether on Reddit) started in mid-2024, and he's upfront that the video nodes are built on Kosinkadink's VideoHelperSuite. The JNodes twist is "minor improvements": metadata written into gif/webp, plus tighter filename control. So the mental model is VHS with a couple of sharp edges filed off.

    How it works

    You feed it an images batch - that's your ordered stack of frames as an IMAGE pin - and it encodes them into a single file at frame_rate fps. It's an output node, so it terminates that branch of the graph; there are no image outputs to chain onward. The encoding backend depends on the format you pick, which is where the footguns live (more below).

    The inputs that matter

    • output_format - the enum you'll fuss over most: image/gif, image/webp, image/apng, then the real video codecs video/h264-mp4, video/h265-mp4, video/h264_nvenc-mp4, video/av1-webm, video/ProRes, and video/webm. For sharing on the web, h264-mp4 is the safe default; for a losslessly-clean intermediate, ProRes.
    • frame_rate (default 8) - match whatever your generator produced or your motion looks wrong.
    • save_to_output_dir (default true) - flip it off to preview without writing to disk.
    • quality (default 95) - only meaningful for the lossy formats.

    The rest are sensible: loop_count (0 = infinite loop, relevant for gif/webp), filename_format (Comfy_%date%_%time%_%counter% - those tokens get expanded), save_metadata, save_workflow, batch_size (min 32, controls how many frames get held in memory during encode), and save_prompt_server_prompt. Two optional pins: audio_options (an AUDIO_INPUT_OPTIONS input, for muxing sound) and additional_metadata_json for stuffing extra key/values in.

    How to install it

    Via ComfyUI Manager: Install Custom Nodes, search "JNodes", install, restart. Or by hand:

    cd ComfyUI/custom_nodes
    git clone https://github.com/JaredTherriault/ComfyUI-JNodes
    pip install -r ComfyUI-JNodes/requirements.txt
    

    then restart ComfyUI. No model downloads - it's pure Python. Don't skip the requirements.txt step; the video path leans on it.

    Common issues & troubleshooting

    The mp4/webm/ProRes/av1 formats need ffmpeg. The image/* formats (gif, webp, apng) are handled by Pillow and work anywhere, but the true video codecs shell out to ffmpeg. No ffmpeg on the machine, no h264. If a video format silently fails or errors, that's the first thing to check.

    video/h264_nvenc-mp4 needs an NVIDIA GPU with NVENC. It's hardware-accelerated encoding - great when you have it, a hard fail on CPU-only or non-NVIDIA setups. Fall back to plain video/h264-mp4 (libx264, CPU) if NVENC isn't available.

    Metadata only rides in some formats. Baking workflow/prompt into gif and webp is exactly the improvement this node adds over vanilla VHS, so if you want the drag-back-into-Comfy trick, those two (or mp4) carry it. Don't expect it from every container.

    Frame order looks scrambled or motion stutters. That's almost always a frame_rate mismatch with what your generator assumed, not the node - set it to match your source.

    Categorysd

    Inputs (13)

    NameTypeDefaultDescription
    imagesIMAGE
    frame_rateINT8
    loop_countINT00–100
    filename_formatSTRINGComfy_%date%_%time%_%counter%
    output_formatCOMBO9 options: image/gif, image/webp, image/apng, video/h264-mp4, video/h265-mp4, video/h264_nvenc-mp4, +3
    save_to_output_dirBOOLEANtrue
    qualityINT950–100
    save_metadataBOOLEANtrue
    save_workflowBOOLEANtrue
    batch_sizeINT128
    save_prompt_server_promptBOOLEANtrue
    audio_optionsoptAUDIO_INPUT_OPTIONS
    additional_metadata_jsonoptSTRINGOptionally add a secondary set of metadata key-value pairs from a stringified json. Will overwrite keys in extra_pnginfo if a key has the same name.

    Outputs (0)

    No outputs