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
- Video API transitions: six types, one second max, eight in a row
Sume timeline accepts fade, wipeleft, wiperight, slideup, slidedown and dissolve, with a duration of at most 1 second and no more than eight adjacent fades.
- Transparent background AI image on Sume: GPT Image 2.5 field
Only the GPT Image 2.5 rows take background on Sume's image route. OpenAI says transparency needs png or webp output. A request and an alpha check in Python.
- Upscale 100 images with an API: $20.00 on Sume
Sume Image Upscale 1.0 reserves $0.20 per image (about 16 megapixels at the Topaz rate), so 100 images is $20.00 before settlement.
- Upscale 20 images with an API: $4.00 on Sume
Sume Image Upscale 1.0 reserves $0.20 per image (about 16 megapixels at the Topaz rate), so 20 images is $4.00 before settlement.
Written by Sume