Nodes/WAS Node Suite v3/Load Video (Upload)
ComfyUI Node Runs on cloud

Load Video (Upload)

Same loader, but the clip can live on the internet

By WASasquatch·Created 3 years ago·Updated 4 days ago· 1,844
Load Video (Upload)
    • video
    • images
    • audio
    • metadata
    file
    num_frames16
    strategyuniform
    nth1
    seed0
    target_fps0.00
    resize_modefit and pad
    width0
    height0
    start0
    end-1
    max_size1024
    interpolationlanczos
    alignmiddle center
    pad_color#000000
    channelsRGB

    Load Video (Upload) is the sibling of Load Video (Advanced) that adds two things: a file upload button and a URL field. Paste a web address into url, and the node downloads the clip to ComfyUI's temp folder and reads it from there. Everything else - the frame selection, the sizing, the four outputs - is identical to the advanced loader, so learn one and you know both. It's the node you reach for when your source video is on a server somewhere rather than already sitting in your input folder.

    Like the whole suite (WAS Node Suite, WAS Suite/IO), it needs no external packages - the v3 rewrite handles video through ComfyUI's own media stack.

    How it works

    You have three ways to get a clip into it, and the url field quietly wins:

    • Pick from the file menu - every video in ComfyUI's input folder, tagged by location, with a player showing the current selection.
    • Hit the upload button, which puts a file into input and selects it.
    • Paste an address into url. When it holds an address, the menu is ignored: the file is fetched into ComfyUI's temp folder once and read from there on later runs, so re-executing the graph doesn't re-download it.

    One requirement to know up front: fetching from a URL needs features.network: true in the suite's config.yaml. Out of the box that flag is off - nothing in WAS Node Suite reaches for the network unless you ask it to. If you paste a URL and nothing arrives, that's the first place to look. The file is read after one fetch, so this isn't a live-streaming node; it's "grab this clip once and work on it."

    From there it's exactly the advanced loader's engine: strategy (uniform, head, center, tail, random, every_nth) picks num_frames - 16 by default, since a batch is one tensor in memory and clips hold thousands. nth thins the pool, start/end bound the range with negatives counting back from the end, and target_fps (0 = the file's own rate) re-times the kept frames so the clip plays the same duration whether you drop or repeat frames. Sizing uses width/height (0 = encoded size) with max_size capping the longest edge so a 4K download doesn't blow up memory; resize_mode, align, pad_color, and channels handle how frames meet that size, with RGBA keeping a transparent pad.

    What comes out

    Same four wires as the advanced version, and they're all live at once:

    • video (VIDEO) - the kept frames with sound, at the output rate, ready for Save Video (Advanced) or anything taking a VIDEO.
    • images (IMAGE) - the same frames as one batch, in order - the wire for per-frame work or feeding first/last frames into an image-to-video model.
    • audio (AUDIO) - the sound under the kept span; empty for silent files, so check has_audio in the metadata first.
    • metadata (WAS_VIDEO_METADATA) - rate, frame count, size, duration, bit depth, has-audio, unpacked to numbers by Video Metadata.

    Installing it

    ComfyUI Manager → "WAS Node Suite v3", or:

    cd ComfyUI/custom_nodes
    git clone https://github.com/WASasquatch/was-node-suite-comfyui.git
    

    restart. ComfyUI 0.14.0+ and Python 3.10+ required, no pip dependencies. And if you want the URL feature, flip network: true under features: in <ComfyUI user dir>/was-node-suite/config.yaml first.

    Where people get burned

    The network flag is the number one "why isn't it downloading" answer - it's off by default on purpose. Number two is expecting a URL to stay live: the node fetches once into temp, so a clip that gets deleted from temp later means a fresh download, and a URL that 404s after the first run reads from the copy already there. And if your uploaded clip has no audio on the audio wire, confirm the file actually has a track via metadata before you blame the loader.

    CategoryWAS Suite/IO

    Inputs (16)

    NameTypeDefaultDescription
    fileCOMBOWhich video to read, from ComfyUI's input folder. The button below uploads one and selects it, and the player shows what is selected.
    num_framesINT160–4096How many frames to keep, chosen by the strategy below. 16 by default; a clip can hold thousands and a batch is one tensor in memory. 0 takes every frame in the range, up to the 4096 ceiling.
    strategyCOMBOuniformHow num_frames are chosen. uniform = evenly spaced; head = first; center = middle; tail = last; random = a seeded pick; every_nth = every nth. uniform gives a contact sheet of a whole clip, head gives a run that plays.
    nthINT11–16384Step between the frames the strategy may choose from. 1 uses every frame; 2 thins to every other one first, so `head` takes the opening of the clip on alternate frames. It applies to every strategy.
    seedINT00–18446744073709550000Seed for random, so a re-run keeps the same frames. Ignored by the other strategies. Any whole number; `0` is as good a seed as any.
    target_fpsFLOAT0.000–240Rate the frames come out at. 0 keeps the file's own. A lower rate drops frames and a higher one repeats them, so the clip runs for the same time either way. Set it to match a model that wants 8 or 16 fps.
    resize_modeCOMBOfit and padHow each frame meets the size below. `fit and pad` keeps the whole frame and pads the rest, `fill and crop` fills the size and trims the overhang, `stretch` distorts to fit, `crop or pad` never resamples.
    widthINT00–16384Width every frame is brought to. 0 takes the width the file was encoded at, which is what loads a clip at its own size.
    heightINT00–16384Height every frame is brought to. 0 takes the height the file was encoded at.
    startoptINT0-16384–16384First frame to consider, counting from 0 through the file's own frames. Negative counts back from the end, so -60 starts sixty frames before it.
    endoptINT-1-16384–16384Last frame to consider, inclusive. -1 is the final frame, which is the whole clip together with a start of 0.
    max_sizeoptINT10240–16384Longest edge the derived size is held to, keeping the aspect. Only read when width and height are 0, which is where a 4K clip would otherwise fill memory. 0 lifts the cap.
    interpolationoptCOMBOlanczosResampling filter. `lanczos` is the sharpest for a downscale.
    alignoptCOMBOmiddle centerWhich part of a frame survives a crop, and which side carries the wider bar of a pad.
    pad_coloroptSTRING#000000Fill for space a frame does not cover. Any Pillow colour.
    channelsoptCOMBORGBChannels the image batch carries. `RGBA` keeps the pad transparent. The video output is always colour, since a video carries no transparency.

    Outputs (4)

    NameTypeDescription
    videoVIDEOThe frames that were kept, with their sound, as a video at the rate below. Wire it into Save Video, or into any node taking a VIDEO.
    imagesIMAGEThe same frames as one image batch, in playback order, every one at the same size.
    audioAUDIOThe sound playing under the frames that were kept, from where they start and for as long as they run. Empty when the file is silent, so read has_audio before wiring this into a save node.
    metadataWAS_VIDEO_METADATAWhat this read measured: the rate, the frame count, the size, the duration, the bit depth and whether there is sound, beside the same figures for the file itself. Wire it into Video Metadata to read any of them as a number.