arkennemasis fal · MiniMax H3 Max Insert Video · $0.05-0.06/s
Splice a generated scene into a take you already shot
- video
- reference_image_1
- reference_image_2
- reference_image_3
- reference_image_4
- reference_image_5
- reference_image_6
- reference_video_1
- reference_video_2
- reference_video_3
- video
- video_path
- frame_count
- height
- injected_duration
- start_time
- duration
- width
- seed
- expanded_prompt
- timings
- source
- resume_time
- info
Fix the middle of a clip, not the whole thing
Insert Video takes an existing clip and injects a newly generated scene into the middle of it, then returns to the original footage. You guide the new scene with a prompt, reference images, reference videos, or any combination.
That's a specific and very practical job. The take is good except for eight seconds where the handoff was wrong. The client wants a different product in frame for one beat. You want a short cutaway that isn't in the footage. Regenerating the clip is the expensive, lossy answer; inserting a scene is the surgical one.
The billing matches the ambition: $0.05/s of generated scene at 480p, $0.06/s at 768p - and only the new scene duration is billed, not the full output. The first 4,096 reference tokens are included, with extra reference tokens at $0.02 per 1,000, prorated. So a 5-second insert into a 30-second take is a 5-second bill, roughly a quarter.
Fair warning before you start: this is a new endpoint with essentially no community track record - you won't find threads about it, because there aren't any yet. Read the failure modes below as mechanism, not folklore.
How it works
Your source video and any references upload to fal's CDN (free - uploads never bill), one request goes to minimax/h3-max/insert-video, and the finished clip lands in output/fal/minimax_h3-max_insert-video/. The node returns a lot of scalars because this endpoint tells you exactly what it did - frame count, dimensions, the injected duration and where it landed.
The inputs that matter
- video - the source clip you're editing.
- start_time and resume_time - the splice window, in seconds. Defaults are 1.625 and 1.635, i.e. essentially the same instant just past the minimum:
start_timehas a floor of 1.625 andresume_timea floor of 1.635.start_timeis where the new scene goes in;resume_timeis when the original footage resumes. Pushing them apart means you're replacing that stretch of source; leaving them together means you're inserting without removing anything. This pair is the whole edit. - duration - the length of the generated scene, a float between 5 and 13 seconds, default 5. This is what gets billed, so it's the number to watch.
- prompt - what the new scene is. Optional; empty leaves it out entirely.
- reference_image_1…6 and reference_video_1…3 - the guides for the generated scene, each socket optionally carrying a batch, sent in socket order (first picture on socket 1 is number 1). A couple of reference frames from your own take is the cheapest way to keep the insert looking like it belongs.
- resolution -
480por768p, default768p. Nothing higher on this endpoint. - color_match - on by default, and I'd leave it on. It's what stops the generated scene from reading as a different camera, different grade, different shoot.
- enable_prompt_expansion - on by default. It costs time and can enrich a thin prompt; turn it off if you want your wording used verbatim.
- seed -
-1leaves it to the model.
And the standard guards: max_cost_usd (default $20, checked before upload so an accidental 13-second scene at the wrong settings gets stopped, not billed), reuse_identical_run, extra_json, max_concurrent (1 by default across the whole graph).
Outputs
video (the whole clip with the insert in place - straight to SaveVideo, PreviewVideo, or a Video Assemble), video_path, and a useful pile of metadata: frame_count, width, height, start_time, resume_time, duration, injected_duration (what the scene actually came out as, which may not be exactly what you asked), seed (the one actually used), expanded_prompt, timings, source, and info with the request id and cost estimate.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
pip install -r comfyui-arkennemasis/requirements.txt
Restart ComfyUI, then look under arkennemasis/fal/Video/MiniMax. One line in the .env next to run_nvidia_gpu.bat:
FAL_KEY=your-key-from-fal.ai/dashboard/keys
There's no key field on the node by design - that's what keeps a key out of your saved workflows.
Where people get burned
Replacing when you meant inserting. With resume_time set barely past start_time, the source keeps playing right after your generated scene. Spread them apart and that stretch of source is gone. Decide which one you're doing before you spend the money.
Expecting a frame-perfect handoff. This is a generative splice: the model generates a scene that should sit in the neighbourhood, not a compositing operation with alpha edges. Trust color_match tech, and check the returned start_time, resume_time and injected_duration rather than assuming your requested numbers came back exactly.
A 13-second insert is not a cheap experiment. Five seconds is the minimum billed scene, and it scales up: 13 × $0.06 ≈ $0.78 at 768p, per attempt. Draft your intent at 480p on a short scene first.
Reference order is the only addressing scheme. The prompt refers to references by number, and numbers follow socket order with batches flattened - first picture on socket 1 is 1. If your prompt says "use Image 2" and you get something baffling, that's where to look.
No track record means no shortcuts. Nobody has posted the gotchas yet. Do one small paid run before you build a workflow that depends on this node, and read the info output when it finishes.
Inputs (22)
| Name | Type | Default | Description |
|---|---|---|---|
| video | VIDEO | — | |
| prompt | STRING | Empty leaves it out. | |
| start_time | FLOAT | 1.631.625–60 | — |
| resume_time | FLOAT | 1.641.635–60 | — |
| duration | FLOAT | 5.005–13 | — |
| resolution | COMBO | 768p | 2 options: 480p, 768p |
| seed | INT | -1-1–2147483647 | -1 leaves it to the model. |
| enable_prompt_expansion | BOOLEAN | true | — |
| color_match | BOOLEAN | true | — |
| reference_image_1opt | IMAGE | Each socket may carry a batch; they are sent in socket order (the first picture of socket 1 is number 1). | |
| reference_image_2opt | IMAGE | Each socket may carry a batch; they are sent in socket order (the first picture of socket 1 is number 1). | |
| reference_image_3opt | IMAGE | Each socket may carry a batch; they are sent in socket order (the first picture of socket 1 is number 1). | |
| reference_image_4opt | IMAGE | Each socket may carry a batch; they are sent in socket order (the first picture of socket 1 is number 1). | |
| reference_image_5opt | IMAGE | Each socket may carry a batch; they are sent in socket order (the first picture of socket 1 is number 1). | |
| reference_image_6opt | IMAGE | Each socket may carry a batch; they are sent in socket order (the first picture of socket 1 is number 1). | |
| reference_video_1opt | VIDEO | Each socket may carry a batch; they are sent in socket order (the first picture of socket 1 is number 1). | |
| reference_video_2opt | VIDEO | Each socket may carry a batch; they are sent in socket order (the first picture of socket 1 is number 1). | |
| reference_video_3opt | VIDEO | Each socket may carry a batch; they are sent in socket order (the first picture of socket 1 is number 1). | |
| max_cost_usdopt | FLOAT | 20.00–100000 | Safety cap. If the estimated cost of this run is above this many US dollars the node stops BEFORE sending anything to fal. 0 = no cap. |
| reuse_identical_runopt | BOOLEAN | true | If these exact inputs (the settings AND the same pictures/clips/audio) were already paid for and the files are still in output/fal, return them instead of paying again - also after a ComfyUI restart. Turn off for a fresh take with the same settings. |
| extra_jsonopt | STRING | Advanced: a JSON object merged into the request last, for any fal field this node has no box for. Example: {"seed": 7}. Leave empty normally. | |
| max_concurrentopt | INT | 11–32 | How many paid fal calls may run at the same time in one run, across every fal node. 1 (default) = one after another. This node starts its paid part only while fewer than this many fal calls are running. Once any fal node fails, the ones still waiting are not started, so nothing more is billed. |
Outputs (14)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| video_path | STRING | — |
| frame_count | INT | — |
| height | INT | — |
| injected_duration | FLOAT | — |
| start_time | FLOAT | — |
| duration | FLOAT | — |
| width | INT | — |
| seed | INT | — |
| expanded_prompt | STRING | — |
| timings | STRING | — |
| source | STRING | — |
| resume_time | FLOAT | — |
| info | STRING | JSON: request id, cost estimate, saved files and fal's full answer. |