Convert Framerate
Convert Framerate — the node that fixes your 24 fps clip without an FFmpeg degree
- input
- output
So you generated a video and now it doesn't fit the delivery spec. LTX spits out 24 fps, Wan and AnimateDiff chain 16-frame clips that playback at whatever, and your editor or client wants 25 fps PAL or 30 fps web. That's the gap this node exists for. It's the flagship of the Framerate Converter pack (Trope Tools, by TropeMedia/GitHub user LaserDog80): one node, a VIDEO in, a VIDEO out, and a whole FFmpeg conversion pipeline hidden inside.
The name is honest about the scope - it doesn't call any API, needs no model download, and has zero Python dependencies. The entire pack is the standard library plus the system ffmpeg/ffprobe binaries. That's it.
What you actually set
Two things matter for a beginner. Wire any VIDEO into input - from the built-in Load Video node, or straight out of a video-sampling workflow. Then set target_fps (default 25.0, range 1–240). Everything else has a sane default.
The optional knobs, briefly:
- method -
speed_change(default) stretches the timeline slightly and keeps every frame, the cleanest result for small jumps like 24↔25.frame_dropduplicates/drops frames for big jumps (60→30).frame_blendblends adjacent frames - smoother than dropping, slight ghosting.minterpolatedoes motion interpolation, the highest-quality up-conversion but genuinely slow. - audio_mode -
allow_shift(default) plays audio at the new speed with a barely-audible pitch shift (about 0.7 semitones for 24→25).preserve_pitchre-pitches it to match.copykeeps the original untouched and will drift out of sync - only for tests.no_audiostrips it. - crf - the quality dial, 0 (lossless, huge) to 51 (tiny, terrible). Default 18 looks essentially identical to source. Lower it to 14 if you're fussy.
If the source has no audio stream, the node quietly forces no_audio, so you don't get a crash on silent renders.
How it works
Under the hood it's a five-node pipeline: probe the file with ffprobe, calculate conversion + audio params, generate an output path, build the FFmpeg command, run it. Crucially it reads the average framerate from ffprobe, not the nominal one - AI exporters and variable-framerate sources often declare a framerate they don't actually play at, which is exactly the kind of silent trap that gives you a video that "looks wrong."
The node writes the converted file into ComfyUI's input/ folder as <original>_<targetfps>fps.mp4 and hands you a VIDEO on its output port. Wire that to Save Video, or chain it straight into the pack's Remux Container node for "24 fps .mp4 → 25 fps .mov" in one pass. If you skip Save Video, the file's already on disk in input/.
Install
Easy way: ComfyUI Manager → search Trope Tools - Framerate Converter → Install → restart. Terminal way:
cd ComfyUI/custom_nodes
git clone https://github.com/LaserDog80/ComfyUI-FramerateConverter
Then restart ComfyUI. No pip install needed.
The one dependency it won't install for you is FFmpeg itself: brew install ffmpeg on a Mac, sudo apt install ffmpeg on Linux, or a build from gyan.dev on Windows (add bin/ to PATH). If it's missing, the pack prints a clear warning in the console at startup instead of failing silently mid-conversion.
Where people get burned
- "ffmpeg not found" at startup - you haven't installed FFmpeg yet, that's all.
- Audio drifts after conversion - try
preserve_pitch, then suspect a variable-framerate source (phone recordings are the usual culprit). Convert to constant framerate first; the pack's Detect VFR node can confirm it. - Mac, video outside
~/comfyui/won't load - the sandboxed ComfyUI.app needs Full Disk Access in System Settings, or just drag files into Load Video like a normal person.
It's a small, young pack (near-zero community footprint as of writing), so the docs and defaults are the contract. But for "please make this 25 fps" it does exactly one thing and does it well.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| input | VIDEO | — | |
| target_fps | FLOAT | 25.0001–240 | — |
| methodopt | COMBO | speed_change | 4 options: speed_change, frame_drop, frame_blend, minterpolate |
| audio_modeopt | COMBO | allow_shift | 4 options: allow_shift, preserve_pitch, copy, no_audio |
| crfopt | INT | 180–51 | — |
| minterpolate_qualityopt | COMBO | high | 4 options: fast, medium, high, best |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| output | VIDEO | — |