Video Upscaling & Restoration

Upscale and restore video in ComfyUI.

How to install

How to install

  1. Setup differs for this server — follow the Installation part of the README below.
  2. Claude Code: claude mcp add <name> -- <command>.
  3. Claude Desktop / Cursor: add it under mcpServers in the MCP config file.
Claude Code — installs the whole folder, not just SKILL.md
npx degit artokun/comfyui-mcp/plugin/skills/video-upscale#main ~/.claude/skills/video-upscale

For one project only, change the path to .claude/skills/video-upscale. This skill also uses pack.yaml — copying SKILL.md alone won't be enough. See the folder on GitHub.

This one runs on your machine and can reach your files. Read the README below before you connect it.

Not working?
  • Check which app you pasted it into — the steps above name the right one.
  • Some skills need the paid tier of Claude or ChatGPT.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Show the full text336 lines
video-upscale/SKILL.md336 lines16.8 KBpushed 27d agoRawView on GitHub

Video Upscaling & Restoration

Overview

"Upscaling video" in ComfyUI splits into three jobs, and the quality win comes from doing them in the right order:

  1. Spatial restore + upscale. A temporal-aware model that increases resolution AND cleans compression blocks, blur, and AI-gen mush while keeping frames consistent over time. This is the part a plain image upscaler (ESRGAN, UltimateSDUpscale per-frame) does badly. Per-frame upscalers flicker because each frame is sharpened independently. Use a video model.
  2. Frame interpolation (VFI). Synthesize in-between frames to raise fps (e.g. 24→48/60) for smooth motion. Do this after the spatial pass.
  3. Encode. Mux frames (plus original audio) back to an MP4.

The two leading temporal restorers in 2026 are SeedVR2 (diffusion-transformer restorer, the proven workhorse) and FlashVSR (newer one-step streaming VSR, faster). Frame interpolation is RIFE (or FILM) via ComfyUI-Frame-Interpolation.

Verification note: every node/pack/model name below was confirmed against the GitHub repos and the ComfyUI registry / Manager as of June 2026. Where a name is approximate or version-dependent it is flagged. Do not substitute a node you can't confirm is installed. Check with install_custom_node (action: "list") / create_workflow (action:"node_info").


⭐ Recommended current pipeline (2026)

Downscale → SeedVR2 (temporal restore+upscale) → RIFE (interpolate) → VHS encode. This modernizes the user's classic recipe (below) with the current SeedVR2 node pack and is the path to ship by default. FlashVSR is the faster alternative for the restore stage (see "FlashVSR" section). Swap it in when speed matters more than absolute fidelity.

Node-graph sketch

LoadVideo  ─► GetVideoComponents ─► (IMAGE frames, audio, fps)
                       │
                       ▼
        ImageScaleBy / ImageScale   ◄── DOWNSCALE first (e.g. 0.5×) — clean,
                       │                  small input for the restorer
                       ▼
        SeedVR2 Video Upscaler  ◄── DiT model + VAE + (block swap) + (tiling)
           ├─ "SeedVR2 (Down)Load DiT Model"
           ├─ "SeedVR2 (Down)Load VAE Model"
           └─ ["SeedVR2 Torch Compile Settings"]  (optional speedup)
                       │  (restored, high-res frames)
                       ▼
        RIFE VFI (4.0 - 4.9)   ◄── multiplier 2 (e.g. 24→48 fps)
                       │
                       ▼
        CreateVideo (fps = source × multiplier) ─► SaveVideo
        — or — VHS_VideoCombine (carries audio passthrough)

LoadVideo / GetVideoComponents / CreateVideo / SaveVideo are core ComfyUI video nodes (same ones the official comfy.org SeedVR2 template uses). VHS_LoadVideo / VHS_VideoCombine come from ComfyUI-VideoHelperSuite (installed) and are preferred for the final encode because they pass the original audio through.

Why downscale FIRST (the load-bearing trick)

  • The restorer wants a clean low-res input, not a big dirty one. SeedVR2 (and FlashVSR) regenerate detail. Feeding them a small frame forces the model to synthesize sharp detail rather than faithfully magnifying existing compression artifacts and noise. Downscaling first averages away block noise, so the restorer hallucinates clean, coherent texture.
  • VRAM and speed headroom. Cost scales with input pixels × frames. Halving each dimension is ~4× fewer pixels per frame, which buys you a larger temporal batch (the thing that kills flicker, see below) and a bigger target multiple.
  • It turns "upscale" into "restore-and-upscale." A 720p source downscaled to 360p then SeedVR2'd to 1080p+ looks much better than 720p→1080p straight, because the model rebuilds rather than stretches.
  • Rule of thumb: downscale to 0.5× (or to a ~360 to 480p short side) for messy, low-bitrate, or AI-gen footage; skip the downscale for already-clean, high-bitrate sources where you only want more pixels.

Quick local path (no downloads) — per-frame ESRGAN + built-in RIFE

When the user wants a fast result on what's already installed (no SeedVR2 / FlashVSR multi-GB download), use the ESRGAN upscale models most setups already have. Check first with list_local_models (common ones: 4x_foolhardy_Remacri, the best for realistic footage/water/skin, and 4x-ClearRealityV1 for clean/sharp).

  • Upscale: ImageUpscaleWithModel with a 4× ESRGAN model, then ImageScale back 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 FrameInterpolate with RIFE v4.26 (see the Frame-interpolation section; no custom node on 0.26+).

Tradeoff: flicker. ESRGAN upscalers are per-frame (no temporal awareness), so they can shimmer or flicker on video, most visible on water and fine detail. The 4×→2× supersample mitigates it; if it still shimmers, that's the signal to switch the upscale stage to a temporal model (SeedVR2 / FlashVSR below), which is the real fix. So: per-frame ESRGAN = quick and local; SeedVR2 = flicker-free and best. Order is unchanged: upscale the real frames first, then interpolate.

This is the right default for a "do it now, locally" request; reach for the temporal restorers below when quality (or zero flicker) matters more than turnaround.


SeedVR2 (recommended restore stage)

Pack: ComfyUI-SeedVR2_VideoUpscaler (author numz), GitHub numz/ComfyUI-SeedVR2_VideoUpscaler, installable via ComfyUI-Manager / registry by that name. Install with panel_install_node or apply_manifest.

Node classes (4):

Node Role
SeedVR2 (Down)Load DiT Model loads the diffusion-transformer restorer (auto-downloads on first use)
SeedVR2 (Down)Load VAE Model loads ema_vae_fp16.safetensors
SeedVR2 Torch Compile Settings optional — torch.compile for speed
SeedVR2 Video Upscaler the main node: takes frames + DiT + VAE → restored frames

Models (auto-download to models/SEEDVR2/; 3B = lighter, 7B = best quality):

File Tier
seedvr2_ema_3b_fp16.safetensors 3B full precision
seedvr2_ema_3b_fp8_e4m3fn.safetensors 3B fp8 (mid VRAM)
seedvr2_ema_3b-Q4_K_M.gguf / -Q8_0.gguf 3B GGUF (low VRAM)
seedvr2_ema_7b_fp16.safetensors 7B full quality
seedvr2_ema_7b_fp8_e4m3fn_mixed_block35_fp16.safetensors 7B fp8
seedvr2_ema_7b-Q4_K_M.gguf (+ _sharp variants) 7B GGUF
ema_vae_fp16.safetensors shared VAE

Key params on "SeedVR2 Video Upscaler":

Param Meaning / recommended
resolution target SHORT edge in pixels (not a ratio). Default 1080. Set the short side of your output (e.g. 1080 for 1080p-class).
batch_size frames processed together. Must be 4n+1 (1, 5, 9, 13, 17, 21…). Higher = less temporal flicker but more VRAM. 5 is the default; push to 13–45 if VRAM allows for smoother results.
seed default 42; fixed for reproducibility
blocks_to_swap 0–32 (3B) / 0–36 (7B). >0 offloads transformer blocks to CPU to cut VRAM (slower). Use max (32/36) on 8 GB.
VAE tiling enable + set encode/decode tile size to fit the VAE step in low VRAM

3B vs 7B: start with 3B fp8. 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 use the 7B GGUF + block swap).


FlashVSR (newer SOTA — faster restore stage)

Pack: ComfyUI-FlashVSR (author 1038lab), GitHub 1038lab/ComfyUI-FlashVSR, built on FlashVSR V1.1 (one-step diffusion + locality-constrained sparse attention + tiny conditional decoder). Manager name ComfyUI-FlashVSR. Models auto-download from HF 1038lab/FlashVSR to models/FlashVSR/ on first run.

Note: several community forks exist (smthemex/ComfyUI_FlashVSR, lihaoyun6/ComfyUI-FlashVSR_Ultra_Fast, naxci1/ComfyUI-FlashVSR_Stable). The 1038lab pack is the cleanest two-node implementation; pick a fork only if you need its specific VRAM tricks.

Node classes: FlashVSR ⚡ (preset: Fast / Balanced / High Quality) and FlashVSR Advanced ⚡ (model_version = Tiny / Tiny Long / Full, enable_tiling, speed_optimization, quality_boost, sageattention). Supports 2x and 4x (4x recommended). Needs ≥21 input frames. Variants: Full (best, heavy VRAM), Tiny (fast), Tiny Long (low VRAM). SageAttention adds ~20 to 30% speed.

When to prefer FlashVSR over SeedVR2: real-time, long clips, or 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.


Frame interpolation (VFI)

Built-in (ComfyUI 0.26+) — PREFER this, no custom node needed

Current ComfyUI ships a core frame interpolator, nodes FrameInterpolationModelLoader + FrameInterpolate (RIFE/FILM), so 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 (under a frame_interpolation/ subpath):

File ~Size Use
rife_v4.26.safetensors 22 MB RIFE, newest/most accurate — default for smooth small-motion fps-doubling
film_net_fp16.safetensors 66 MB FILM — large-motion gaps

Drop a file into models/frame_interpolation/ and restart so the dropdown populates (ComfyUI caches model lists). download_model may not target that folder; pull it directly into models/frame_interpolation/. Check what's there with list_local_models / the core node's dropdown before installing anything.

Custom node (more methods / pre-0.26 ComfyUI)

Pack: ComfyUI-Frame-Interpolation (author Fannovel16), GitHub Fannovel16/ComfyUI-Frame-Interpolation. Manager-installable by that name. Reach for it only when you need methods the core node lacks (GMFSS, STMFNet, FLAVR, IFRNet…) or you're on a ComfyUI older than 0.26.

Primary node: RIFE VFI (4.0 - 4.9)

Param Meaning / recommended
ckpt_name RIFE weights rife40rife49. rife47 / rife49 are the recommended ones.
multiplier integer fps multiple. multiplier = target_fps / source_fps (24→48 = 2; 24→96 = 4). Use 2 for the standard "double the smoothness" pass.
clear_cache_after_n_frames lower it (e.g. 10) if you OOM on long clips
fast_mode no effect from RIFE 4.5+ (contextnet removed) — leave default
ensemble slightly higher quality, slower

After interpolation, set the encode node's fps to source_fps × multiplier so playback speed is unchanged (only smoother).

Alternatives in the same pack: FILM VFI (Google FILM, strong on large motion, heavier), plus GMFSS Fortuna VFI, STMFNet VFI/FLAVR VFI (these last two need ≥4 input frames), IFRNet, M2M, AMT, etc. There is no "GIMM-VFI" node in this pack. If a workflow asks for GIMM-VFI it's a separate custom node; verify it's installed before citing it. Default to RIFE; reach for FILM when RIFE smears fast motion.

About "RIFE 56"

The user's "RIFE 56" is shorthand, not a RIFE model version. RIFE in this pack tops out at 4.9 (rife49). It almost certainly means RIFE targeting ~56 fps (i.e. a multiplier chosen so the output lands near 56 fps, e.g. 24 fps × 2 ≈ 48, or a ~2.3× target), or a RIFE-resample node that takes a target fps directly. Map it to RIFE VFI (4.0 - 4.9), ckpt rife47/rife49, multiplier = round(56 / source_fps) (multiplier 2 from 24/25/30 fps). Confirm the intended output fps with the user rather than chasing a non-existent "RIFE 56" model.


2x vs 4x

  • 2x is the safest default; it pairs with the downscale-first trick (downscale 0.5×, then 2x back recovers original size but restored). Lower VRAM, fewer artifacts.
  • 4x is for small sources or when you need a big jump; FlashVSR's recommended factor. Costs ~4× the pixels, so expect VAE tiling / block swap.
  • 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.

VRAM tiers

VRAM SeedVR2 FlashVSR Interp / encode
8 GB or less 3B GGUF Q4_K_M + blocks_to_swap = max + VAE tiling; small batch (1–5) Tiny Long + enable_tiling RIFE multiplier 2; low clear_cache_after_n_frames; encode in chunks
12–16 GB 3B/7B fp8 + some block swap or VAE tiling; batch 5–13 Tiny or Full + tiling RIFE 2–4×; ensemble off
24 GB+ 7B fp16 (or 3B fp16), no offload; batch 13–45 for max temporal stability Full at 4x RIFE 2–4× + ensemble; FILM if needed

General: downscale first to buy a bigger batch; always clear_vram before switching model families; reduce frame/batch counts first when you OOM.


Gotchas

  • Temporal flicker is 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), raise batch_size (next 4n+1 up), and don't downscale so hard the model has nothing to lock onto frame-to-frame.
  • Frame-count constraints: SeedVR2 batch_size must be 4n+1; FlashVSR needs ≥21 frames; STMFNet/FLAVR interp need ≥4 frames. A clip shorter than the batch/min will error or degrade.
  • Color shift / brightness drift after restore is common with diffusion restorers. Mitigate: don't over-downscale; if it persists, do a color-match pass against the source (e.g. an essentials/ImageBlend-style match) before encode, and check pixel format (yuv420p) at encode.
  • Audio passthrough: core SaveVideo/CreateVideo drop audio. Use VHS_VideoCombine (VideoHelperSuite) and feed it the audio from GetVideoComponents / VHS_LoadVideo to keep the original track.
  • fps after interpolation: set the encoder fps to source_fps × multiplier, not the source fps, or the video plays in slow motion.
  • ffmpeg is required for muxing (same as the LTX skill): if CreateVideo / SaveVideo / VHS_VideoCombine error with "ffmpeg could not be found", run <comfy-venv>/python -m pip install imageio-ffmpeg and reboot.
  • Models auto-download on first run for SeedVR2 and FlashVSR. The first generation stalls while it pulls multi-GB weights; that's expected.
  • Order matters: restore/upscale BEFORE interpolation. Interpolating first then upscaling doubles the restorer's workload and can lock in interpolation smear.

Classic baseline (the user's proven recipe)

The user's older, battle-tested pipeline, still solid, is:

DOWNSCALE the video first → SeedVR2 → RIFE ("RIFE 56").

That is exactly the structure the recommended 2026 pipeline above preserves: downscale-first to give the restorer clean input and VRAM headroom, SeedVR2 for the temporal restore/upscale, RIFE for the fps bump. The only modernizations:

  • Use the current ComfyUI-SeedVR2_VideoUpscaler node pack (4-node: DiT loader + VAE loader + [torch compile] + upscaler) with the 3B fp8 model as the default and batch_size raised for temporal stability.
  • Read "RIFE 56" as RIFE targeting ~56 fps (a multiplier, typically 2 from 24/25/30 fps), using rife47/rife49, not a literal model version.
  • Consider FlashVSR as a faster drop-in for the SeedVR2 stage when speed matters more than maximum fidelity.

Packs

No dedicated video-upscale installer pack ships yet. To build one (see the installer-packs skill), the manifest's custom_nodes[] should pull numz/ComfyUI-SeedVR2_VideoUpscaler, Fannovel16/ComfyUI-Frame-Interpolation, and Kosinkadink/ComfyUI-VideoHelperSuite (already installed), optionally 1038lab/ComfyUI-FlashVSR. SeedVR2 and FlashVSR weights auto-download on first run, so models[] can be left light; record that in pack.yaml. Install nodes ad-hoc with panel_install_node or apply a manifest with apply_manifest. Offer to contribute a finished pack upstream (github.com/artokun/comfyui-mcp).

Sources

  • Official: none found.
  • Empirical: sampler values, wiring, and prompt notes from working graphs in packs/ and observed renders; not a vendor prompting guide.
1---
2name: video-upscale
3description: Upscale and restore video in ComfyUI. Both the quick local path (per-frame ESRGAN like 4x_foolhardy_Remacri via ImageUpscaleWithModel + 4x→2x supersample, with its temporal-flicker tradeoff) and temporal-aware super-resolution (SeedVR2, the newer FlashVSR) with the downscale-first restore pipeline; RIFE/FILM frame interpolation via the BUILT-IN ComfyUI 0.26 FrameInterpolate (rife_v4.26 in models/frame_interpolation/) or the ComfyUI-Frame-Interpolation pack; 2x/4x scaling, VRAM tiers, VHS encode. Captures the classic downscale→SeedVR2→RIFE recipe and the current 2026 recommendation.
4globs:
5 - "**/*.json"
6 - "**/packs/**"
7---
8 
9# Video Upscaling & Restoration
10 
11## Overview
12 
13"Upscaling video" in ComfyUI splits into three jobs, and the quality win comes
14from doing them in the right order:
15 
161. Spatial restore + upscale. A temporal-aware model that increases
17 resolution AND cleans compression blocks, blur, and AI-gen mush while
18 keeping frames consistent over time. This is the part a plain image upscaler
19 (ESRGAN, UltimateSDUpscale per-frame) does badly. Per-frame upscalers
20 flicker because each frame is sharpened independently. Use a video model.
212. Frame interpolation (VFI). Synthesize in-between frames to raise fps
22 (e.g. 24→48/60) for smooth motion. Do this after the spatial pass.
233. Encode. Mux frames (plus original audio) back to an MP4.
24 
25The two leading temporal restorers in 2026 are SeedVR2 (diffusion-transformer
26restorer, the proven workhorse) and FlashVSR (newer one-step streaming VSR,
27faster). Frame interpolation is RIFE (or FILM) via
28ComfyUI-Frame-Interpolation.
29 
30> Verification note: every node/pack/model name below was confirmed against the
31> GitHub repos and the ComfyUI registry / Manager as of June 2026. Where a name is
32> approximate or version-dependent it is flagged. Do not substitute a node you
33> can't confirm is installed. Check with `install_custom_node` (`action: "list"`) / `create_workflow (action:"node_info")`.
34 
35---
36 
37## ⭐ Recommended current pipeline (2026)
38 
39Downscale → SeedVR2 (temporal restore+upscale) → RIFE (interpolate) → VHS encode.
40This modernizes the user's classic recipe (below) with the current SeedVR2 node
41pack and is the path to ship by default. FlashVSR is the faster alternative for
42the restore stage (see "FlashVSR" section). Swap it in when speed matters more
43than absolute fidelity.
44 
45### Node-graph sketch
46 
47```
48LoadVideo ─► GetVideoComponents ─► (IMAGE frames, audio, fps)
49
50
51 ImageScaleBy / ImageScale ◄── DOWNSCALE first (e.g. 0.5×) — clean,
52 │ small input for the restorer
53
54 SeedVR2 Video Upscaler ◄── DiT model + VAE + (block swap) + (tiling)
55 ├─ "SeedVR2 (Down)Load DiT Model"
56 ├─ "SeedVR2 (Down)Load VAE Model"
57 └─ ["SeedVR2 Torch Compile Settings"] (optional speedup)
58 │ (restored, high-res frames)
59
60 RIFE VFI (4.0 - 4.9) ◄── multiplier 2 (e.g. 24→48 fps)
61
62
63 CreateVideo (fps = source × multiplier) ─► SaveVideo
64 — or — VHS_VideoCombine (carries audio passthrough)
65```
66 
67`LoadVideo` / `GetVideoComponents` / `CreateVideo` / `SaveVideo` are core
68ComfyUI video nodes (same ones the official comfy.org SeedVR2 template uses).
69`VHS_LoadVideo` / `VHS_VideoCombine` come from ComfyUI-VideoHelperSuite
70(installed) and are preferred for the final encode because they pass the original
71audio through.
72 
73### Why downscale FIRST (the load-bearing trick)
74 
75- The restorer wants a clean low-res input, not a big dirty one. SeedVR2
76 (and FlashVSR) regenerate detail. Feeding them a small frame forces the model
77 to synthesize sharp detail rather than faithfully magnifying existing
78 compression artifacts and noise. Downscaling first averages away block noise,
79 so the restorer hallucinates clean, coherent texture.
80- VRAM and speed headroom. Cost scales with input pixels × frames. Halving each
81 dimension is ~4× fewer pixels per frame, which buys you a larger temporal
82 batch (the thing that kills flicker, see below) and a bigger target multiple.
83- It turns "upscale" into "restore-and-upscale." A 720p source downscaled to
84 360p then SeedVR2'd to 1080p+ looks much better than 720p→1080p
85 straight, because the model rebuilds rather than stretches.
86- Rule of thumb: downscale to 0.5× (or to a ~360 to 480p short side) for messy,
87 low-bitrate, or AI-gen footage; skip the downscale for already-clean,
88 high-bitrate sources where you only want more pixels.
89 
90---
91 
92## Quick local path (no downloads) — per-frame ESRGAN + built-in RIFE
93 
94When the user wants a fast result on what's already installed (no SeedVR2 /
95FlashVSR multi-GB download), use the ESRGAN upscale models most setups already have.
96Check first with `list_local_models` (common ones: `4x_foolhardy_Remacri`, the best
97for realistic footage/water/skin, and `4x-ClearRealityV1` for clean/sharp).
98 
99- Upscale: `ImageUpscaleWithModel` with a 4× ESRGAN model, then `ImageScale`
100 back down to a clean 2× (a 4×→2× supersample). That downscale-after step is
101 the single biggest quality lever here. It averages out per-frame noise.
102- Interpolate: the built-in `FrameInterpolate` with RIFE v4.26 (see the
103 Frame-interpolation section; no custom node on 0.26+).
104 
105> **Tradeoff: flicker.** ESRGAN upscalers are per-frame (no temporal
106> awareness), so they can shimmer or flicker on video, most visible on water and
107> fine detail. The 4×→2× supersample mitigates it; if it still shimmers, that's the
108> signal to switch the upscale stage to a temporal model (SeedVR2 / FlashVSR
109> below), which is the real fix. So: per-frame ESRGAN = quick and local; SeedVR2 =
110> flicker-free and best. Order is unchanged: upscale the real frames first, then
111> interpolate.
112 
113This is the right default for a "do it now, locally" request; reach for the temporal
114restorers below when quality (or zero flicker) matters more than turnaround.
115 
116---
117 
118## SeedVR2 (recommended restore stage)
119 
120Pack: `ComfyUI-SeedVR2_VideoUpscaler` (author numz), GitHub
121`numz/ComfyUI-SeedVR2_VideoUpscaler`, installable via ComfyUI-Manager / registry
122by that name. Install with `panel_install_node` or `apply_manifest`.
123 
124Node classes (4):
125 
126| Node | Role |
127|---|---|
128| **SeedVR2 (Down)Load DiT Model** | loads the diffusion-transformer restorer (auto-downloads on first use) |
129| **SeedVR2 (Down)Load VAE Model** | loads `ema_vae_fp16.safetensors` |
130| **SeedVR2 Torch Compile Settings** | optional — torch.compile for speed |
131| **SeedVR2 Video Upscaler** | the main node: takes frames + DiT + VAE → restored frames |
132 
133Models (auto-download to `models/SEEDVR2/`; 3B = lighter, 7B = best quality):
134 
135| File | Tier |
136|---|---|
137| `seedvr2_ema_3b_fp16.safetensors` | 3B full precision |
138| `seedvr2_ema_3b_fp8_e4m3fn.safetensors` | 3B fp8 (mid VRAM) |
139| `seedvr2_ema_3b-Q4_K_M.gguf` / `-Q8_0.gguf` | 3B GGUF (low VRAM) |
140| `seedvr2_ema_7b_fp16.safetensors` | 7B full quality |
141| `seedvr2_ema_7b_fp8_e4m3fn_mixed_block35_fp16.safetensors` | 7B fp8 |
142| `seedvr2_ema_7b-Q4_K_M.gguf` (+ `_sharp` variants) | 7B GGUF |
143| `ema_vae_fp16.safetensors` | shared VAE |
144 
145Key params on "SeedVR2 Video Upscaler":
146 
147| Param | Meaning / recommended |
148|---|---|
149| **resolution** | **target SHORT edge in pixels** (not a ratio). Default 1080. Set the short side of your output (e.g. 1080 for 1080p-class). |
150| **batch_size** | frames processed together. **Must be `4n+1`** (1, 5, 9, 13, 17, 21…). **Higher = less temporal flicker** but more VRAM. 5 is the default; push to 13–45 if VRAM allows for smoother results. |
151| **seed** | default 42; fixed for reproducibility |
152| **blocks_to_swap** | 0–32 (3B) / 0–36 (7B). >0 offloads transformer blocks to CPU to cut VRAM (slower). Use max (32/36) on 8 GB. |
153| **VAE tiling** | enable + set encode/decode tile size to fit the VAE step in low VRAM |
154 
1553B vs 7B: start with 3B fp8. It's the speed/quality sweet spot for most
156footage. Move to 7B only when you need maximum reconstruction on faces/text
157and have the VRAM (or use the 7B GGUF + block swap).
158 
159---
160 
161## FlashVSR (newer SOTA — faster restore stage)
162 
163Pack: `ComfyUI-FlashVSR` (author 1038lab), GitHub `1038lab/ComfyUI-FlashVSR`,
164built on FlashVSR V1.1 (one-step diffusion + locality-constrained sparse
165attention + tiny conditional decoder). Manager name `ComfyUI-FlashVSR`. Models
166auto-download from HF `1038lab/FlashVSR` to `models/FlashVSR/` on first run.
167 
168> Note: several community forks exist (`smthemex/ComfyUI_FlashVSR`,
169> `lihaoyun6/ComfyUI-FlashVSR_Ultra_Fast`, `naxci1/ComfyUI-FlashVSR_Stable`).
170> The `1038lab` pack is the cleanest two-node implementation; pick a fork only if
171> you need its specific VRAM tricks.
172 
173Node classes: `FlashVSR ⚡` (preset: Fast / Balanced / High Quality) and
174`FlashVSR Advanced ⚡` (`model_version` = Tiny / Tiny Long / Full,
175`enable_tiling`, `speed_optimization`, `quality_boost`, `sageattention`).
176Supports 2x and 4x (4x recommended). Needs ≥21 input frames. Variants:
177Full (best, heavy VRAM), Tiny (fast), Tiny Long (low VRAM).
178SageAttention adds ~20 to 30% speed.
179 
180When to prefer FlashVSR over SeedVR2: real-time, long clips, or speed-critical
181jobs, or when SeedVR2 is too slow on your hardware. Prefer SeedVR2 when you
182want the strongest restoration of badly-degraded footage and can spend the time.
183 
184---
185 
186## Frame interpolation (VFI)
187 
188### Built-in (ComfyUI 0.26+) — PREFER this, no custom node needed
189 
190Current ComfyUI ships a core frame interpolator, nodes
191`FrameInterpolationModelLoader` + `FrameInterpolate` (RIFE/FILM), so on
1920.26+ you do NOT install a custom node. It auto-detects checkpoints dropped in
193`models/frame_interpolation/` (that folder is empty by default, which is why
194the model dropdown looks blank). Core-compatible weights live at HF
195`Comfy-Org/frame_interpolation` (under a `frame_interpolation/` subpath):
196 
197| File | ~Size | Use |
198|---|---|---|
199| **`rife_v4.26.safetensors`** | 22 MB | RIFE, newest/most accurate — default for smooth small-motion fps-doubling |
200| **`film_net_fp16.safetensors`** | 66 MB | FILM — large-motion gaps |
201 
202Drop a file into `models/frame_interpolation/` and restart so the dropdown
203populates (ComfyUI caches model lists). `download_model` may not target that folder;
204pull it directly into `models/frame_interpolation/`. Check what's there with
205`list_local_models` / the core node's dropdown before installing anything.
206 
207### Custom node (more methods / pre-0.26 ComfyUI)
208 
209Pack: `ComfyUI-Frame-Interpolation` (author Fannovel16), GitHub
210`Fannovel16/ComfyUI-Frame-Interpolation`. Manager-installable by that name. Reach for
211it only when you need methods the core node lacks (GMFSS, STMFNet, FLAVR, IFRNet…) or
212you're on a ComfyUI older than 0.26.
213 
214Primary node: `RIFE VFI (4.0 - 4.9)`
215 
216| Param | Meaning / recommended |
217|---|---|
218| **ckpt_name** | RIFE weights `rife40``rife49`. **rife47 / rife49 are the recommended ones.** |
219| **multiplier** | integer fps multiple. **`multiplier = target_fps / source_fps`** (24→48 = 2; 24→96 = 4). Use **2** for the standard "double the smoothness" pass. |
220| **clear_cache_after_n_frames** | lower it (e.g. 10) if you OOM on long clips |
221| **fast_mode** | no effect from RIFE 4.5+ (contextnet removed) — leave default |
222| **ensemble** | slightly higher quality, slower |
223 
224After interpolation, set the encode node's fps to source_fps × multiplier so
225playback speed is unchanged (only smoother).
226 
227Alternatives in the same pack: `FILM VFI` (Google FILM, strong on large
228motion, heavier), plus `GMFSS Fortuna VFI`, `STMFNet VFI`/`FLAVR VFI` (these last
229two need ≥4 input frames), `IFRNet`, `M2M`, `AMT`, etc. There is no
230"GIMM-VFI" node in this pack. If a workflow asks for GIMM-VFI it's a separate
231custom node; verify it's installed before citing it. Default to RIFE; reach
232for FILM when RIFE smears fast motion.
233 
234### About "RIFE 56"
235 
236The user's "RIFE 56" is shorthand, not a RIFE model version. RIFE in this
237pack tops out at 4.9 (`rife49`). It almost certainly means RIFE targeting
238~56 fps (i.e. a multiplier chosen so the output lands near 56 fps, e.g.
23924 fps × 2 ≈ 48, or a ~2.3× target), or a RIFE-resample node that takes a target
240fps directly. Map it to `RIFE VFI (4.0 - 4.9)`, ckpt `rife47`/`rife49`,
241multiplier = round(56 / source_fps) (multiplier 2 from 24/25/30 fps). Confirm
242the intended output fps with the user rather than chasing a non-existent
243"RIFE 56" model.
244 
245---
246 
247## 2x vs 4x
248 
249- 2x is the safest default; it pairs with the downscale-first trick (downscale 0.5×,
250 then 2x back recovers original size but restored). Lower VRAM, fewer artifacts.
251- 4x is for small sources or when you need a big jump; FlashVSR's
252 recommended factor. Costs ~4× the pixels, so expect VAE tiling / block swap.
253- With SeedVR2 you don't pick a literal "2x/4x"; you set the target short-edge
254 `resolution` and the effective factor falls out of input vs target size.
255 
256---
257 
258## VRAM tiers
259 
260| VRAM | SeedVR2 | FlashVSR | Interp / encode |
261|---|---|---|---|
262| **8 GB or less** | 3B **GGUF Q4_K_M** + **blocks_to_swap = max** + VAE tiling; small batch (1–5) | **Tiny Long** + `enable_tiling` | RIFE multiplier 2; low `clear_cache_after_n_frames`; encode in chunks |
263| **12–16 GB** | 3B/7B **fp8** + some block swap or VAE tiling; batch 5–13 | **Tiny** or Full + tiling | RIFE 2–4×; ensemble off |
264| **24 GB+** | **7B fp16** (or 3B fp16), no offload; batch 13–45 for max temporal stability | **Full** at 4x | RIFE 2–4× + ensemble; FILM if needed |
265 
266General: downscale first to buy a bigger batch; always `clear_vram` before
267switching model families; reduce frame/batch counts first when you OOM.
268 
269---
270 
271## Gotchas
272 
273- **Temporal flicker** is the #1 video-upscale failure. Cause: per-frame
274 (non-temporal) upscaling or too-small a SeedVR2 `batch_size`. Fix: use a
275 temporal model (SeedVR2/FlashVSR), raise `batch_size` (next `4n+1` up), and
276 don't downscale so hard the model has nothing to lock onto frame-to-frame.
277- **Frame-count constraints**: SeedVR2 `batch_size` must be `4n+1`;
278 FlashVSR needs ≥21 frames; STMFNet/FLAVR interp need ≥4 frames. A clip
279 shorter than the batch/min will error or degrade.
280- **Color shift / brightness drift** after restore is common with diffusion
281 restorers. Mitigate: don't over-downscale; if it persists, do a color-match
282 pass against the source (e.g. an essentials/`ImageBlend`-style match) before
283 encode, and check pixel format (`yuv420p`) at encode.
284- **Audio passthrough**: core `SaveVideo`/`CreateVideo` drop audio. Use
285 `VHS_VideoCombine` (VideoHelperSuite) and feed it the `audio` from
286 `GetVideoComponents` / `VHS_LoadVideo` to keep the original track.
287- **fps after interpolation**: set the encoder fps to `source_fps × multiplier`,
288 not the source fps, or the video plays in slow motion.
289- **ffmpeg** is required for muxing (same as the LTX skill): if `CreateVideo` /
290 `SaveVideo` / `VHS_VideoCombine` error with "ffmpeg could not be found", run
291 `<comfy-venv>/python -m pip install imageio-ffmpeg` and reboot.
292- **Models auto-download on first run** for SeedVR2 and FlashVSR. The first
293 generation stalls while it pulls multi-GB weights; that's expected.
294- **Order matters**: restore/upscale BEFORE interpolation. Interpolating first
295 then upscaling doubles the restorer's workload and can lock in interpolation
296 smear.
297 
298---
299 
300## Classic baseline (the user's proven recipe)
301 
302The user's older, battle-tested pipeline, still solid, is:
303 
304> DOWNSCALE the video first → SeedVR2 → RIFE ("RIFE 56").
305 
306That is exactly the structure the recommended 2026 pipeline above preserves:
307downscale-first to give the restorer clean input and VRAM headroom, SeedVR2 for the
308temporal restore/upscale, RIFE for the fps bump. The only modernizations:
309 
310- Use the current `ComfyUI-SeedVR2_VideoUpscaler` node pack (4-node:
311 DiT loader + VAE loader + [torch compile] + upscaler) with the 3B fp8 model
312 as the default and `batch_size` raised for temporal stability.
313- Read "RIFE 56" as RIFE targeting ~56 fps (a multiplier, typically 2
314 from 24/25/30 fps), using `rife47`/`rife49`, not a literal model version.
315- Consider FlashVSR as a faster drop-in for the SeedVR2 stage when speed
316 matters more than maximum fidelity.
317 
318---
319 
320## Packs
321 
322No dedicated `video-upscale` installer pack ships yet. To build one
323(see the `installer-packs` skill), the manifest's `custom_nodes[]` should pull
324`numz/ComfyUI-SeedVR2_VideoUpscaler`, `Fannovel16/ComfyUI-Frame-Interpolation`,
325and `Kosinkadink/ComfyUI-VideoHelperSuite` (already installed), optionally
326`1038lab/ComfyUI-FlashVSR`. SeedVR2 and FlashVSR weights auto-download on first
327run, so `models[]` can be left light; record that in `pack.yaml`. Install nodes
328ad-hoc with `panel_install_node` or apply a manifest with
329`apply_manifest`. Offer to contribute a finished pack upstream
330(`github.com/artokun/comfyui-mcp`).
331 
332## Sources
333 
334- **Official:** none found.
335- **Empirical:** sampler values, wiring, and prompt notes from working graphs in `packs/` and observed renders; not a vendor prompting guide.
336 

Discussion

Alternatives

Also in Illustration & art