TL;DR — the pipeline. Restore/upscale the real frames first, then interpolate to raise fps, then encode. The default recipe: downscale → SeedVR2 → RIFE → VHS encode. The comfyui-mcp agent can wire this graph for you from your own Claude session — jump to one-command setup.
The three jobs (and why order matters)
“Upscaling video” in ComfyUI is really three separate tasks, and the quality win comes from doing them in this order:- Spatial restore + upscale — a temporal-aware model that raises resolution and cleans compression blocks, blur, and AI-gen mush while keeping frames consistent frame-to-frame.
- Frame interpolation (VFI) — synthesize in-between frames to raise fps (e.g. 24→48/60) for smooth motion. Do this after the spatial pass.
- Encode — mux the frames (plus the original audio) back to an MP4.
SeedVR2 vs FlashVSR vs per-frame ESRGAN
The two leading temporal restorers in 2026 are SeedVR2 (a
diffusion-transformer restorer — the proven workhorse) and FlashVSR (a newer
one-step streaming VSR — faster). A plain image upscaler (ESRGAN, UltimateSDUpscale
per-frame) does this badly: each frame is sharpened independently, so the output
flickers — most visibly on water and fine detail. Reach for a video model when
quality (or zero flicker) matters.
The downscale-first trick (the part everyone skips)
The single most counterintuitive step: downscale the video before you restore it. Feeding a restorer a small, clean frame is better than feeding it a big dirty one:- The restorer wants clean low-res input, not a big noisy one. SeedVR2 and FlashVSR regenerate detail. A small frame forces the model to synthesize sharp, coherent texture instead of faithfully magnifying compression artifacts. Downscaling averages away block noise first.
- VRAM + speed headroom. Cost scales with input pixels × frames. Halving each dimension is ~4× fewer pixels per frame — that headroom buys you a larger temporal batch (the thing that kills flicker) and a bigger target multiple.
- It turns “upscale” into “restore-and-upscale.” A 720p source downscaled to 360p then SeedVR2’d to 1080p+ looks dramatically better than 720p→1080p straight, because the model rebuilds rather than stretches.
SeedVR2 — the recommended restore stage
Pack:ComfyUI-SeedVR2_VideoUpscaler (author numz) — installable via
ComfyUI-Manager / the registry by that name. It exposes four nodes:
The models come in 3B (lighter) and 7B (best quality) tiers, in fp16, fp8,
and GGUF builds, and auto-download to
models/SEEDVR2/ on first run — so the
first generation stalls while it pulls multi-GB weights. Start with the 3B fp8
build; it’s the speed/quality sweet spot for most footage. Move to 7B only when
you need maximum reconstruction on faces/text and have the VRAM (or run the 7B GGUF
with block swap).
The settings that matter
With SeedVR2 you don’t pick a literal “2x/4x” — you set the target short-edge
resolution and the effective factor falls out of input vs target size.
FlashVSR — the faster alternative
Pack:ComfyUI-FlashVSR (author 1038lab), built on FlashVSR V1.1 —
one-step diffusion with locality-constrained sparse attention and a tiny conditional
decoder. Models auto-download from Hugging Face (1038lab/FlashVSR) to
models/FlashVSR/ on first run. (Several community forks exist; the 1038lab pack
is the cleanest two-node implementation — pick a fork only if you need its specific
VRAM tricks.)
It has two nodes — FlashVSR ⚡ (preset: Fast / Balanced / High Quality) and
FlashVSR Advanced ⚡ (model_version Tiny / Tiny Long / Full, plus tiling,
speed optimization, quality boost, and SageAttention). It supports 2x and 4x
(4x recommended) and needs ≥21 input frames. SageAttention adds ~20–30% speed.
When to prefer FlashVSR: real-time / long clips / speed-critical jobs, or when
SeedVR2 is too slow on your hardware. Prefer SeedVR2 when you want the strongest
restoration of badly-degraded footage and can spend the time.
The quick local path — per-frame ESRGAN (no downloads)
When you just want a fast result on what’s already installed — no multi-GB SeedVR2 / FlashVSR download — use the ESRGAN upscale models most setups already have. Check first (common ones:4x_foolhardy_Remacri, best for realistic
footage / water / skin, and 4x-ClearRealityV1 for clean/sharp).
- Upscale:
ImageUpscaleWithModelwith a 4× ESRGAN model, thenImageScaleback down to a clean 2× — a 4×→2× supersample. That downscale-after step is the single biggest quality lever here: it averages out per-frame noise. - Interpolate: the built-in
FrameInterpolatewith RIFE v4.26 (below).
⚠️ The tradeoff is flicker. ESRGAN upscalers are per-frame — no temporal awareness — so they can shimmer on video, most visibly on water and fine detail. The 4×→2× supersample mitigates it; if it still shimmers, that’s your signal to switch the upscale stage to a temporal model (SeedVR2 / FlashVSR) — the real fix. So: per-frame ESRGAN = quick & local; SeedVR2 = flicker-free & best. Order is unchanged: upscale the real frames first, then interpolate.
Frame interpolation — RIFE (and FILM)
Built-in (ComfyUI 0.26+) — prefer this, no custom node
Current ComfyUI ships a core frame interpolator: the nodesFrameInterpolationModelLoader + FrameInterpolate (RIFE/FILM). On
0.26+ you do NOT install a custom node. It auto-detects checkpoints dropped in
models/frame_interpolation/ — that folder is empty by default, which is
why the model dropdown looks blank. Core-compatible weights live at HF
Comfy-Org/frame_interpolation:
Drop a file into
models/frame_interpolation/ and restart so the dropdown
populates (ComfyUI caches model lists). Pull it directly into that folder — a
generic download_model may not target it.
Custom node (more methods / pre-0.26)
ComfyUI-Frame-Interpolation (author Fannovel16) adds methods the core node
lacks — GMFSS, STMFNet, FLAVR, IFRNet, and the original RIFE VFI (4.0 - 4.9) node
(use rife47 / rife49). Reach for it only when you need one of those methods or
you’re on a ComfyUI older than 0.26.
RIFE vs FILM, and getting the fps right
Default to RIFE (smooth, fast, great on normal motion). Reach for FILM when RIFE smears fast or large-motion gaps. The multiplier is integer:multiplier = target_fps / source_fps — 24→48 is 2; 24→96 is 4. Use 2 for
the standard “double the smoothness” pass.
Then fix the encoder fps. After interpolation, set the encode node’s fps to
source_fps × multiplier, not the source fps — otherwise the video plays in
slow motion.
2x vs 4x
- 2x — the safest default; pairs with the downscale-first trick (downscale 0.5×, then 2x back recovers original size but restored). Lower VRAM, fewer artifacts.
- 4x — for genuinely small sources or a big jump; FlashVSR’s recommended factor. Costs ~4× the pixels — expect to enable VAE tiling / block swap.
VRAM tiers
General: downscale first to buy a bigger batch; always clear VRAM before
switching model families; reduce frame/batch counts first when you OOM.
Troubleshooting
- Output flickers/shimmers. The #1 video-upscale failure. Cause: per-frame
(non-temporal) upscaling, or too-small a SeedVR2
batch_size. Fix: use a temporal model (SeedVR2 / FlashVSR), raisebatch_sizeto the next4n+1up, and don’t downscale so hard the model has nothing to lock onto frame-to-frame. - Frame-count errors. SeedVR2
batch_sizemust be4n+1; FlashVSR needs ≥21 frames; STMFNet/FLAVR interpolation need ≥4 frames. A clip shorter than the batch/min will error or degrade. - Color shift / brightness drift after restore. Common with diffusion restorers.
Don’t over-downscale; if it persists, do a color-match pass against the source
before encode and check pixel format (
yuv420p) at encode. - Audio is gone. Core
SaveVideo/CreateVideodrop audio. UseVHS_VideoCombine(ComfyUI-VideoHelperSuite) and feed it theaudiofromGetVideoComponents/VHS_LoadVideoto keep the original track. - Video plays in slow motion. Set the encoder fps to
source_fps × multiplier, not the source fps. CreateVideo/SaveVideo/VHS_VideoCombine: “ffmpeg could not be found.” The mux needs ffmpeg in the ComfyUI venv:<comfy-venv>/python -m pip install imageio-ffmpeg, then restart.- First generation hangs forever. SeedVR2 and FlashVSR weights auto-download on first run — the first job stalls while it pulls multi-GB weights. Expected.
- RIFE dropdown is blank.
models/frame_interpolation/is empty by default. Droprife_v4.26.safetensorsin and restart.
FAQ
What’s the best ComfyUI video upscaler in 2026? For quality, a temporal restorer — SeedVR2 for the strongest restoration, FlashVSR when you need speed. A per-frame ESRGAN upscaler is the quick local option but flickers. Why does my upscaled video flicker? You’re upscaling each frame independently (per-frame ESRGAN) or your SeedVR2batch_size is too small. Switch to a temporal
model and raise the batch to the next 4n+1.
Why downscale before upscaling? Restorers regenerate detail. A clean small frame
forces the model to synthesize sharp texture instead of magnifying compression
artifacts — and it buys VRAM/batch headroom. Skip it only for already-clean sources.
Do I need a custom node for RIFE? Not on ComfyUI 0.26+ — FrameInterpolate is
built in. Just drop rife_v4.26.safetensors into models/frame_interpolation/. Use
the Fannovel16 pack only for extra methods or older ComfyUI.
RIFE or FILM? RIFE by default; FILM for large/fast motion gaps RIFE smears.
Do SeedVR2 / FlashVSR models download automatically? Yes — both pull weights on
first run (to models/SEEDVR2/ and models/FlashVSR/). The first generation stalls
during the download.
Get it running in one command
Cloning the SeedVR2 / FlashVSR / interpolation nodes and wiring a correct downscale → restore → interpolate → encode graph is exactly the busywork comfyui-mcp removes. From a Claude Code session with the plugin installed, ask your agent to build the video-upscale pipeline — it installs the nodes (ComfyUI-SeedVR2_VideoUpscaler, ComfyUI-Frame-Interpolation,
ComfyUI-VideoHelperSuite, optionally ComfyUI-FlashVSR), drops the right
interpolation weights in place, and wires the graph in the correct order. SeedVR2 and
FlashVSR weights auto-download on first run, so there’s little to pre-fetch.
Then drive the live graph from your own session via the Panel — downscale
factor, target resolution, batch size, and RIFE multiplier, tuned conversationally
with no extra API keys.
That’s the whole point of the project: expert ComfyUI setups that install in one step
and drive themselves from your own agent session.