Reel judders after mixing 24 and 30 fps clips: set Timeline output fps
Timeline repeats or drops frames when output fps differs from a source. Learn output_fps_resamples_sources, how the default is chosen, and when to pin 30.

If a Reel built in Sume Timeline 1.0 judders on motion, check the output_fps_resamples_sources warning in the render result: it means the output frame rate differs from a source, and Timeline met it by repeating or dropping a frame every few frames. Omit output.fps and the render uses the rate the longest video sources already run at; pin output.fps only when you need a specific rate.
How the default is chosen
Per the Timeline docs, an omitted output.fps renders at the rate the sources already run at, decided by the longest video sources. Stills have no rate, and 30 is used only when nothing has one. Allowed explicit values are 24, 25, 30 and 60. The warning names the rate the sources wanted, which is the number to try next.
| Situation | Action |
|---|---|
| Most footage at one rate | Omit output.fps |
| Mixed 24 and 30, motion matters | Pin the rate most clips use |
| Only stills and generated clips | Pin 30 or let the default decide |
| Compose shots feeding Timeline | Set compose output.width and height to the timeline, leave fps alone |
Reading the warning
Fetch GET /v1/jobs/{id}/result and look at warnings[] inside the data.result object. Soft warnings, including padded or looped short sources and snapped transitions, are not failures.
import os, requests
h = {"Authorization": "Bearer " + os.environ["SUME_API_KEY"]}
job_id = os.environ["JOB_ID"]
res = requests.get("https://api.sume.com/v1/jobs/" + job_id + "/result", headers=h)
res.raise_for_status()
for w in res.json()["data"]["result"].get("warnings", []):
print(w)Why Reels care
Instagram's Reels guide (read 2026-10-03) suggests a 15-second Reel for anyone starting out, and short Reels are often built from several clips, which is where mixed frame rates meet. The fix is on your side of the request, not in Instagram.
What Sume does not do
Sume does not interpolate new frames. A rate that differs from a source is met by repeating or dropping frames, which is what causes the judder. Matching the rate across your source clips before you assemble them is the cleaner fix.
Sources
Related posts
More in Developers
- reference_video_urls or video_url? Reference footage vs edit source
On Sume, reference_video_urls guide a new clip; video_url is a source you edit or swap. They cannot be combined on Gemini Omni Flash. Which model takes which.
- Replace a product-page GIF with a muted MP4: autoplay loop
web.dev says a muted looping video replaces a GIF at a fraction of the size: 3.7 MB vs 551 KB in its example. The tag, the attributes and a silent Sume trim.
- Report a failed Sume video job: share the request id, not the URLs
A failed video job needs a request id and a job id for support. What Sume says is safe to share, what to redact, and how to pull both from an error body.
- Re-render a Short's ending without double billing: Idempotency-Key
A Timeline render needs an Idempotency-Key. Reuse a key to retry the same request; use a new key when you change the ending.
Written by Sume