zhenzhen-bernini-r-video-fal
Reference-to-video and maskless editing, per clip
- video
- reference_image1
- reference_image2
- reference_image3
- reference_image4
- reference_image5
- video
- video_url
- response
The community's favorite thing to say about Bernini is "the king is mute" - ByteDance's unified video model is the best open-weights video editing model of its era, and it ships with zero audio. The second favorite thing is "this is heavy." Editing runs at roughly double Wan 2.2's compute because your source video is part of the model input, and locals report 55-60s/it on a 3090. This node is the "don't care, rent it" answer: the same fal-ai/bernini-r endpoints, paid per clip through the Zhenzhen API, with the rendering happening on someone else's GPU.
What you get is the actual Bernini headline feature - editing with no mask. Remove an object, change a material or the weather, drop content into footage, all driven by a plain-text instruction instead of a SAM-plus-ControlNet pipeline. And in reference_to_video mode you get Bernini's other big trick: hold one character across shots from up to five reference images. If you've been on the fence about learning VACE to do this locally, this node removes the compute excuse entirely.
How it works
One node, three modes, three endpoints:
reference_to_video→fal-ai/bernini-r/reference-to-video. Animates from up to five reference images; theaspect_ratiosetting only applies here.edit_video→fal-ai/bernini-r/edit-video. Takes your existingvideoand a prompt, rewrites it in place. Needs the video input orvideo_url.reference_edit_video→fal-ai/bernini-r/reference-edit-video. Editing plus reference images, for keeping a character consistent while you change the scene.
Either way the flow is identical to every node in this pack: it POSTs to the Zhenzhen FAL proxy, polls the job every few seconds (default 6s, up to 600 attempts - a full hour of patience), then hands you back a VIDEO output and the hosted video_url.
Inputs and outputs that matter
mode is the one to pick first - it decides which of the three endpoints gets hit. Then prompt, which should be instruction-style, and for reference modes, address images explicitly: "the man from image0, wearing the jacket from image2..." Reference images go in reference_image1 through reference_image5 as IMAGE tensors, or paste URLs into reference_image_urls (one per line, up to 5 total).
num_frames- default 81, and the tooltip gives you the real advice: use 5 as a cheap smoke test, because frames are the main cost driver. Values snap internally to 4k+1 (the Wan-style VAE quirk).frames_per_second- 16 by default; Bernini output has no audio, so this is just motion pacing.max_image_size- 848 default; the knob that controls how big reference images get downscaled.acceleration-noneorregular; "regular" trades a little quality for speed on the hosted end.seed- 0 = random, max 65535 (FAL limit).skip_error- on, a failure returns a blank video and logs instead of killing your queue.
Outputs: video (a VIDEO tensor you can feed straight into ComfyUI's video save nodes), video_url (the hosted file), and response (raw API JSON).
Installing it
It's the pack, not a lone node - every Zhenzhen node ships in one repo:
cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/Comfyui-zhenzhen
Restart ComfyUI. Or search "Comfyui-zhenzhen" in ComfyUI Manager. No model downloads, no local GPU requirements beyond running ComfyUI itself.
Common issues
Because you're renting video generation, the failure modes are mostly upstream. The README's standing advice: a 500 error is often the provider being flaky, so re-run before you troubleshoot anything else. If the node polls past its timeout, don't assume the job died - FAL jobs are pre-charged and settled after the fact, and the workshop site's async task list may show the clip finished server-side; grab it from video_url.
One Bernini-specific thing to remember: there's no audio in the output, ever. If your workflow needs sound, plan a separate audio stage (many people run Bernini output through a music/voice model). And if you're on a network that can't reach the overseas server (443 errors), you'll need a VPN with TUN mode - that's a documented quirk of this pack, not a mystery.
Inputs (25)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | A cinematic subtle motion shot. | — |
| modeopt | COMBO | reference_to_video | 3 options: reference_to_video, edit_video, reference_edit_video |
| videoopt | VIDEO | — | |
| video_urlopt | STRING | — | |
| reference_image1opt | IMAGE | — | |
| reference_image2opt | IMAGE | — | |
| reference_image3opt | IMAGE | — | |
| reference_image4opt | IMAGE | — | |
| reference_image5opt | IMAGE | — | |
| reference_image_urlsopt | STRING | Optional reference image URLs, one per line. Up to 5 total. | |
| api_keyopt | STRING | — | |
| negative_promptopt | STRING | — | |
| max_image_sizeopt | INT | 848256–1280 | — |
| num_framesopt | INT | 815–121 | Snapped internally to 4k+1. Use 5 for lowest-cost smoke. |
| frames_per_secondopt | INT | 164–30 | — |
| num_inference_stepsopt | INT | 301–50 | — |
| accelerationopt | COMBO | none | 2 options: none, regular |
| aspect_ratioopt | COMBO | 16:9 | reference_to_video mode only. |
| enable_prompt_expansionopt | BOOLEAN | false | — |
| seedopt | INT | 00–65535 | 0 = random seed. FAL seed max is 65535. |
| image_wayopt | COMBO | base64 | 2 options: base64, image_url |
| video_wayopt | COMBO | upload | 2 options: upload, video_url |
| poll_intervalopt | INT | 61–60 | — |
| max_poll_attemptsopt | INT | 60010–3600 | Default 600*6s = 3600s timeout. |
| skip_erroropt | BOOLEAN | false | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| video_url | STRING | — |
| response | STRING | — |