Nodes/ComfyUI-FFMPEGA/Face Poke (FFMPEGA)
ComfyUI Node

Face Poke (FFMPEGA)

Pause the queue and drag a face around by hand

By AEmotionStudio·Created 8 months ago·Updated a day ago· 16
Face Poke (FFMPEGA)
  • images
  • audio
  • images
  • video_path
  • audio
  • edit_data
pause_on_inputtrue
auto_open_editortrue
video_path
fps0.00
edit_data

Most ComfyUI nodes are fire-and-forget. This one isn't, and that's the entire point. Meanwhile your clip is sitting on disk with a face that's 90% right - head tilted a touch too far, eyes a bit dead, mouth frozen mid-word - and re-rolling the whole 81-frame generation to nudge one expression is a terrible trade. Face Poke stops the queue, hands you the filmstrip, and lets you fix the face without touching the pixels anywhere else.

How it works

Under the hood it's LivePortrait: a per-frame face synthesizer that takes pose and expression coefficients and re-renders the face region, leaving the rest of the frame alone. You get a scrubber over the frames, click or drag on a face to re-aim the head, expression sliders for the expression coefficients. Hit Apply and it rebuilds - only the frames you edited get re-synthesized, then everything is reassembled into a video.

One piece of honesty worth passing on: the name is borrowed from jbilcke-hf's FacePoke project, but the author states plainly in the node's source that this is a ground-up independent implementation with no shared code or dependency. It's the concept that's borrowed, not the build.

The two widgets that decide everything

pause_on_input is the switch. On (default), execution pauses and the editor opens so you can work; Apply Edits rebuilds and passes downstream. Off, the node becomes a pass-through and your graph runs unattended - which is how you queue a batch overnight without wedging it on the first video. Pair it with auto_open_editor if you want to click "Open Face Editor" yourself instead of having the modal ambush you, which is worth doing when several Face Poke nodes are in one graph.

Everything else is plumbing. images takes frames as an IMAGE batch; video_path takes a file on disk, and upstream connections always win over an uploaded video, so a wired input will silently override whatever you uploaded. fps only matters for IMAGE tensor input - 0 means auto-detect from the source, which is almost always right. audio lets you attach a track so the rebuilt video keeps it.

Outputs and the edit_data round trip

Outputs are images, video_path, audio, and edit_data. That last one is the interesting one: it's JSON describing the edits you made, and if you feed it back into the edit_data input on a later run, the editor opens with your previous work already loaded. So you can do a rough pass, queue, come back tomorrow, reconnect the saved JSON, and keep refining the same shots instead of starting from a blank timeline.

Install

ComfyUI Manager → search ComfyUI-FFMPEGA → Install, or:

cd ComfyUI/custom_nodes
git clone https://github.com/AEmotionStudio/ComfyUI-FFMPEGA.git
pip install -r ComfyUI-FFMPEGA/requirements.txt

Restart. This node is interactive, so you need the browser UI, not an API client. The LivePortrait models (~497 MB) live in ComfyUI/models/liveportrait/ and auto-download the first time you apply edits. FFMPEG needs to be on PATH, like every node in this pack.

Where people get burned

It blocks. The pause is implemented with ComfyUI's ExecutionBlocker, so a run that hands into Face Poke just sits there until you click Apply. Nobody's home at 3am. Turn pause_on_input off before you batch-queue.

Cancelling is awkward. If a long request is in flight, the toolbar interrupt button waits for the current step to finish rather than killing it. The README's advice is blunt: close the ComfyUI terminal or restart the server. That kills it immediately.

Face-swap expectations. This is LivePortrait re-rigging an existing face - pose, expression, a bit of lip movement. It is not identity replacement and it will not invent a performance the source footage has no evidence for. For driving-animation from a reference performance, that's a different model class entirely.

CategoryFFMPEGA

Inputs (7)

NameTypeDefaultDescription
pause_on_inputBOOLEANtrueWhen ON, pauses the workflow and shows the face editor. Click Apply Edits to rebuild and pass downstream. When OFF, passes through without editing.
auto_open_editorBOOLEANtrueWhen ON, the face editor modal auto-opens when the workflow pauses. When OFF, click 'Open Face Editor' manually.
imagesoptIMAGEVideo frames as IMAGE tensor batch [N,H,W,3].
video_pathoptSTRINGPath to a video file on disk. Upstream connections always win over uploaded video.
audiooptAUDIOAudio track to associate with the video.
fpsoptFLOAT0.000–120Framerate for IMAGE tensor input. 0 = auto-detect from source.
edit_dataoptSTRINGPre-existing edit JSON to resume from (output from a previous FacePoke run).

Outputs (4)

NameTypeDescription
imagesIMAGE
video_pathSTRING
audioAUDIO
edit_dataSTRING