TL;DR — Upload a clip and get a real
VIDEO(plugs straight into video‑to‑video AI nodes) plus itsframes,audio,fpsandframe_countfrom one node. Trim by seconds (slider shows timestamp and frame number), downscale in one click, hit an exact frame count, stay memory‑light on long/4K clips, and never expose a file path.
- 🎞️ Real
VIDEOoutput — hands downstream nodes a native ComfyUIVIDEO(file‑backed), so it connects directly to Floyo's video‑to‑video AI nodes,SaveVideo,AudioVideoCombine, etc. — not just raw frames. - ⏱️ Trim by time, not frame index — drag a range slider in seconds; it shows the timestamp + the frame number live as you scrub.
- 🎯 Exact frame targeting — set
target_framesto force a precise count (e.g. a model that needs a multiple of 16); fps is derived automatically. Or settarget_fpsinstead. (target_frameswins when both are set — industry‑standard: frames = fps × duration.) - 📉 1‑click downscale —
Source / 1080p / 720p / 480p. Never upscales. - 🔎 Instant source info — read‑only FPS / Frames of the loaded clip, read from the file header server‑side (no decoding) — so it stays fast and light even for 20–30 min 4K uploads on low‑end devices.
- 🔊 Audio passthrough — outputs the trimmed audio (and muxes it into the
VIDEO); wire it to any audio input. - 🪶 Memory‑light — seeks, scales and drops frames inside the decode, so a 3s slice of a long 4K clip never decodes the whole file at full res. No OOM.
- 🔒 Upload‑only, no file paths — resolves a filename strictly inside ComfyUI's input dir (traversal‑guarded); nothing path‑like is returned or saved into the workflow. Built for hosted ComfyUI.
| Port | Type | What |
|---|---|---|
video |
VIDEO | The trimmed/scaled clip as a native, file‑backed video — for AI video nodes & SaveVideo. |
frames |
IMAGE | The trimmed/scaled frame batch. |
audio |
AUDIO | The trimmed audio (silent if the source has none or include_audio is off). |
fps |
FLOAT | Output fps. |
frame_count |
INT | Number of output frames. |
| Widget | Type | Does |
|---|---|---|
video |
upload | Pick / upload a clip — filename only, no paths. Shows an in‑node preview. |
start_seconds |
float | Trim start (seconds). |
end_seconds |
float | Trim end (seconds). 0 = end of clip. |
quality |
preset | Downscale: Source / 1080p / 720p / 480p. Never upscales. |
target_fps |
float | Output fps. 0 = keep source. |
target_frames |
int | Exact output frame count. 0 = off. Overrides target_fps. |
include_audio |
bool | Also output the trimmed audio. |
The panel also shows a live Output readout (frames · fps · duration) and greys out
target_fpswhentarget_framesis set, so the active mode is always clear.
ComfyUI Manager — search Floyo Video Studio → Install.
Git
cd /path/to/ComfyUI/custom_nodes
git clone https://github.com/FloyoAI/Floyo-Video-Studio.git
pip install -r Floyo-Video-Studio/requirements.txt # PyAVRestart ComfyUI → Add Node → Floyo → Video → 🎬 Floyo Video Studio.
Needs PyAV (
av) — it bundles ffmpeg, so there's no separate binary to install.
- Add the node and upload a video.
- Drag the trim slider to the range you want (watch the timestamp + frame number).
- Optionally pick a quality preset and/or set
target_fpsortarget_frames. - Wire it up:
video→ any video‑to‑video AI node orSaveVideoframes→ image nodes ·audio→ audio nodes ·fps/frame_count→ wherever a count is needed.
Example (proven end‑to‑end): Floyo Video Studio.video → Seedvr_Upscale_Video → Video URL to Frames → Video Combine.
- Why a
VIDEOoutput: every Floyo video‑to‑video AI node consumes the nativeVIDEOtype. The output is encoded to a temp file so partner uploaders that need a real path work out of the box. target_framesvstarget_fps: for a fixed trim duration, an exact frame count forcesfps = frames / duration— matching FFmpeg / NLE retiming / AI video models. (A few fps‑conditioned models, e.g. SVD, treat fps as a motion input — settarget_fpsthere instead.)- Hosted‑ComfyUI safe: no path in, no path out; streaming decode keeps memory flat on long/4K clips.
MIT — see LICENSE.
Built with care by Floyo 💜