{"id": "a7c0e3b9-9d2f-4a4b-8c6e-gmanski-frameinterp", "revision": 0, "last_node_id": 7, "last_link_id": 7, "nodes": [{"id": 1, "type": "MarkdownNote", "pos": [-1200, -300], "size": [580, 620], "flags": {}, "order": 0, "mode": 0, "inputs": [], "outputs": [], "properties": {"Node name for S&R": "MarkdownNote"}, "widgets_values": ["## Video Frame Interpolation (Gmanski)\n\n**Smooth out an existing video by generating in-between frames.** Works on any video, not just this pod's own output. Uses RIFE (Real-Time Intermediate Flow Estimation) via `ComfyUI-Frame-Interpolation`, already installed on this pod — no new custom node, no manifest download (RIFE fetches its own small checkpoint automatically the first time this runs).\n\n### Run it\n1. Upload the video to smooth on **Load Video** below.\n2. Queue. Find the result under `output/Gmanski/video_frame_interpolation_00001.mp4` — original audio carried through unchanged, at 2x the source's frame rate.\n\n### How it works\n`GetVideoComponents` splits the source into frames + audio + fps → `RIFE VFI` generates in-between frames (multiplier=2) → the new frame count is joined back into a video at `source_fps * 2` (computed at runtime, not a fixed number, so this works on whatever frame rate video you feed it) → original audio muxed back in unchanged.\n\n### First run needs internet\nRIFE downloads its own ~20MB checkpoint (`rife49.pth`) from a GitHub release the first time this template is used on a pod. After that it's cached.\n\n### Honest limitation\nRIFE estimates motion between frames — fast, chaotic motion (rapid cuts, heavy noise) can produce soft or warped in-between frames. Works best on smooth, continuous motion, which is most of what a video-diffusion model like MiniMax H3 already produces.\n\n### Cost\nTrivial — a small model, runs fast per-frame. No new pack to install.\n\n### Safety\nThis produces a local file only. Review it yourself before sharing it anywhere.\n"], "title": "Read me: Video Frame Interpolation (Gmanski)", "color": "#432", "bgcolor": "#653"}, {"id": 2, "type": "LoadVideo", "pos": [-600, -300], "size": [320, 100], "flags": {}, "order": 1, "mode": 0, "inputs": [{"name": "file", "type": "COMBO", "link": null, "widget": {"name": "file"}}], "outputs": [{"name": "video", "type": "VIDEO", "links": [1]}], "properties": {"Node name for S&R": "LoadVideo"}, "widgets_values": ["", "image"], "title": "Load Video (the video to smooth — click to upload)"}, {"id": 3, "type": "GetVideoComponents", "pos": [-220, -300], "size": [280, 130], "flags": {}, "order": 2, "mode": 0, "inputs": [{"name": "video", "type": "VIDEO", "link": 1}], "outputs": [{"name": "images", "type": "IMAGE", "links": [2]}, {"name": "audio", "type": "AUDIO", "links": [5]}, {"name": "fps", "type": "FLOAT", "links": [3]}, {"name": "bit_depth", "type": "COMBO", "links": []}, {"name": "color_space", "type": "COMBO", "links": []}], "properties": {"Node name for S&R": "GetVideoComponents"}, "widgets_values": [], "title": "Split into frames + audio + fps"}, {"id": 4, "type": "RIFE VFI", "pos": [-220, -100], "size": [320, 220], "flags": {}, "order": 3, "mode": 0, "inputs": [{"name": "frames", "type": "IMAGE", "link": 2}, {"name": "ckpt_name", "type": "COMBO", "link": null, "widget": {"name": "ckpt_name"}}, {"name": "clear_cache_after_n_frames", "type": "INT", "link": null, "widget": {"name": "clear_cache_after_n_frames"}}, {"name": "multiplier", "type": "INT", "link": null, "widget": {"name": "multiplier"}}, {"name": "fast_mode", "type": "BOOLEAN", "link": null, "widget": {"name": "fast_mode"}}, {"name": "ensemble", "type": "BOOLEAN", "link": null, "widget": {"name": "ensemble"}}, {"name": "scale_factor", "type": "COMBO", "link": null, "widget": {"name": "scale_factor"}}, {"name": "dtype", "type": "COMBO", "link": null, "widget": {"name": "dtype"}}, {"name": "torch_compile", "type": "BOOLEAN", "link": null, "widget": {"name": "torch_compile"}}, {"name": "batch_size", "type": "INT", "link": null, "widget": {"name": "batch_size"}}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [4]}], "properties": {"Node name for S&R": "RIFE VFI"}, "widgets_values": ["rife49.pth", 10, 2, true, true, 1.0, "float32", false, 1], "title": "RIFE frame interpolation (2x)"}, {"id": 5, "type": "ComfyMathExpression", "pos": [180, -220], "size": [300, 90], "flags": {}, "order": 4, "mode": 0, "inputs": [{"name": "values.a", "type": "FLOAT,INT,BOOLEAN", "link": 3}], "outputs": [{"name": "FLOAT", "type": "FLOAT", "links": [6]}, {"name": "INT", "type": "INT", "links": []}, {"name": "BOOL", "type": "BOOLEAN", "links": []}], "properties": {"Node name for S&R": "ComfyMathExpression"}, "widgets_values": ["a * 2"], "title": "Target fps (2x source)"}, {"id": 6, "type": "CreateVideo", "pos": [560, -220], "size": [280, 126], "flags": {}, "order": 5, "mode": 0, "inputs": [{"name": "images", "type": "IMAGE", "link": 4}, {"name": "audio", "type": "AUDIO", "link": 5}, {"name": "fps", "type": "FLOAT", "link": 6, "widget": {"name": "fps"}}, {"name": "bit_depth", "type": "COMBO", "link": null, "widget": {"name": "bit_depth"}}], "outputs": [{"name": "VIDEO", "type": "VIDEO", "links": [7]}], "properties": {"Node name for S&R": "CreateVideo"}, "widgets_values": [24, 8, "sRGB"], "title": "Join into a video (original audio, not re-encoded)"}, {"id": 7, "type": "SaveVideo", "pos": [920, -220], "size": [280, 200], "flags": {}, "order": 6, "mode": 0, "inputs": [{"name": "video", "type": "VIDEO", "link": 7}, {"name": "filename_prefix", "type": "STRING", "link": null, "widget": {"name": "filename_prefix"}}, {"name": "format", "type": "COMFY_DYNAMICCOMBO_V3", "link": null, "widget": {"name": "format"}}, {"name": "codec", "type": "COMFY_DYNAMICCOMBO_V3", "link": null, "widget": {"name": "codec"}}], "outputs": [], "properties": {"Node name for S&R": "SaveVideo"}, "widgets_values": ["Gmanski/video_frame_interpolation", "auto", "auto", "auto"], "title": "Save"}], "links": [[1, 2, 0, 3, 0, "VIDEO"], [2, 3, 0, 4, 0, "IMAGE"], [3, 3, 2, 5, 0, "FLOAT"], [4, 4, 0, 6, 0, "IMAGE"], [5, 3, 1, 6, 1, "AUDIO"], [6, 5, 0, 6, 2, "FLOAT"], [7, 6, 0, 7, 0, "VIDEO"]], "groups": [], "config": {}, "extra": {"ds": {"scale": 0.62, "offset": [1480, 420]}, "gmanski_template": "video-frame-interpolation", "generator": "scripts/build_video_frame_interpolation_workflow.py", "source": "https://gmanski.com/workflows/video-frame-interpolation"}, "version": 0.4}