Live Portrait for Video
Reenact a whole clip, not just a still
- source_image_batch
- driving_video
- video
- video_concat
The plain LivePortraitNode takes one still photo and makes it move. LivePortraitVideoNode takes a whole video as the source and drives it with another video - the "video-to-video" mode. The difference is the source input: instead of a single frame, this node accepts a batch of frames, so the thing you're animating is already a moving clip. Every frame of your source gets the driving motion applied to it.
Why would you want that? Because your source isn't always a static portrait. Maybe you have a rendered character clip that's moving but you want to swap in a different facial performance, or you want to re-drive existing footage with a new expression track. A single still can't carry that - the underlying face is frozen. Feeding a frame sequence lets the source keep whatever motion it already had while the driving video layers the face performance on top. This is the vid2vid path the README points at, and it's the more advanced of the two LivePortrait nodes.
How it works
Same LivePortrait engine as everywhere else in this pack: split each face into an appearance code and motion codes, read the motion off the driving clip, warp it onto the source. The wrinkle here is that the source is a batch, so the node walks the source frames and the driving frames together and produces an animated result the length of the sequence. It's frame-by-frame reenactment rather than one-photo-comes-alive.
The inputs and outputs that matter
Just two inputs, both required:
source_image_batch(IMAGE) - a batch of frames, i.e. your source video decoded into images. This is the part that separates this node from the single-still version. Use a Mixlab (or any) video-load node to turn a clip into the frame batch you feed here.driving_video(SCENE_VIDEO) - the performance to transfer. As with the rest of the pack this is a MixlabSCENE_VIDEOtype, which is why you'll wantcomfyui-mixlab-nodesalongside it for loading and viewing.
Outputs match the still node: video (the reenacted result) and video_concat (result stitched next to the driving clip so you can sanity-check how the motion landed).
One thing this node does not take is a crop_info input - so the per-face crop-and-target control you get on LivePortraitNode via FaceCropInfo isn't wired in here. This is the straightforward "one source clip, one driving clip" path; reach for the still LivePortraitNode with FaceCropInfo when you need the multi-face group behavior.
How to install it
ComfyUI Manager → search comfyui-liveportrait → install → restart. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/shadowcz007/comfyui-liveportrait
then restart. Download the LivePortrait and InsightFace weights (Google Drive / Baidu links are in the README) into ComfyUI/models/liveportrait and ComfyUI/models/insightface. If comfyui-mixlab-nodes is already installed, no extra Python deps are needed.
Common issues
Video-to-video is heavier than the still path - you're running the warp for every source frame and every driving frame, so long clips are slow and memory-hungry. Keep the driving clip short while you're dialing in settings. The usual pack gotchas apply: models don't auto-download (a lot of "it errors" reports are just the models/liveportrait folder being empty), and InsightFace is the dependency most likely to break the import - historically over a missing C++ toolchain, eased by InsightFace 1.0. Alignment between a moving source and a moving driver is also fussier than the single-photo case; if the face drifts or ghosts, shorten and simplify the driving motion before blaming the node. And the standard caveat: the InsightFace weights this rides on are non-commercial, which follows through to anything you make with it.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| source_image_batch | IMAGE | — | |
| driving_video | SCENE_VIDEO | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video | SCENE_VIDEO | — |
| video_concat | SCENE_VIDEO | — |