RTX Frame Generation
Turn 12 fps into 24 on your NVIDIA card, then remember to fix the encoder
- images
- images
Frame interpolation is the cheap rung of video work, and it's the one everybody eventually wants: your clip generates at 12 or 16 fps because that's what the model gives you, and it looks like stop-motion. Doubling the frame count smooths it out without re-generating a single pixel.
RTX Frame Generation (DaSiWa_RTX_FrameGeneration) does that on NVIDIA's Video Effects SDK - the same hardware path behind the RTX upscalers everyone compared against SeedVR2 earlier this year and mostly preferred, for being fast and not looking synthetic. Unlike an ESRGAN pass, this is temporal interpolation: it reads two finished frames and synthesises what belongs between them.
What's actually happening
The node hands consecutive frame pairs to the SDK's VideoFrameGeneration effect and writes the generated frames between them. Two modes, and they are genuinely different jobs:
frame rate multiplierinserts M−1 frames per pair, giving(N-1)*M+1frames out for N in. Every original frame survives untouched, and both endpoints are preserved exactly. This is the mode you want 95% of the time.specific timestepinserts one frame per pair at a fractional position from 0.01 to 0.99, giving2*N-1frames. Only 0.5 is uniformly spaced; anything else produces unequal gaps that a constant-FPS encoder can't represent, and the node logs a warning rather than pretending otherwise.
The SDK returns borrowed output buffers, so the node copies and synchronises each generated frame before calling the effect again - boring plumbing that keeps frames from getting clobbered. It also uses blocking default-stream calls on purpose: the pack's own testing reproduced SDK error −12 with non-default streams, and it chose correctness over async throughput. One nice touch: a single-frame batch passes straight through without touching CUDA or loading the SDK, so a one-image test won't fail on a missing driver.
Inputs, and the two you'll get wrong
images wants an ordered IMAGE batch of decoded frames - Get Video Components output, a VHS loader, anything that produces frames. It is not a native VIDEO object, and the node has no FPS and no audio sockets. Decode upstream, route audio separately.
multiplier (2–16, default 2) is the knob, active only in multiplier mode. mode is the SDK quality preset - LOW, MEDIUM, HIGH, default HIGH - and these are frame-generation presets, not VSR levels; there's no promised speed or quality figure, it depends on your card and how much motion is in frame. automatic_shot_change_detection is on by default, which is what you want: a hard cut between two frames is a case where interpolation invents a cross-fade nobody asked for. shot_change is a separate blunt override that marks every submitted pair as a cut - it's for a single pair, not a list of cut indices.
device_id picks the CUDA device. image_encoding is 8-bit RGB, with 10-bit RGB (RGB10A2) offered only when your installed SDK supports it - 10-bit SDR precision, not HDR, and it doesn't make the IMAGE tensor smaller. Alpha is discarded, period.
Output is a single images IMAGE batch - one wire, into Enhanced Video Combine or any encoder.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/darksidewalker/ComfyUI-DaSiWa-Nodes
cd ComfyUI-DaSiWa-Nodes && pip install -r requirements.txt
Manager search is DaSiWa-Nodes; restart after. The pack as a whole asks for an NVIDIA RTX GPU with drivers 530+, and this node specifically needs nvidia-vfx installed with VideoFrameGeneration support - which is exactly the nvidia-vfx line in the requirements file. On Windows you may also need the NVIDIA Broadcast SDK; on Linux the pip package usually just works. If your SDK predates the feature, the node says so plainly and refuses to run rather than silently degrading, and nothing auto-installs for you. It's a one-author pack - darksidewalker, the DaSiWa handle behind the Wan 2.2 video workflows on Civitai - and the video-pipeline bias shows.
Where people get burned
The encoder FPS. This is the one that ruins an otherwise perfect run. The node can't tell your encoder anything, so after a 2× multiplier you have to set the encode FPS to source × M yourself. Forget it and your clip plays at half speed with beautiful smooth motion. Same logic for specific timestep at 0.5 - encode at source FPS × 2. And note the arithmetic: because the last original frame is retained rather than duplicated, container duration can end up one frame interval off.
Memory is not constant. The node stages the previous frame, the current frame and one SDK output, and it budgets VRAM then RAM for the full output batch - but your input and output batches still live in memory and may get cached by ComfyUI. Bounded processing, not streaming. use_mmap is off by default and is the last-resort disk tier if neither VRAM nor RAM can hold the result; it needs room for the whole output, so turn it on knowingly.
Multipliers compound fast. 16× on a 5-second clip at 24 fps means thousands of frames through the encoder and a file nobody needs. 2× is the sane default, 4× is a deliberate choice. And don't ask for non-midpoint timesteps and then complain - a constant-FPS container cannot hold unequal intervals.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | Ordered IMAGE batch: still images or decoded video frames, not a VIDEO object. RGB only; alpha discarded. No FPS, timestamps or audio are passed through. | |
| generation_type | COMBO | frame rate multiplier: evenly insert M-1 frames per pair, output (N-1)*M+1; encode at source FPS*M. specific timestep: insert one frame per pair, output 2*N-1; only 0.5 is uniformly spaced (encode at source FPS*2). Both preserve endpoints; container duration can differ by a final frame interval. | |
| multiplier | INT | 22–16 | Active only for frame rate multiplier: M subdivisions per source interval, M-1 generated frames per pair. Output (N-1)*M+1; set encoder FPS to source FPS*M. Ignored for specific timestep. |
| timestep | FLOAT | 0.500.01–0.99 | Active only for specific timestep: fractional position between previous (0) and next (1) source frame. 0.5 is the midpoint; other values produce unequal temporal spacing that a constant-FPS IMAGE encoder cannot reproduce exactly. Ignored for multiplier mode. |
| mode | COMBO | HIGH | SDK interpolation quality preset: LOW favors speed, MEDIUM is the middle tier, HIGH favors quality. These are frame-generation modes, not VSR levels; cost and visual quality depend on SDK, GPU and content, with no fixed speed or quality guarantee. |
| automatic_shot_change_detection | BOOLEAN | true | On: ask the SDK to detect cuts automatically between source frames. Off: disable automatic detection; the separate shot_change flag still applies. Cut handling is SDK-defined, not a per-frame cut list. |
| shot_change | BOOLEAN | false | On: explicitly mark every submitted source pair as a cut (useful for a single pair). Off: do not force cuts; automatic detection can still apply. This is not a list of cut indices. |
| device_id | INT | 00–8 | CUDA device index for NVIDIA interpolation (0 is the first GPU). Must identify an available supported NVIDIA device; does not choose encoder or audio device. |
| image_encodingopt | COMBO | 8-bit RGB | 8-bit RGB: default SDK encoding, retains source floating output dtype. 10-bit RGB (RGB10A2): packed 10-bit SDR SDK processing, float32 output; not HDR or smaller IMAGE storage. Original frames are copied directly. |
| auto_unload_modelsopt | BOOLEAN | true | On: reclaim targeted GPU memory and, under RAM output pressure, native execution caches and model pins; re-check before allocation. Off: no reclamation. Never resets the running executor or globally offloads GPU models into RAM. Native cache eviction requires ComfyUI RAM-pressure cache support; full batches still need storage. |
| use_mmapopt | BOOLEAN | false | Off: never allocate disk output. On: allow a temporary mmap as the last output tier if budgeted VRAM/RAM cannot fit the complete IMAGE batch. Requires disk space for the full output; not streaming input/output. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |