transition_snapped_to_frame: a 0.3 s fade at 25 fps is 8 frames
Timeline rounds a fade to whole frames and reports transition_snapped_to_frame as a warning, not a failure. What 0.3 s becomes at 24, 25, 30 and 60 fps.

Is transition_snapped_to_frame an error?
No. It is a soft warning in the result's warnings[]. The job still completes. Timeline snaps a fade onto whole frames, by at most half a frame, and tells you when the length you asked for was not already a whole number of frames. The warning carries the segment index and a context with requested_seconds, applied_seconds, frames and fps.
What does a 0.3 second fade become?
Frames are round(seconds x fps), and the applied length is frames divided by fps.
| Requested | 24 fps | 25 fps | 30 fps | 60 fps |
|---|---|---|---|---|
| 0.3 s | 7 frames, 0.292 s (warns) | 8 frames, 0.320 s (warns) | 9 frames, 0.300 s | 18 frames, 0.300 s |
| 0.4 s | 10 frames, 0.417 s (warns) | 10 frames, 0.400 s | 12 frames, 0.400 s | 24 frames, 0.400 s |
Does the snap move my cuts?
The warning message says the timeline position is unchanged: only the fade's own length is adjusted. The overlap rule still applies, so a slot's start must allow for the fade, as in the overlap post. Read the applied value from the warning if you need frame-exact overlay timing elsewhere.
How do I avoid the warning?
Choose output.fps first, then pick fades that are multiples of one frame: 0.04 s at 25 fps, 0.5 s at any rate. Or ignore it; it does not change the price. Run the unbilled plan to see the compile before you render, as in the estimate post.
Fades under half a frame are the failure case, covered in transition_not_frame_aligned.
# frames = round(seconds * fps); applied = frames / fps
for fps in (24, 25, 30, 60):
frames = round(0.3 * fps)
print(fps, frames, round(frames / fps, 3))Sources
Related posts
More in Media tools
- Why a 2-minute YouTube upload is or is not a Short in 2026
YouTube treats square or vertical uploads up to three minutes as Shorts if posted on or after October 15, 2024. What to check, and how to render one in Sume.
- YouTube Shorts series: pin one caption look for every episode
Shorts series run from 2026-09-23. Omit style and Sume picks one from the text. Pin style, font and design in one config so ten episodes look the same.
- How to assemble a long-form video with the Timeline 1.0 API
Timeline 1.0 renders one audio spine plus 1 to 200 ordered video slots into one MP4. Every URL must be Sume-hosted; the plan preflight is unbilled.
- How to burn captions onto a video with the Sume API
Send a public HTTPS video URL to POST /v1/video-captions and get a job-backed captioned video, timed by speech-to-text or by text you supply.
Written by Sume