Browser Load Video to Image
Video to frames in one shot, with the caps that save your RAM
- images
- frame_count
- fps
Video-to-image is one of those steps you do once and then never want to do by hand again: extract every frame, resize, cap the count, keep the frame rate straight. BrowserLoadVideoToImage does all of it in a single node. Drop in a video, get a batched IMAGE tensor plus the frame count and fps, and you can feed it straight into the rest of the graph.
It's the "decode to frames" half of this pack. If you're doing AnimateDiff-style work, frame interpolation, per-frame upscaling, or any img2vid setup that needs actual pixels, this is the node you want. If you just need a native VIDEO handle to hand to a modern video model, the pack's other node, Browser Load Video, is the one - this node gives you the frames themselves.
How it works
It leans on OpenCV. cv2.VideoCapture opens the file, reads its native fps, dimensions, and frame count, then walks the video frame by frame, converting each from BGR to RGB and to a float 0–1 tensor. Everything comes back as one batched tensor shaped [frames, height, width, channels], alongside the number of frames it actually loaded and the effective fps.
The inputs that matter
Three of the four inputs do real work; leave them at 0 until you need them.
video- the dropdown of files in your input folder.force_rate(0–60, default 0) - the target fps. 0 keeps the source's native rate. Set it lower than the source to skip frames: 24 on a 60fps clip loads roughly every third frame.force_size(0–8192, default 0) - target for the longer side, aspect ratio preserved. A 4K source quietly comes down to whatever you set. 0 keeps native resolution.frame_load_cap(0–100000, default 0) - the cap on total frames loaded; 0 means "all of them."
That last one is the one you'll actually reach for. A two-minute clip at 60fps is 7,200 frames; as one IMAGE batch that's a serious memory bill before the sampler even runs. If you only need a slice for conditioning or a test run, cap it low.
Outputs
images- the batched IMAGE tensor. Wire it into VAE Encode, an upscaler, or a preview.frame_count- an INT, the number of frames actually loaded. Not the total in the file if you capped it - the number you got.fps- an INT, the effective frame rate of the sequence you loaded. Feed it to anything downstream that needs to know the timing, like frame interpolation or video assembly.
Installing
Same pack, same two paths. ComfyUI Manager, search ComfyUI_BrowserLoadImage, install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/flashcol/ComfyUI_BrowserLoadImage.git
cd ComfyUI_BrowserLoadImage
pip install -r requirements.txt
Restart after. This node genuinely needs opencv-python, and the requirements install it.
Gotchas
- No audio, ever. This node reads frames only. If you need sound back on the other end, that's a separate step.
force_rateabove the source fps does nothing. The frame-skip interval floors at 1, so you can only go slower, never faster.- Node missing from your list? The pack's
__init__.pywraps the video nodes in a try/except - ifcv2didn't import, this node silently doesn't register. Runpip install opencv-pythonin ComfyUI's Python environment, restart, and it appears. - Memory. This is the failure mode people actually hit. Long or high-res videos loaded whole can eat your RAM/VRAM, and
frame_load_capis the cure.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| video | COMBO | 0 options: | |
| force_rate | INT | 00–60 | — |
| force_size | INT | 00–8192 | — |
| frame_load_cap | INT | 00–100000 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| frame_count | INT | — |
| fps | INT | — |