AI video person swap rejects long takes: find shots over 15 s
H3 Max Recast on Sume needs 5 to 30 seconds with no single shot over 15. Find the long takes with ffmpeg scene detection, then cut them before you pay.

A source clip for H3 Max Recast has to be 5 to 30 seconds, and fal's schema adds that no single shot may run longer than 15 seconds. A 20 second clip with one unbroken take can therefore be too long even though 20 is in range. Find the shot lengths with ffmpeg's scene detection before you submit, and cut any take over 15 seconds.
The shot rule comes from fal's input schema and is repeated in Sume's catalog constraints. Sume checks the 5 to 30 second range and the other request fields before any paid work starts. Nothing in its docs says it measures shots, so assume the long-take check happens on the provider side after the job is accepted.
What counts as a shot?
A shot is the stretch between two cuts: the same camera running without an edit. A talking head filmed in one continuous take for 20 seconds is one 20 second shot. The same 20 seconds with a cutaway to a second angle at 9 seconds is two shots of 9 and 11, which is fine.
That is why fal's rule bites on single-take phone footage, screen-recorded calls and static interviews, and almost never on ads cut quickly. Recast keeps the source cuts, so the cut structure you send is the structure you get back.
How do I measure shot lengths with ffmpeg?
ffmpeg's select filter can score each frame for scene change, and showinfo prints a timestamp for every frame that passes. The script below turns those timestamps into shot lengths and flags anything over 15 seconds. The 0.3 threshold is a common starting point, not a rule: lower it if soft dissolves are missed, raise it if camera motion creates false cuts. It detects hard cuts well and misses slow fades, so confirm borderline results by eye.
import subprocess, sys
src = sys.argv[1]
dur = float(subprocess.check_output([
"ffprobe", "-v", "error", "-show_entries", "format=duration",
"-of", "csv=p=0", src]))
log = subprocess.run(
["ffmpeg", "-i", src, "-vf", "select='gt(scene,0.3)',showinfo",
"-f", "null", "-"],
capture_output=True, text=True).stderr
cuts = [0.0] + [float(l.split("pts_time:")[1].split()[0])
for l in log.splitlines() if "pts_time:" in l] + [dur]
for a, b in zip(cuts, cuts[1:]):
flag = " <-- over 15 s" if b - a > 15 else ""
print(f"{a:7.2f} -> {b:7.2f} {b - a:5.1f} s{flag}")
print(f"total {dur:.1f} s (Recast takes 5 to 30)")How do I fix a take that is too long?
Your options, from least to most invasive:
- Trim it. If the first 14 seconds carry the action, cut the clip there with
ffmpeg -ss 0 -t 14 -i in.mp4 -c copy out.mp4. Stream copy cuts on keyframes, so re-encode if the length must be exact. - Split it. Cut a 24 second take into two 12 second parts, recast each with the same photos, and join them. Your recasts of the two halves are independent jobs, so check that each person still reads as the same person at the seam.
- Insert a real cut. Even a short cutaway or B-roll insert at the midpoint turns one long shot into two legal ones, and it is the only fix that keeps a single recast.
- Leave it. A failed job releases its hold per Sume's admission docs, so one failure costs you time rather than money, but you should not rely on that as your test.
What else should I check before submitting?
Read the exact duration, because Sume's duration field for Recast is the inspected source length in whole seconds, rounded up. ffprobe -v error -show_entries format=duration -of csv=p=0 clip.mp4 prints it; a result of 11.2 means you send 12. A wrong number is not cosmetic. Values outside 5 to 30 are rejected, and the hold Sume reserves is quoted from this field.
Then check the URLs. The source and every photo must be public HTTPS addresses that stay reachable until the job has run, with no embedded credentials. Signed links that expire, private buckets and localhost addresses are all refused. Last, check that the clip contains the people you plan to replace in more than a frame or two, since the swap applies to the main people in the video and each new person takes over every shot their counterpart appears in.
What does it cost to find out the hard way?
Measure first, because the experiment is not free. At Sume's price of fal's list times 1.25, a 20 second Recast at 768p reserves $7.50 and at 1080p $11.25. Sume's admission docs say failed jobs release or refund the reservation where applicable, so a rejected long take should not keep the money, but you still lose the queue time and a pass of your day.
The same script doubles as a trimming plan for longer footage. If a 70 second video has shots of 10, 12, 9, 14 and the rest, you can group neighbouring shots into windows of 5 to 30 seconds that start and end on cuts, which keeps each recast clean at both ends. The longer-than-30-seconds recipe shows the arithmetic.
What are the full input limits?
For quick reference, with the vendor rows read 2026-10-03:
| Check | Limit | Checked by |
|---|---|---|
| Total length | 5 to 30 seconds | Sume, before submit |
| Single shot | No more than 15 seconds | fal schema, in Sume's catalog constraints |
| Duration field | Inspected source length, rounded up | Sume, before submit |
| Photos | 1 to 4 | Sume, before submit |
| URLs | Public HTTPS only | Sume, before submit |
Sources
Related posts
More in Developers
- AI voice reads Spanish with an English accent: two causes to check
Spanish read with an English accent usually means the language field was omitted or the voice is tagged for another language. How Sume's TTS 409 works.
- Are Claude Code mods safe with a Sume API key in your env?
Claude Code mods run unsandboxed and can read env vars and settings files. What that means for a Sume API key, the CLI config file and an OAuth session.
- Cancel a GPT Image 2.5 job: only possible before it starts
Sume's POST /v1/jobs/{id}/cancel works only before generation work starts. How to read cancelable, what the 409 means, and what a client timeout does not do.
- Chinese text to speech API: set language zh or it reads as English
Sume TTS only guesses Korean and Japanese when the language is missing. For Mandarin send language zh and pick a voice tagged zh, then test one line.
Written by Sume