Wan 2.2 Animate · Character Animation
Wan 2.2 Animate · Character Animation — drive a photo with someone else's performance
- image_url
- video_url
- video
- task id
What it is
Wan 2.2 Animate is Alibaba's motion-transfer model: a character image plus a driving video, and the person in your still performs the motion in the clip. It's the technique behind the "my character is lip-syncing a song" videos, and it's a first-party Apache 2.0 model - one of the narrow task models Alibaba kept shipping after they stopped releasing open base checkpoints.
This node puts it behind two media sockets. The character comes from an IMAGE; the performance comes from a VIDEO; the output length is the driving clip's length, up to thirty seconds. No rigging, no skeleton you have to author, no ControlNet graph.
How it works
Both inputs go up to PopNow, the model transfers motion from the driving clip onto the character, and the result comes back as a VIDEO value for Save Video. The prompt field is a nudge rather than an instruction - the tooltip is candid that it's optional and merely guides animation style and content. Don't expect it to fight the driving clip.
Where this sits against the alternatives is worth saying plainly: SCAIL-2, built on Wan 2.1, won the mid-2026 argument over exactly this task by not stretching the character to match the reference's proportions, which is Wan Animate's known weakness. So expect your character to be resized toward the driving subject's height and build. If you're animating a stylised or unusually-proportioned character and the result keeps looking wrong, that's the model, not your settings.
The inputs that matter
image_url is the character. The person in this picture is the one that gets animated - so this is a job for a clean, front-facing, well-lit still.
video_url is the driving performance: 2 to 30 seconds, MP4 or MOV. Its length sets your output length, and the pack rejects anything outside that window before anything is charged, which is unusually polite of it. Two practical notes. One, the upload cap is 90MiB, so trim before you queue rather than discovering it at submit time. Two, the driving clip decides everything about the shot - framing, motion, pacing - so a handheld, badly framed video makes a badly framed output no matter how good the character art is.
resolution is 480p or 720p, and this is where the money lives: billing is per second of output, and 720p is roughly double the 480p rate. A 30-second driving clip at 720p is a genuinely expensive run. Test on a 4-second trim at 480p, then do the full pass once the mapping works.
animation_mode currently offers a single value, animate. Don't read that as a hidden feature you're missing - the endpoint exposes one mode.
Outputs: video, task id.
Installing it
cd ComfyUI/custom_nodes
git clone https://github.com/popnow-ai/popnow-comfyui # or Manager > search "PopNow"
Key from popnow.ai/api/console/keys into Settings > PopNow, or POPNOW_API_KEY in the environment, then restart so the catalog loads. No weights, no GPU, no dependencies beyond ComfyUI itself. You'll want a way to load your driving clip into ComfyUI - a standard video loader, or the popnow_<task>.mp4 files this pack saves into ComfyUI/output.
Where it goes wrong
Face drift is the classic Animate complaint, and the usual answer is to raise the quality tier but also to give it a better character image: full-frontal, eyes visible, not cropped at the chin. A character that's high-resolution and evenly lit transfers far better than one with dramatic side lighting.
If the character's proportions come out wrong, re-read the SCAIL-2 note above - it's a property of motion transfer, not a fixable widget. If the output is a black or empty clip, check the driving video actually plays locally and is within the 2–30 second window.
Cost surprises come from long driving clips, and the flat seatbelts help: each run is quoted before it starts, and Settings > PopNow > Max credits per run hard-stops anything above your ceiling. 40201 is the empty-wallet error; a cancelled run still finishes server-side and gets charged if it succeeds.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| animation_mode | COMBO | animate | animate drives the character in the image with the motion of the driving video; replace swaps the person in the driving video for the one in the image. |
| image_url | IMAGE | Character image. The person in this image is the one that gets animated. | |
| video_url | VIDEO | Driving video, 2 to 30 seconds long; upload an MP4, or pass an MP4 or MOV URL. Its motion is transferred to the character and its length sets the output length. Videos outside that range are rejected before any charge. | |
| resolution | COMBO | 720p | Output video resolution. |
| prompt | STRING | Optional description of the motion, used to guide animation style and content. | |
| seed | INT | 00–2147483647 | Same seed and settings, same result. Set 'control after generate' to randomize to get a new result on every run; every run is billed. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| task id | STRING | The PopNow task id, for the API console logs or support. |