Get Video Components
The demux that turns a video file into frames, audio, and the numbers you need
- video
- images
- audio
- fps
- bit_depth
GetVideoComponents is the node that turns a video into the stuff your graph can actually work with: the frames as an IMAGE batch, the audio, the frame rate, and the bit depth. In ComfyUI's modern video world, LoadVideo gives you a VIDEO handle - a lazy reference to a file - but nearly every model in the pipeline operates on plain IMAGE tensors. This node is the bridge between those two worlds, and it sits at the front of just about every video-to-video or frame-based workflow you'll build.
Think of the flow as: LoadVideo → GetVideoComponents → (run frames through a model, a VAE, AnimateDiff, whatever) → CreateVideo → SaveVideo. ComfyUI became the standard for exactly this kind of multi-stage video chain - the KB's ecosystem essay hammers that there's no real alternative when you need to chain a video model, a frame pass, and a re-encode in one pipeline. GetVideoComponents is the disassembly step that makes it possible.
How it works
When the node runs it decodes the video's streams: the video stream gets turned into a BHWC IMAGE tensor (float, 0–1), any audio stream into an AUDIO tensor (waveform plus sample rate), the frame rate into a FLOAT, and the bit depth is read from the stream's pixel format. There's no magic - it's a full decode of the active clip. Which means it's also the expensive step in your workflow, and it's why you trim first with Trim Video when you only need a slice of a long file.
The inputs and outputs that matter
One input: video (VIDEO) - whatever LoadVideo handed you, or anything else that produces a VIDEO.
Four outputs:
images- the decoded frames. This is the one feeding your model.audio- the soundtrack as an AUDIO tensor. Wire it into CreateVideo later if you want it back in the output, or into an audio-pipeline node.fps- the source frame rate. Keep this value; if you re-create the video with the wrong fps you get a clip that's the wrong length or speed.bit_depth- 8, 10, or 12 depending on the source stream. Hand it straight into CreateVideo'sbit_depthinput so you re-encode at the depth you decoded.
The gotchas
Audio isn't guaranteed. If the file has no decodable audio stream, audio comes out empty - the code even has a guard for iPhone spatial-audio tracks that would otherwise crash the decode, so "no audio out" on an oddly-encoded file is normal, not a bug. Bit depth is a property of the source, and re-encoding an 8-bit source as 10-bit won't restore banding-free gradients no matter what you set - it just converts. And remember the decode cost: this node materializes every frame you ask for, so it's the natural place to check your VRAM. For the classic "I just want to change the model's starting frame" trick, loading video and grabbing components is the built-in, no-extension way to do it.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| video | VIDEO | The video to extract components from. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| audio | AUDIO | — |
| fps | FLOAT | — |
| bit_depth | INT | — |