MotifVideo Image Encode
The bridge from a still image to a moving video
- positive
- negative
- vae
- image
- latent
- positive
- negative
Motif-Video 2B isn't just a text-to-video model - it does image-to-video too, and this is the node that makes it work. MotifImageEncode sits between your text conditioning and KSampler, takes your start image, VAE-encodes it into latent space, and tucks it into the conditioning as concat_latent_image. Downstream, KSampler sees an ordinary conditioning pair. The image becomes the first frame, and the sampler animates forward from it. That's the whole trick, and it's why this is the node that separates a T2V graph from an I2V graph: you add it, you get image-to-video; you delete it, you're back to pure text-to-video.
What it does
The node takes your conditioning pair plus a VAE, an image, and a latent, then does three things in order. First it figures out the target resolution from the latent - the latent's spatial dims times 8, since the VAE downsamples space 8x. Then it resizes your image to that footprint, aspect-ratio-preserving with a center crop, so the pixel and latent shapes line up. Finally it VAE-encodes the RGB channels and sets concat_latent_image on both the positive and negative conditionings. Temporal padding and the first-frame mask are handled inside the pack's model code, not here.
The output is the same positive and negative CONDITIONING pair you fed in, just carrying the image now. Wire it into KSampler and you're done.
The inputs
All five are required, and they form a little ecosystem:
- positive / negative - the CONDITIONING pair from
MotifVideo Text Encode. - vae - the
VAEfromLoad MotifVideo VAE. Must be the Motif-Video VAE; a mismatched VAE encodes into a latent space the sampler doesn't understand. - image - your start image, from core
LoadImage. Any image works, but it gets center-cropped to match your latent's aspect ratio. - latent - the
LATENTfromEmptyMotifLatent. Use the same latent you feed KSampler; the image is sized to match it, so this latent is what fixes both the output resolution and the frame count.
Outputs are positive and negative CONDITIONING, straight into KSampler.
Installing it
Pack-wide install, same as the other four nodes:
cd ComfyUI/custom_nodes
git clone https://github.com/MotifTechnologies/ComfyUI-MotifVideo2B.git
pip install -r ComfyUI-MotifVideo2B/requirements.txt
Manager search won't list the pack until the upstream registration PR lands (it's planned but not merged), and the Git-URL install path is gated by Manager's security_level - the clone is the path that reliably works. The example I2V workflow points LoadImage at i2v_sample.jpg, so copy assets/i2v_sample.jpg from the repo into ComfyUI/input/ (or point it at your own image). Loading the example on recent ComfyUI will offer to download the three weight files for you.
Where people get burned
- Aspect ratio surprises. The image is center-cropped to match your latent. Feed it a 16:9 image with a 1:1 latent and you'll lose the edges - not a bug, just geometry. Match your image to your latent's aspect ratio and crop it yourself if you care what survives.
- Feeding a different latent than KSampler. The image gets resized to this latent's footprint. If you hand this node one latent and KSampler another, the shapes disagree and you get either an error or a glitchy start frame. One latent, both nodes.
- Expecting the image to do nothing. The whole point is the first frame, so don't reuse the same image for unrelated generations - it anchors everything that follows. This is also why you shouldn't skip the negative prompt branch: both conditionings get the image injected, and a CFG-of-8 workflow will lean on the negative path.
- The T2V/I2V swap. To go back to pure text-to-video, remove this node and wire
MotifVideo Text Encodestraight into KSampler. Nothing else in the graph changes.
One light take to close: for a model this heavy - H200-class VRAM, --highvram recommended, ~30s/step at 1280×736 and 121 frames - the image-to-video path is the one that feels most like magic per second of footage, because the hard part (composition) is already solved by your start frame. This node is the small piece of code that makes that possible, and it's worth understanding before you start blaming the sampler for bad first frames.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| vae | VAE | — | |
| image | IMAGE | — | |
| latent | LATENT | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |