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.

3 min readSume
All posts

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 fade versus rendered fade by output fps (read 2026-10-03)
Requested24 fps25 fps30 fps60 fps
0.25 s6 frames, 0.25 s6 frames, 0.24 s8 frames, 0.2667 s15 frames, 0.25 s
0.3 s7 frames, 0.2917 s8 frames, 0.32 s9 frames, 0.3 s18 frames, 0.3 s
0.4 s10 frames, 0.4167 s10 frames, 0.4 s12 frames, 0.4 s24 frames, 0.4 s
0.5 s12 frames, 0.5 s13 frames, 0.52 s15 frames, 0.5 s30 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

All Media tools posts

Written by Sume