Modify Video Speed with ffmpeg

By  on  

I watch a lot of sports and recently I've become fascinated with some of the methodologies they use to illustrate events within the game.  I don't have their advanced TV software or hardware, of course, but I do have a love for ffmpeg, which allows me to do everything from clip videos to change video formats, create tacky highlight videos with emo techno music combine audio and video, and more.

One of my favorite TV sports illustration techniques is speeding video up (time-lapse) or slowing it way down (slo-mo replay); naturally I wanted to know how to manipulate video speed with ffmpeg.  It turns out all you need to do is pass in filter with a PTS (presentation timestamp) value:

Faster Video Speed

ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" output.mp4

Slower Video Speed

ffmpeg -i input.mp4 -filter:v "setpts=2*PTS" output.mp4

The lower the PTS value, the faster the time-lapse video is generated.  If you use a larger value, the video will display in slower motion.

Adjust video and audio

If you care to sync the audio speed with the video speed, things get a bit more complicated:

ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mp4

More confusing is that the atempo setting seems to require reverse logic to setpts ; i.e. doubling speed seems to require a different multiple.

I recently used this slow-mo technique on a highlights video downloaded from YouTube to draw my own conclusions about a specific play.  The ability to manipulate video so easily, without a UI, also makes for easy automation of media, especially when you combine this technique with clipping video -- you get just the frames you want at the speed you want.  ffmpeg FTW!

Recent Features

  • By
    Responsive and Infinitely Scalable JS Animations

    Back in late 2012 it was not easy to find open source projects using requestAnimationFrame() - this is the hook that allows Javascript code to synchronize with a web browser's native paint loop. Animations using this method can run at 60 fps and deliver fantastic...

  • By
    Create a CSS Cube

    CSS cubes really showcase what CSS has become over the years, evolving from simple color and dimension directives to a language capable of creating deep, creative visuals.  Add animation and you've got something really neat.  Unfortunately each CSS cube tutorial I've read is a bit...

Incredible Demos

  • By
    Fullscreen API

    As we move toward more true web applications, our JavaScript APIs are doing their best to keep up.  One very simple but useful new JavaScript API is the Fullscreen API.  The Fullscreen API provides a programmatic way to request fullscreen display from the user, and exit...

  • By
    dat.gui:  Exceptional JavaScript Interface Controller

    We all love trusted JavaScript frameworks like MooTools, jQuery, and Dojo, but there's a big push toward using focused micro-frameworks for smaller purposes. Of course, there are positives and negatives to using them.  Positives include smaller JS footprint (especially good for mobile) and less cruft, negatives...

Discussion

  1. Rob

    How can I decrease the speed of a video & audio by 7.5%?

  2. Al

    Very helpful, thanks! One tip about the relation between setpts setting and atempo setting: You don’t actually need to calculate the other one, use the following syntax (e.g. to have a 1.3x faster output):

    ffmpeg.exe -i input.mp4 -filter_complex "[0:v]setpts=PTS/1.3[v];[0:a]atempo=1.3[a]" -map "[v]" -map "[a]" output.mp4

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!