Why is my 0.3 s fade 0.32 s? Timeline snaps transitions to frames
Timeline rounds a fade to whole frames, at most half a frame off: 0.3 s is 0.2917 s at 24 fps, 0.32 s at 25, exact at 30. Warning: transition_snapped_to_frame.

A transition on a video file must be a whole number of frames, so Timeline 1.0 rounds the transition.duration you send to the nearest frame at the output frame rate and tells you with a transition_snapped_to_frame warning. The change is never more than half a frame and the start of every slot stays exactly where you declared it.
The pattern is easiest to see with one request value across the four allowed rates. A 0.3-second fade is 7.2 frames at 24 fps, 7.5 at 25, 9 at 30 and 18 at 60.
What each rate does to common fade lengths
We computed these with the compiler's own rule, which is the frame count rounded to the nearest whole frame and divided back by the rate. Values that land exactly on a frame produce no warning, which is why 0.3 s at 30 fps is silent.
At 25 fps, a half-frame tie rounds up, so 0.3 s becomes 8 frames and 0.5 s becomes 13 frames. In a real run at 25 fps with a 0.3-second fade, the warning read: "Transition of 0.300s is 7.50 frames at 25fps; rendered as 8 frames (0.320s)."
| Requested | 24 fps | 25 fps | 30 fps | 60 fps |
|---|---|---|---|---|
| 0.25 s | 6 frames, 0.25 s | 6 frames, 0.24 s | 8 frames, 0.2667 s | 15 frames, 0.25 s |
| 0.3 s | 7 frames, 0.2917 s | 8 frames, 0.32 s | 9 frames, 0.3 s | 18 frames, 0.3 s |
| 0.4 s | 10 frames, 0.4167 s | 10 frames, 0.4 s | 12 frames, 0.4 s | 24 frames, 0.4 s |
| 0.5 s | 12 frames, 0.5 s | 13 frames, 0.52 s | 15 frames, 0.5 s | 30 frames, 0.5 s |
Snapped, not shifted
The Timeline docs state that declared starts are authoritative and the compiler compensates for the overlap rather than moving anything. So a 0.32-second fade where you asked for 0.3 does not move the next scene against the voiceover. It only changes how long the blend lasts, by a fraction of a frame.
There is one hard limit at the other end. A duration that rounds to zero frames is refused with transition_not_frame_aligned, because snapping it would silently delete the transition you asked for. At 30 fps that means anything under 1/60 of a second.
Which fps the plan uses
If you leave output.fps out, the render matches the frame rate of your longest video sources, and falls back to 30 only when no source has a rate. The free plan call never probes, so it validates at 30. That means the snap warning from a plan with no explicit fps describes 30 fps, and the real render may snap differently if your clips run at 24 or 25. Send output.fps explicitly in the plan if you need the plan to match the render.
If a half-frame difference matters, pick fades that are a multiple of 1/fps for your rate, such as 0.25 s at 24 or 60 fps, 0.4 s at 25 fps, or 0.3 s at 30 fps.
Sources
Related posts
More in Media tools
- Fake a second camera on one AI clip: a punch-in cut for Shorts
Crop one AI clip with video-filter, then cut between wide and tight versions in Timeline 1.0 at the same moments, so a Short keeps moving without regenerating.
- FFmpeg 9.0.2 Lei: what is new, and what hosted trim exposes
FFmpeg 9.0.2 shipped 2026-09-18. Sume runs ffmpeg for you but accepts no ffmpeg flags: trim takes start, duration, precision, audio and output.
- Final Cut Pro 12.4 Cinematic edits: export flat, then caption
Final Cut Pro 12.4 edits Cinematic focus after the fact. Sume reads a public MP4 URL, so export a flattened file first, then trim or caption it.
- Firefly Video Editor Quick Cut vs a scripted first cut
Adobe's Firefly Video Editor has Quick Cut for a first cut from raw footage. Sume can inspect clips, trim, and join them on a timeline, but picks no shots.
Written by Sume