Changing speed in FFmpeg means rescaling timestamps. The setpts video filter multiplies each frame's presentation time, and atempo stretches audio without changing pitch. Treat them as two separate jobs that you keep in agreement.
Key takeaways
setpts=0.5*PTSplays video at 2× speed;2.0*PTSplays at half speed.- The video multiplier is the inverse of the speed factor.
atempochanges audio speed and is reliable between 0.5 and 2.0 — chain it for bigger changes.- For smooth slow motion, add frame interpolation with
minterpolate.
Speed video up (2×)
To double the speed, halve the timestamps. Pair it with atempo=2.0 so the audio keeps up:
ffmpeg -i in.mp4 -filter_complex \ "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" \ -map "[v]" -map "[a]" out.mp4
Rule of thumb: the setpts multiplier is 1 ÷ speed. For 4× that's 0.25*PTS.
Slow video down (half speed)
ffmpeg -i in.mp4 -filter_complex \ "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]" \ -map "[v]" -map "[a]" out.mp4
Big speed changes: chain atempo
atempo only accepts a factor between 0.5 and 2.0 per instance. For 4× audio, chain two stages — each factor multiplies:
ffmpeg -i in.mp4 -filter_complex \ "[0:v]setpts=0.25*PTS[v];[0:a]atempo=2.0,atempo=2.0[a]" \ -map "[v]" -map "[a]" out.mp4
Make a silent timelapse
Timelapses usually drop audio entirely. Speed the video hard and map only the video stream:
ffmpeg -i in.mp4 -vf "setpts=PTS/10" -an timelapse.mp4
Smoother slow motion
Stretching timestamps just holds frames longer, which can look choppy. minterpolate synthesizes in-between frames for a fluid result (slower to render):
ffmpeg -i in.mp4 -vf \ "setpts=2.0*PTS,minterpolate=fps=60:mi_mode=mci" \ -an slowmo.mp4
Do it on a timeline
FFmpegLab lets you set clip speed visually and writes the matching setpts/atempo command for you, keeping audio in sync automatically. Combine speed ramps with transitions and effects, all offline in your browser.