ComfyUI Node

Preview/Save video

Ran a Veo node and saw nothing? This is the node that shows the video

By GoogleCloudPlatform·Created 8 months ago·Updated about a month ago· 47
Preview/Save video
  • video_paths
    autoplaytrue
    mutetrue
    loopfalse
    save_videofalse
    save_video_file_prefixveo_video

    Here's the thing that trips up everyone's first Veo workflow: the Veo nodes in this pack don't display anything. They generate a video, dump it in ComfyUI's temp folder, and hand you a VEO_VIDEO path list. If your graph ends there, you've spent API money and have nothing on screen to show for it. VeoVideoSaveAndPreview is the terminal node that fixes that - it's what actually renders the video in the UI and, if you ask nicely, saves it somewhere permanent.

    How it works

    It's an output node, so it produces no data outputs - its whole purpose is the player widget and the file handling. It takes the video file paths, opens each one with moviepy to pull the duration, dimensions, and format, then hands a metadata bundle to a small custom JS widget (preview_veo_video.js in the pack's web/ folder) that draws the in-canvas player. The autoplay, mute, and loop flags are exactly what they sound like - player behavior, passed straight through to the widget.

    The interesting part is save_video. When it's off (the default), the video just previews from temp. Flip it on and the node copies the file from temp into output/veo, named {prefix}_{timestamp}_{md5-hash}.{ext}, so you get a unique, collision-proof filename each run. That's the difference between "I can see it right now" and "I can find it next week."

    Inputs that matter

    • video_paths (VEO_VIDEO) - feed it from any Veo node's video_paths output. Required, and it errors if it's empty.
    • save_video - the one most people forget to flip. Off by default, which is why your Veo clips vanish.
    • save_video_file_prefix - default veo_video; change it if you want your outputs grouped by project.
    • autoplay / mute / loop - player controls. Mute defaults to true, which is honestly a mercy on an 8-second generated clip.

    It accepts .mp4, .webm, .ogg, .mov, and .mkv, and raises a clear error if it hits a file it can't handle.

    Installing it

    Part of the Google GenMedia pack - install via ComfyUI Manager (search comfyui-google-genmedia-custom-nodes) or:

    cd ComfyUI/custom_nodes
    git clone https://github.com/GoogleCloudPlatform/comfyui-google-genmedia-custom-nodes
    pip install -r comfyui-google-genmedia-custom-nodes/requirements.txt
    

    Restart, and it lives under Google AI/Utils. No models to download; moviepy (which powers the metadata reading) comes with the requirements. And since this is a Google Cloud pack, the Veo node feeding it still needs your gcp_project_id and gcp_region set - plus gcloud auth application-default login on a local install.

    Where people get burned

    Mostly it's the save flag, honestly. The other common miss: running a Veo workflow without this node at the end and wondering where the output went. It's a deliberately dumb node - wire it after the Veo generator, flip save_video when you care about the file, and if you also need frames for post-processing, run VeoVideoToVHSNode in parallel. Same input, two different jobs, no conflict.

    CategoryGoogle AI/Utils

    Inputs (6)

    NameTypeDefaultDescription
    video_pathsVEO_VIDEO
    autoplayBOOLEANtrue
    muteBOOLEANtrue
    loopBOOLEANfalse
    save_videoBOOLEANfalse
    save_video_file_prefixSTRINGveo_video

    Outputs (0)

    No outputs