Video Editor (FFMPEGA)
A mini non-linear editor inside ComfyUI — with keyboard shortcuts
- images
- audio
- mask
- images
- video_path
- audio
- mask_points
- mask
FFMPEG Agent is great at "make it cinematic," but it's the wrong tool for "cut out the first three seconds, crop this section, and put a transition between these two clips." That's where Video Editor (FFMPEGA) comes in: it's a real non-linear editor - timeline, razor tool, crop, speed, volume, text overlays, transitions - running in a modal inside ComfyUI. The full pause_on_input default means the workflow literally stops, opens the editor, waits for you to make cuts, and only continues when you click Continue. It's like a tiny Premiere that lives in your graph.
The key design decision is that nothing is edited in memory - the timeline is a description of edits, and FFmpeg renders it on export. So the same trim you'd agonize over with an LLM prompt becomes a mouse action, and the output is still deterministic. And if you make no edits at all, the node passes the input straight through with zero re-encoding - a genuinely thoughtful detail that means you can leave it in a workflow without paying a quality or time penalty.
The inputs that matter
pause_on_input- default On. When On, the workflow pauses and shows the editor so you can actually edit; when Off it passes through unedited. Keep it On unless you're deliberately using the node as a passthrough.auto_open_editor- default Off, meaning you open the editor modal manually with a button. Flip it On if you want the editor to pop up automatically the moment a video arrives.video_path- the source file (or connectimagesas a tensor batch, or both, plusaudioto associate a track).fps0 = auto-detect from the source; set it manually only if the source is ambiguous.
Outputs: images (all frames of the edited result), video_path (the rendered output - chain into Save Video), audio, plus fps and frame_count for downstream wiring, and mask_points pass-through.
Editing itself uses familiar conventions: Space play/pause, J/K/L shuttle, I/O set in/out, R razor, V select, arrow keys step frames, ? shows the shortcut overlay. Select, split, delete, crop, change speed/volume, drop a text overlay, add a transition - then export.
Installing it
It's bundled in ComfyUI-FFMPEGA, so install the pack: ComfyUI Manager → search ComfyUI-FFMPEGA → Install, or:
cd ComfyUI/custom_nodes
git clone https://github.com/AEmotionStudio/ComfyUI-FFMPEGA.git
cd ComfyUI-FFMPEGA
pip install -r requirements.txt
Restart ComfyUI. FFMPEG on PATH is required - the editor is a front end, ffmpeg does the actual render.
Where people get burned
The most common stumble is confusion about when editing happens: the editor appears because the node paused - if you changed pause_on_input to Off, there's nothing to edit, by design. And remember that edits render through ffmpeg on export, so a heavy edit (long clip, transitions, speed changes) can take a while - the pause is the point, not the bug. Keep the "one task per run" instinct in mind here too: use the editor for structural cuts, and let the Agent handle the look.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| pause_on_input | BOOLEAN | true | When ON, pauses the workflow and shows the editor. Click Continue to pass the edited clip downstream. When OFF, passes through without editing. |
| auto_open_editor | BOOLEAN | false | When ON, the editor modal automatically opens when a video arrives. When OFF, click the Open Editor button manually. |
| imagesopt | IMAGE | Video frames as IMAGE tensor batch [N,H,W,3]. | |
| video_pathopt | STRING | Path to a video file on disk. | |
| audioopt | AUDIO | Audio track to associate with the video. | |
| fpsopt | FLOAT | 0.000–120 | Framerate for IMAGE tensor input. 0 = auto-detect from source. |
| mask_pointsopt | STRING | Optional upstream mask_points pass-through. Forwarded as-is to the mask_points output for downstream nodes. | |
| maskopt | MASK | Optional upstream MASK tensor. When connected, the mask track is synchronized with video edits (segments, cuts, trims apply identically). Forwarded to the mask output. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| video_path | STRING | — |
| audio | AUDIO | — |
| mask_points | STRING | — |
| mask | MASK | — |