Skip to content
,

MiniMax H3 to 1080p 60 FPS in ComfyUI: RIFE + SeedVR2 Upscale Workflow (Free Download)

12–18 minutes

MiniMax H3 renders at 24 fps and a short edge of around 768 pixels. That looks great in ComfyUI’s preview, but on YouTube or a big monitor you want a clean 1080p at 60 fps. No single node does both. Frame interpolation (RIFE) fixes the frame rate, and a video upscaler (SeedVR2) fixes the resolution. In this guide I show you a ready-made ComfyUI workflow that does both in one run, including a neat trick that gets you exactly 60 fps from 24 fps, which a plain RIFE multiplier cannot do. You can download the workflow JSON at the end, and every node name in it has been checked against the real node repositories.

TL;DR

  • RIFE changes fps, not resolution. Use RIFE VFI from ComfyUI-Frame-Interpolation for 60 fps and SeedVR2VideoUpscaler for 1080p.
  • The 60 fps trick: RIFE multiplier 5 turns 24 fps into 120 fps, then VHS_SelectEveryNthImage with 2 keeps every second frame, giving exactly 60 fps. A 124-frame clip becomes 308 frames.
  • Upscale: SeedVR2 3B fp8, resolution 1080, max resolution 1920, batch size 21 (must be 4n+1), then an ImageScale center crop to exactly 1920×1080.
  • Save: VHS_VideoCombine at 60 fps, h264, CRF 17, with H3’s original audio plugged in.
  • Needs about 32 GB of system RAM for a 5 second clip. A 16 GB GPU works with BlockSwap. Download the workflow.

Why 1080p 60 fps Needs Two Different Nodes

A lot of people search for “RIFE upscale”, but RIFE does not upscale anything. RIFE (Real-Time Intermediate Flow Estimation) looks at two neighbouring frames, estimates how every pixel moves, and draws new frames in between. The output has more frames at the same resolution. That is exactly what you want for smooth 60 fps motion, but your 1344×768 clip stays 1344×768.

For resolution you need an upscaler. You could use a classic image upscaler such as ESRGAN frame by frame, which is what my MiniMax H3 RIFE workflow uses for its 72 fps version. Image upscalers treat each frame on its own, though, so fine textures like hair, grass and skin can shimmer from frame to frame. SeedVR2 is different: it is a one-step diffusion video restoration model from ByteDance Seed that looks at batches of frames together, so detail stays consistent over time. It also cleans up compression noise and soft areas instead of just sharpening them. That makes it a better fit for AI video.

So the pipeline is: RIFE for frames, SeedVR2 for pixels, and Video Combine to save the result with audio.

The Exact 60 fps Trick: x5, Then Every 2nd Frame

RIFE VFI only accepts whole-number multipliers. From 24 fps, x2 gives 48 fps and x3 gives 72 fps. There is no x2.5, so you cannot reach 60 fps directly. Most guides either settle for 72 fps (which is fine on a 144 Hz screen but gets resampled on YouTube) or tell you to re-time the video in ffmpeg, which drops frames unevenly and adds judder.

The clean solution is simple maths. 24 x 5 = 120, and 120 / 2 = 60. So:

  1. Set RIFE VFI to multiplier 5. Your 24 fps clip becomes a perfectly even 120 fps sequence.
  2. Feed it into Select Every Nth Image from Video Helper Suite with select_every_nth = 2. You keep frames 0, 2, 4, 6 and so on.
  3. Save at 60 fps. Every output frame is still evenly spaced in time, so motion stays smooth with no judder.

I checked the frame count formula in the node’s source code: RIFE outputs (frames − 1) × multiplier + 1 frames. For a typical 124-frame H3 clip (about 5.2 seconds), that works out like this:

Exact 60 fps from a 24 fps MiniMax H3 clipFrame counts for a 124-frame (about 5.2 s) H3 clip at each step of the workflow.H3 output, 24 fps124After RIFE x5 (120 fps)616Every 2nd frame (60 fps)308RIFE output = (frames – 1) x multiplier + 1. 308 frames / 60 fps = 5.13 s.
Frame counts: 24 fps H3 clip to exact 60 fps with RIFE x5 and every second frame

308 frames at 60 fps is 5.13 seconds, against 5.17 seconds for the original. The difference is about one frame at the end, which you will not notice. The cost of this trick is that RIFE draws four in-between frames per pair and you throw two of them away, but RIFE is fast compared to the upscaler, so it barely changes the total time.

What You Need: Node Packs and Models

You need three custom node packs. All three install from ComfyUI Manager: search for the name, install, and restart.

Node pack Nodes used Models
ComfyUI-Frame-Interpolation RIFE VFI rife426.pth, downloaded automatically on first run to ComfyUI/custom_nodes/ComfyUI-Frame-Interpolation/ckpts/rife/
ComfyUI-VideoHelperSuite Select Every Nth Image, Video Combine None (needs ffmpeg, which it bundles via imageio-ffmpeg)
ComfyUI-SeedVR2_VideoUpscaler SeedVR2 (Down)Load DiT Model, SeedVR2 (Down)Load VAE Model, SeedVR2 Video Upscaler seedvr2_ema_3b_fp8_e4m3fn.safetensors and ema_vae_fp16.safetensors, downloaded automatically to ComfyUI/models/SEEDVR2/

The other nodes (Load Video, Get Video Components and Upscale Image) are built into ComfyUI. Make sure ComfyUI itself is up to date, because the native video nodes are fairly new.

Manual install (if you do not use Manager). Open a terminal in your ComfyUI folder and run the following. Use the same Python that runs ComfyUI: for the Windows portable build that is python_embeded/python.exe -m pip instead of pip.

cd ComfyUI/custom_nodes

# 1. RIFE frame interpolation
git clone https://github.com/Fannovel16/ComfyUI-Frame-Interpolation
cd ComfyUI-Frame-Interpolation
python install.py        # on Windows you can run install.bat instead
cd ..

# 2. Video Helper Suite
git clone https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite
pip install -r ComfyUI-VideoHelperSuite/requirements.txt

# 3. SeedVR2 video upscaler
git clone https://github.com/numz/ComfyUI-SeedVR2_VideoUpscaler.git seedvr2_videoupscaler
pip install -r seedvr2_videoupscaler/requirements.txt

After a restart, this is where everything lives:

Item Path
RIFE node pack ComfyUI/custom_nodes/ComfyUI-Frame-Interpolation/
RIFE model (auto-download) ComfyUI/custom_nodes/ComfyUI-Frame-Interpolation/ckpts/rife/rife426.pth
Video Helper Suite ComfyUI/custom_nodes/ComfyUI-VideoHelperSuite/
SeedVR2 node pack ComfyUI/custom_nodes/seedvr2_videoupscaler/
SeedVR2 DiT (auto-download) ComfyUI/models/SEEDVR2/seedvr2_ema_3b_fp8_e4m3fn.safetensors
SeedVR2 VAE (auto-download) ComfyUI/models/SEEDVR2/ema_vae_fp16.safetensors
Your H3 clip ComfyUI/input/ (or upload it in the Load Video node)
Finished 1080p 60 fps video ComfyUI/output/

If your PC is offline, download the two SeedVR2 files from numz/SeedVR2_comfyUI and put them in ComfyUI/models/SEEDVR2/ yourself.

Which SeedVR2 model? The node offers 3B and 7B models in fp16, fp8 and GGUF versions. The README’s guidance is fp16 for 24 GB or more, fp8 with BlockSwap for 12 to 16 GB, and GGUF Q4_K_M for 8 GB. I set the workflow to the 3B fp8 model because it fits a 16 GB card like my RTX 5080 comfortably. If you have a 24 GB or 32 GB card, try seedvr2_ema_7b_sharp_fp8_e4m3fn_mixed_block35_fp16.safetensors for extra detail. If you want the models offline, they are on Hugging Face at numz/SeedVR2_comfyUI.

The Workflow at a Glance

The workflow is a post-processing graph. You generate your clip with any H3 workflow first, then load the MP4 here. This keeps generation and upscaling in separate runs, which is much kinder to VRAM.

  1. Load Video: your 24 fps H3 clip.
  2. Get Video Components: splits it into frames, audio and fps.
  3. RIFE VFI, multiplier 5: 24 to 120 fps.
  4. Select Every Nth Image, every 2nd: 120 to 60 fps.
  5. SeedVR2 Video Upscaler with its DiT and VAE loaders: short edge to 1080.
  6. Upscale Image (ImageScale): center crop to exactly 1920×1080.
  7. Video Combine: saves an h264 MP4 at 60 fps with the original audio.

Node-by-Node Settings

RIFE VFI

  • ckpt_name: rife426.pth. The node itself labels RIFE 4.25 and newer as recommended. If you see odd warping, try rife49.pth.
  • multiplier: 5.
  • clear_cache_after_n_frames: 10 (the default). Lower it if you run out of VRAM.
  • fast_mode / ensemble: on / on. Fast mode does nothing on RIFE 4.5 and newer. Ensemble gives slightly better in-between frames.
  • scale_factor: 1.0 for 768p input.
  • dtype: float32. The node’s own notes say float16 is about twice as fast with half the VRAM, and bfloat16 is the safer reduced-precision choice on RTX 30 series and newer. Switch if speed matters more than the last bit of quality.
  • batch_size: 1. Raise it for more speed if you have spare VRAM.

Select Every Nth Image

select_every_nth = 2 and skip_first_images = 0. Do not skip the first frame, or the clip starts one frame late and the audio drifts.

SeedVR2 loaders

  • DiT model: seedvr2_ema_3b_fp8_e4m3fn.safetensors, device cuda:0, blocks_to_swap 16, offload device cpu, attention sdpa. BlockSwap moves part of the model to system RAM. Raise it to 32 if you hit out-of-memory errors, or set it to 0 on a 24 GB card for speed.
  • VAE model: ema_vae_fp16.safetensors, encode tiled on (tile 1024, overlap 128), decode tiled on (tile 768, overlap 128). These are the values from the official HD video example and they keep the VAE from spiking VRAM.

SeedVR2 Video Upscaler

  • resolution: 1080. This is the target for the short edge.
  • max_resolution: 1920, so the long edge never goes past full HD.
  • batch_size: 21. SeedVR2 needs 4n+1 values (5, 9, 13, 17, 21 …). Bigger batches give better temporal consistency but use more VRAM. The official example uses 33 on bigger cards.
  • uniform_batch_size: on, so the last batch is padded to the same size.
  • temporal_overlap: 3, which blends the joins between batches.
  • color_correction: lab (the default), which keeps colours matched to your H3 original.
  • seed: 42, fixed. Noise scales stay at 0.

Upscale Image (exact 1920×1080)

H3 wants width and height in multiples of 32, so a typical 1344×768 clip is 1.75:1, not exactly 16:9. SeedVR2 turns it into 1890×1080. The ImageScale node with lanczos, 1920 x 1080 and crop “center” scales it the last few pixels and trims a thin strip from the top and bottom. If you generated at an exact 16:9 size such as 1024×576, or you are happy with 1890×1080, bypass this node (select it and press Ctrl+B).

Video Combine

frame_rate 60, format video/h264-mp4, pix_fmt yuv420p, CRF 17. CRF 17 is close to visually lossless while keeping the file a reasonable size. The audio input is connected to the audio output of Get Video Components.

Why Interpolate Before Upscaling

You can put the two steps in either order, and I chose RIFE first on purpose.

  • System RAM. ComfyUI keeps every frame in RAM as 32-bit floats. At 1920×1080 a single frame is about 25 MB, so RIFE’s 120 fps buffer for a 5 second clip would need over 15 GB on its own if it ran after the upscale. At 1344×768 the same buffer is about half that.
  • RIFE is cheap at low resolution. Optical flow on 768p frames is fast and accurate.
  • SeedVR2 cleans up RIFE. Interpolated frames sometimes have soft or ghosted edges around fast motion. Because SeedVR2 is a restoration model, it sharpens and repairs those frames as it upscales them.

The downside is that SeedVR2 has to process 308 frames instead of 124, so the upscale takes about 2.5 times longer. If you have 64 GB or more of RAM and want the fastest render, swap the order: connect Get Video Components straight to SeedVR2, then SeedVR2 to RIFE, then RIFE to Select Every Nth Image.

16 GB GPU and System RAM Tips

  • Close the H3 workflow first. Running this in a fresh ComfyUI session frees the many gigabytes H3 itself holds.
  • System RAM: plan on 32 GB as a minimum for 5 second clips and 64 GB for longer ones. If Windows starts paging, everything slows to a crawl.
  • VRAM: raise blocks_to_swap first, then lower SeedVR2’s batch_size to 17 or 13, then lower the VAE tile sizes.
  • Long clips: split them. Swap in Video Helper Suite’s Load Video node, which has frame_load_cap and skip_first_frames options, or render 5 second sections and join them later.
  • Still out of memory? Switch to the GGUF seedvr2_ema_3b-Q4_K_M.gguf model. More H3-specific fixes are in my MiniMax H3 out of memory guide.

Keeping the H3 Audio in Sync

One of the best things about H3 is that it generates sound with the video. This workflow keeps it: Get Video Components passes the original audio straight to Video Combine. Because the 60 fps output covers the same time span as the 24 fps input (minus a fraction of a frame), lip sync and sound effects stay in place. Do not change the frame rate in Video Combine to anything other than 60, or the video will play faster or slower than the audio. If you ever see the end of the audio cut off, leave trim_to_audio off, which is the setting in the workflow.

Download the Workflow

Click the button to download minimax-h3-1080p-60fps-rife-seedvr2.json, then drag the file onto your ComfyUI canvas. You can also copy the JSON below and paste it straight into ComfyUI with Ctrl+V. If any nodes show up red, open ComfyUI Manager and click Install Missing Custom Nodes.

Show the workflow JSON
{"id":"4f0d3c1e-6a2b-4c8e-9b1a-0a3108060f05","revision":0,"last_node_id":10,"last_link_id":9,"nodes":[
{"id":1,"type":"LoadVideo","pos":[0,0],"size":[300,330],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[{"name":"VIDEO","type":"VIDEO","links":[1]}],"properties":{"Node name for S&R":"LoadVideo","cnr_id":"comfy-core"},"widgets_values":["minimax_h3_24fps.mp4","image"],"title":"1. Load your MiniMax H3 clip (24 fps)"},
{"id":2,"type":"GetVideoComponents","pos":[340,0],"size":[220,70],"flags":{},"order":1,"mode":0,"inputs":[{"name":"video","type":"VIDEO","link":1}],"outputs":[{"name":"images","type":"IMAGE","links":[2]},{"name":"audio","type":"AUDIO","links":[9]},{"name":"fps","type":"FLOAT","links":[]}],"properties":{"Node name for S&R":"GetVideoComponents","cnr_id":"comfy-core"},"widgets_values":[]},
{"id":3,"type":"RIFE VFI","pos":[600,0],"size":[320,320],"flags":{},"order":2,"mode":0,"inputs":[{"name":"frames","type":"IMAGE","link":2},{"name":"optional_interpolation_states","type":"INTERPOLATION_STATES","link":null,"shape":7}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[3]}],"properties":{"Node name for S&R":"RIFE VFI","cnr_id":"comfyui-frame-interpolation"},"widgets_values":["rife426.pth",10,5,true,true,1.0,"float32",false,1],"title":"2. RIFE x5 (24 to 120 fps)"},
{"id":4,"type":"VHS_SelectEveryNthImage","pos":[960,0],"size":[300,110],"flags":{},"order":3,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":3}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[6]},{"name":"count","type":"INT","links":[]}],"properties":{"Node name for S&R":"VHS_SelectEveryNthImage","cnr_id":"comfyui-videohelpersuite"},"widgets_values":[2,0],"title":"3. Keep every 2nd frame (120 to 60 fps)"},
{"id":5,"type":"SeedVR2LoadDiTModel","pos":[600,380],"size":[320,220],"flags":{},"order":4,"mode":0,"inputs":[{"name":"torch_compile_args","type":"TORCH_COMPILE_ARGS","link":null,"shape":7}],"outputs":[{"name":"SEEDVR2_DIT","type":"SEEDVR2_DIT","links":[4]}],"properties":{"Node name for S&R":"SeedVR2LoadDiTModel","aux_id":"numz/ComfyUI-SeedVR2_VideoUpscaler"},"widgets_values":["seedvr2_ema_3b_fp8_e4m3fn.safetensors","cuda:0",16,false,"cpu",false,"sdpa"]},
{"id":6,"type":"SeedVR2LoadVAEModel","pos":[600,640],"size":[320,300],"flags":{},"order":5,"mode":0,"inputs":[{"name":"torch_compile_args","type":"TORCH_COMPILE_ARGS","link":null,"shape":7}],"outputs":[{"name":"SEEDVR2_VAE","type":"SEEDVR2_VAE","links":[5]}],"properties":{"Node name for S&R":"SeedVR2LoadVAEModel","aux_id":"numz/ComfyUI-SeedVR2_VideoUpscaler"},"widgets_values":["ema_vae_fp16.safetensors","cuda:0",true,1024,128,true,768,128,"false","cpu",false]},
{"id":7,"type":"SeedVR2VideoUpscaler","pos":[960,380],"size":[320,400],"flags":{},"order":6,"mode":0,"inputs":[{"name":"image","type":"IMAGE","link":6},{"name":"dit","type":"SEEDVR2_DIT","link":4},{"name":"vae","type":"SEEDVR2_VAE","link":5}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[7]}],"properties":{"Node name for S&R":"SeedVR2VideoUpscaler","aux_id":"numz/ComfyUI-SeedVR2_VideoUpscaler"},"widgets_values":[42,"fixed",1080,1920,21,true,"lab",3,0,0.0,0.0,"cpu",false],"title":"4. SeedVR2 upscale to 1080p"},
{"id":8,"type":"ImageScale","pos":[1320,380],"size":[280,130],"flags":{},"order":7,"mode":0,"inputs":[{"name":"image","type":"IMAGE","link":7}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[8]}],"properties":{"Node name for S&R":"ImageScale","cnr_id":"comfy-core"},"widgets_values":["lanczos",1920,1080,"center"],"title":"5. Exact 1920x1080 (bypass if not needed)"},
{"id":9,"type":"VHS_VideoCombine","pos":[1640,0],"size":[340,600],"flags":{},"order":8,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":8},{"name":"audio","type":"AUDIO","link":9,"shape":7},{"name":"meta_batch","type":"VHS_BatchManager","link":null,"shape":7},{"name":"vae","type":"VAE","link":null,"shape":7}],"outputs":[{"name":"Filenames","type":"VHS_FILENAMES","links":[]}],"properties":{"Node name for S&R":"VHS_VideoCombine","cnr_id":"comfyui-videohelpersuite"},"widgets_values":{"frame_rate":60,"loop_count":0,"filename_prefix":"MiniMaxH3_1080p60","format":"video/h264-mp4","pix_fmt":"yuv420p","crf":17,"save_metadata":true,"trim_to_audio":false,"pingpong":false,"save_output":true,"videopreview":{"hidden":false,"paused":false,"params":{}}},"title":"6. Save 1080p 60 fps MP4 with audio"},
{"id":10,"type":"Note","pos":[0,380],"size":[540,300],"flags":{},"order":9,"mode":0,"inputs":[],"outputs":[],"properties":{"Node name for S&R":"Note"},"widgets_values":["MiniMax H3 to 1080p 60 fps (freakyjolly.com)\n\n1. Load a 24 fps H3 clip (e.g. 1344x768, 124 frames).\n2. RIFE VFI multiplier 5 gives 120 fps: (124-1)*5+1 = 616 frames.\n3. Select every 2nd frame: 308 frames = 60 fps exactly.\n4. SeedVR2 upscales the short edge to 1080 (max 1920).\n5. ImageScale center-crops to exactly 1920x1080.\n6. Video Combine saves at 60 fps with the original audio.\n\n16 GB GPU: 3B fp8 model, blocks_to_swap 16 (raise to 32 on OOM), batch_size 21 (must be 4n+1).\nRAM: 32 GB minimum, 64 GB recommended for 5 s clips.\nNeeds: ComfyUI-Frame-Interpolation, ComfyUI-VideoHelperSuite, ComfyUI-SeedVR2_VideoUpscaler."]}
],
"links":[[1,1,0,2,0,"VIDEO"],[2,2,0,3,0,"IMAGE"],[3,3,0,4,0,"IMAGE"],[4,5,0,7,1,"SEEDVR2_DIT"],[5,6,0,7,2,"SEEDVR2_VAE"],[6,4,0,7,0,"IMAGE"],[7,7,0,8,0,"IMAGE"],[8,8,0,9,0,"IMAGE"],[9,2,1,9,1,"AUDIO"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.75,"offset":[50,50]}},"version":0.4}

After loading, click the Load Video node and choose your H3 clip. The models download automatically on the first run, so the first job takes longer.

Connect It Directly to Your H3 Workflow

If you have plenty of VRAM and RAM and want one-click renders, you can bolt this graph onto the end of your generation workflow instead of loading an MP4:

  1. Open your H3 workflow, for example my text-to-video, image-to-video or reference-to-video workflow.
  2. Paste in every node from this workflow except Load Video and Get Video Components.
  3. Connect the IMAGE output of your VAE Decode to RIFE VFI’s frames input.
  4. Connect the decoded audio to Video Combine’s audio input.

On a 16 GB card I recommend keeping the two-stage approach. H3 and SeedVR2 both want a lot of memory, and running them back to back in one job is the quickest way to an out-of-memory error. A Turbo LoRA makes the generation stage fast enough that the two-step routine is no real hassle.

Troubleshooting

  • Red nodes after loading: install the three node packs with Manager’s “Install Missing Custom Nodes”, then restart ComfyUI.
  • Video plays too fast or too slow: check that Video Combine’s frame_rate is 60 and Select Every Nth is 2. A multiplier of 5 with every 2nd frame is the only combination that gives exact 60 fps from 24 fps.
  • SeedVR2 error about batch size: use a 4n+1 value such as 13, 17, 21 or 33.
  • Flicker between batches: raise temporal_overlap to 4 or 5, or use a bigger batch_size.
  • Colours shifted after upscaling: keep color_correction on lab, or try wavelet.
  • Warping on fast motion: switch RIFE to rife49.pth, or turn ensemble on if you turned it off.
  • Everything is extremely slow: you are probably out of system RAM and paging to disk. Shorten the clip or add RAM.

FAQ

Can RIFE upscale video to 1080p?

No. RIFE only adds frames. It keeps the input resolution. For 1080p you need an upscaler such as SeedVR2 or an ESRGAN-style model.

Should I use 60 fps or 72 fps?

Use 60 fps for YouTube, social media and most monitors, since 60 is the standard frame rate there. 72 fps (RIFE x3) is simpler and fine for local viewing on high refresh rate screens. My 72 fps RIFE workflow covers that route.

Why not RIFE x2 to 48 fps and then speed it up?

Changing the playback rate also changes the duration, so the video would no longer match H3’s audio. The x5 and every-2nd method keeps the timing exact.

Can I go to 4K instead?

Yes. Set SeedVR2’s resolution to 2160 and max resolution to 3840, and ImageScale to 3840×2160. It needs a lot more VRAM, RAM and time, so test with a short clip first.

Does ComfyUI have a built-in frame interpolation node?

Yes, newer ComfyUI versions include native frame interpolation nodes. RIFE VFI is used here because it is well tested and gives full control over the checkpoint and precision.

Does this work for Wan, LTX or other video models?

Yes. The workflow only sees an MP4, so it works for any 24 fps clip. For a 30 fps source, use multiplier 2 without the Select Every Nth step.

Final Thoughts

Getting MiniMax H3 to a proper 1080p 60 fps comes down to using the right tool for each job: RIFE for smooth motion, SeedVR2 for real detail, and a bit of frame maths to land exactly on 60 fps. The downloadable workflow handles all of it in one run, keeps the H3 audio, and fits a 16 GB GPU with BlockSwap. Generate your clip, load it, press Queue, and you have a YouTube-ready file.

More MiniMax H3 guides:

Sources