56

I found this example

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

but I have a video I want to speed up by 60 times, not just 2X.

0
74

Simply multiply by the reciprocal of the speed factor.

ffmpeg -i input.mkv -filter:v "setpts=PTS/60" output.mkv

This does not affect the audio speed. Use -an to ignore audio.


A faster method, but which can have unexpected results with audio (pauses or async):

ffmpeg -itsscale 0.01666 -i input.mkv -c copy output.mkv

where 0.01666 is 1/60 in decimal representation.

11
  • 12
    While the playback speed seems to be changed for this, the video duration seems to be represented incorrectly; e.g., a 3 minute video sped up 3x will still show as being 3 minutes long. If you play it in a video player (e.g., VLC) the video will only take up the first minute and then freeze on a frame for the remaining 2 minutes. – jrh Nov 19 '18 at 21:55
  • 1
    Does it have audio? – Gyan Nov 20 '18 at 5:45
  • 9
    It does make sense that ffmpeg would leave the full length of the video because there was still audio data. Good catch, it turns out, it did have audio (my speakers were muted). With the -an parameter, the length of the video is set properly. – jrh Nov 20 '18 at 18:12
  • 5
    Yes, video playback speed is governed by packet metadata. 60x is a very high speed up and players will usually choke. You'll see more expected results with, say, a 6x speed up. Players can't "skip" frames in a compressed video bitstream since almost all frames depend on one or more surrounding frames for decoding. So, you have to drop frames and re-encode i.e. a timelapse, e.g. ffmpeg -i input -vf framestep=60,setpts=N/30/TB -r 30 -an out.mp4 – Gyan Feb 25 '20 at 4:15
  • 2
    There's a large difference in these two methods in terms of file size, at least for my specific movie. The former outputs a video that's ~100x smaller, while the latter outputs a file that's the same size as the original. – Jessime Kirk Mar 29 '20 at 0:20
18

If you also want to speed up the audio, you need to do this:

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

Docs: https://trac.ffmpeg.org/wiki/How%20to%20speed%20up%20/%20slow%20down%20a%20video

The command above works if you want to multiply by 2 the speed. If you want to multiply by any x (between 0 and 2), the parameters become:

  ffmpeg -i input.mkv -filter_complex "[0:v]setpts=<1/x>*PTS[v];[0:a]atempo=<x>[a]" -map "[v]" -map "[a]" output.mkv

For instance, if you want to multiply by 1.15, the command is

  ffmpeg -i input.mkv -filter_complex "[0:v]setpts=0.87*PTS[v];[0:a]atempo=1.15[a]" -map "[v]" -map "[a]" output.mkv
1
  • atempo has a range 0 to 2. can't be any x. – Harry Jan 4 at 20:42
3

I wanted to speed up the audio and video many times beyond 2x too. For 60x speed, do the following. It may be a bit verbose, but it works great. The problem is that atempo cannot be greater than two or less than 0.5, so we must repeat atempo many times to get the sound to the rate that we want it.

ffmpeg -i input.mkv -filter:v "setpts=PTS/60" -filter:a "atempo=2,atempo=2,atempo=2,atempo=2,atempo=2,atempo=1.875" output.mkv

Press Ctrl+Shift+I, and click the "console" tab. Then, copy and paste this code into the console. In Chrome, click just right of the blue arrow. In Firefox, type allow pasting into the console to allow copy'n'paste. Then, press Enter run the following JS code to generate other speeds. The code also works with slowing down the video.

var speed=eval(prompt("Enter speed up or slowdown factor (>1 is speedup, " +
    "<1 is slowdown; can use 1/X for slowdown): ", "60"));

var k=speed, audio="";
while (2 < k && k === k) k /= 2, audio+="atempo=2,";
while (k < 0.5 && k === k) k *= 2, audio+="atempo=0.5,";
audio += "atempo=" + k;
prompt(
    "Copy the following commandline: ",
    'ffmpeg -i input.mkv -filter:v "setpts=PTS/' + speed +
    '" -filter:a "' + audio + '" output.mkv'
);

This code will prompt you to enter a value and present you with the result. Entering 60 yields a 60X speedup, entering 0.1 yields a 10X slowdown, and entering 1/30 yields a 30X slowdown. I hope this helps.

2
  • In "atempto=1.875", would atempto be atempo? – Harry Jan 4 at 23:02
  • @Harry You are absolutely correct. Thank you so much for finding that typo. – Jack Giffin Jan 5 at 0:46

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.