ComfyUI Node Runs on cloud

Video Info

Measure a clip without decoding a single frame

By WASasquatch·Created 3 years ago·Updated 4 days ago· 1,844
Video Info
  • video
  • width
  • height
  • duration
  • frame_count
  • fps
  • bit_depth
  • has_audio
  • summary

Before you resize a video, sample it, or hand it to a video sampler, you usually need to know what you're holding: how big are the frames, how long is the clip, how many frames, what rate, is there sound? Video Info answers all of it as typed numbers - and because it reads the header rather than the frames, a feature-length film costs about the same as a two-second clip.

What it does

Wire anything on a VIDEO socket into it - a loaded file, a video built from frames, even a trimmed one - and out come the figures as numbers:

  • width / height - frame size in pixels (1920×1080 for HD, 3840×2160 for 4K). Feed them to a resize node and you never hardcode a resolution again.
  • duration - seconds the video plays, as a FLOAT.
  • frame_count - how many frames play. Taken from the header, or worked out from duration × rate when the header doesn't say. This is the one to feed a video sampler that needs its length told to it.
  • fps - frames per second. 24 for film, 25 or 30 for broadcast, 29.97 for NTSC. Feed it to a save node so a render plays back at the speed it was shot rather than defaulting.
  • bit_depth - bits per colour component: 8 for most footage, 10 for HDR. Feed it to a save node so a 10-bit source is written back at 10 bits instead of being flattened to 8.
  • has_audio - true when there's a decodable sound track. Check it before wiring an audio socket into a save; false for a silent file and for one whose track FFmpeg has no decoder for.
  • summary - all of the above on one line, like 1920x1080, 240 frames, 10.00s at 24 fps, 8-bit, with sound. Wire it to a text preview, or into a filename prefix to stamp a render with what it came from.

The header trick

Reading "from the header rather than the frames" is what makes this node near-free on any clip, and it's also why a trim is honoured - the figures describe what plays (the trimmed range), not the raw file on disk. That distinction matters when you're building adaptive pipelines: measure first, then pick a resize target, an fps, or a frame budget that fits the actual content.

The natural pattern is Video Info → wire width, height, fps and frame_count straight into whatever needs them, and route has_audio into a switch so a silent source doesn't try to wire audio downstream. It turns "video that could be anything" into "video with known dimensions and duration" before a single expensive operation runs.

Don't confuse it with Video Metadata

There are two video-measuring nodes in the suite and they take different inputs. Video Info reads any VIDEO wire directly and is what you want here. Video Metadata instead takes the one metadata socket that the Load Video / Load Video (Upload) nodes emit - it reports what that load measured (including the source file's own figures) and is the right tool when you want the file's original rate before a target_fps was applied. Video Info is the general-purpose measurer; Video Metadata is the loader's companion.

Installing it

Part of WAS Node Suite v3 (WASasquatch's was-node-suite-comfyui, MIT). Search "WAS Node Suite v3" in ComfyUI Manager, or:

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

Restart ComfyUI after installing. Requires ComfyUI 0.14.0+ and Python 3.10+. Video handling rides on ComfyUI's own bundled FFmpeg/PyAV stack, so nothing extra to install.

CategoryWAS Suite/IO

Inputs (1)

NameTypeDefaultDescription
videoVIDEOThe video to measure. Anything on a VIDEO wire: a file that was loaded, a video built from frames, or a trimmed one. A trim is honoured, so the figures describe what plays rather than the file.

Outputs (8)

NameTypeDescription
widthINTFrame width in pixels. 1920 for HD, 3840 for 4K.
heightINTFrame height in pixels. 1080 for HD, 2160 for 4K.
durationFLOATSeconds the video plays for. 10.0 for 240 frames at 24 fps. 0.0 where the header names no length and none could be worked out from the frame count and the rate.
frame_countINTHow many frames play. 240 for ten seconds at 24 fps. Taken from the header, or worked out from the duration and the rate where the header does not say. Feed it to a sampler that needs its length.
fpsFLOATFrames per second. 24 for film, 25 or 30 for broadcast, 29.97 for NTSC. 0.0 where the header names no rate. Feed it to a save node so a render plays at the speed it was shot.
bit_depthINTBits per colour component. 8 for most footage, 10 for HDR and higher end capture. Feed it to a save node so a 10-bit source is written back at 10 bits instead of being flattened to 8.
has_audioBOOLEANTrue when there is a sound track that can be decoded. False for a silent file, and for one whose track FFmpeg has no decoder for. Check it before wiring an audio socket into a save.
summarySTRINGAll of the above on one line, as `1920x1080, 240 frames, 10.00s at 24 fps, 8-bit, with sound`. Wire it to a text preview, or into a filename prefix to stamp a render with what it came from.