ComfyUI Node

Apply DynamiCrafter

What 'Apply DynamiCrafter' Actually Does

By ExponentialML·Created 2 years ago·Updated 2 years ago· 113
Apply DynamiCrafter
  • model
  • clip_vision
  • vae
  • image_proj_model
  • images
  • model
  • empty_latent
  • latent_img
use_interpolatefalse
fps15
frames16
scale_latentsfalse

DynamiCrafter's whole pitch is one line: give it a still image and it returns a short video of that image moving. This node - labeled "Apply DynamiCrafter" in the node picker - is the part that makes that happen inside a normal ComfyUI graph, no API, no key, no external Gradio app to babysit. It's also the one beginners bounce off, because it sits between a loader and a sampler and does its real work invisibly.

Quick honesty check before you fall in love: DynamiCrafter is a 2023 model (CUHK / Shanghai AI Lab), and by 2026 the i2v field moved on - Wan 2.2 + VACE does the same "animate my image" job with better quality and less VRAM pain. You reach for this pack when you specifically want DynamiCrafter's particular motion style, when you want to experiment with SD 2.1 ControlNets driving video, or when you want to see how a research model gets bolted onto ComfyUI's native machinery. That last one is genuinely instructive. The pack is a native port, not a wrapper: the model loads through ComfyUI's own model management and the UNet runs with ComfyUI's attention optimizations, so it behaves like any other checkpoint in the graph.

What the node actually does

The processor is the second half of a two-node flow. DynamiCrafterLoader hands you a model and an image_proj_model (a Perceiver-style Resampler that turns CLIP features into the model's conditioning tokens). This node takes those plus a clip_vision, a vae, and your images, then does three things:

  • VAE-encodes your input frame(s) into a latent that becomes the c_concat temporal conditioning - the thing that tells the UNet "these frames already exist."
  • Runs the first frame through CLIP Vision and the image projection model to get an image embedding, and runs a zero image through the same path for the uncond side of CFG.
  • Wraps the model's forward pass so all that conditioning gets injected during sampling. It even passes your fps value into the model as frame-rate conditioning, which is why that input exists at all.

The inputs and outputs that matter

The four model inputs (model, clip_vision, vae, image_proj_model) all come from loaders - model and image_proj_model from DynamiCrafterLoader, the other two from the standard CLIP and VAE loaders. The knobs you'll actually touch:

  • frames (default 16) - how many frames of video. In interpolation mode this is strictly capped at 16: the code raises a hard error, not a blurry result, if you exceed it.
  • fps (default 15) - the default is a trap for 256-based models; the README says their highest plausible value is 4. Crank it and motion looks wrong.
  • use_interpolate - on, you can batch two images and get a morph between them, or give it one frame and let it predict the rest.
  • scale_latents - the SVD-style latent rescaling trick ((image − 0.5) × 2, then ×1.3). Leave it off unless you're chasing a specific look.

The three outputs are where people get lost. model goes into a KSampler. empty_latent is a zero latent shaped exactly like your frame latent - feed that to the sampler for the "denoise from scratch but conditioned on the image" path. latent_img is the actual VAE-encoded frame - use it for img2img or as the mask target for inpainting (which this setup supports if you use the same frame count and resolution).

Installing it

ComfyUI Manager (search "ComfyUI Native DynamiCrafter") or the manual route:

cd ComfyUI/custom_nodes
git clone https://github.com/ExponentialML/ComfyUI_Native_DynamiCrafter.git

Then restart ComfyUI. There's no requirements.txt - the pack runs on ComfyUI's own torch/einops/yaml, so no extra pip deps to fight. The heavy lifting is downloads: the pruned UNet checkpoints live on HuggingFace at ExponentialML/DynamiCrafterUNet, and they go in models/dynamicrafter_models (where the loader looks). You also need the SD 2.1 CLIP, a VAE, and the OpenCLIP Vision model - all linked from that same HF page. One real gotcha: this is a rapid-release project, and the README itself warns that if main misbehaves you should use the pinned stable commit it links to.

Where people get burned

VRAM is the wall. The reference implementation's smallest model was reported eating ~20GB, and even pruned it stays heavy - 256 models on a 16GB card are the realistic starting point, not the 1024 ones. Interpolation past 16 frames errors out on purpose, so don't fight it. And if the loader's dropdown looks empty, your .safetensors aren't in models/dynamicrafter_models. The classic workflow file in the pack (dynamicrafter_512_interp_gen.json) is worth loading just to see the intended wiring. And if you're here for start-frame-to-end-frame interpolation specifically, Wan + VACE will serve you better - but for poking at a piece of video history through ComfyUI's own machinery, this is a clean way to do it.

CategoryNative_DynamiCrafter/Processing

Inputs (9)

NameTypeDefaultDescription
modelMODEL
clip_visionCLIP_VISION
vaeVAE
image_proj_modelIMAGE_PROJ_MODEL
imagesIMAGE
use_interpolateBOOLEANfalse
fpsINT151–30
framesINT16
scale_latentsBOOLEANfalse

Outputs (3)

NameTypeDescription
modelMODEL
empty_latentLATENT
latent_imgLATENT