Speed a video up or slow it down, choosing what happens to the pitch (time stretch or resample) and to the frames (keep the rate or keep every frame). Both choices reach the export, and the finished length is read back off the file.
Initializing in your browser…
Cut a clip out of a video, choosing whether the cut lands on the exact frame (re-encodes to MP4) or leaves the streams untouched (instant and lossless, but only at a keyframe). The result says which ran and reads the real length back off the file.
Convert a video between MP4, WebM, OGG, MOV, AVI and MKV, each naming the codecs it really writes and each producing a file that actually plays. One quality dial normalised into four different encoder scales.
Join clips end to end, saying in advance whether they can be stitched together untouched and, when they cannot, exactly which differences stop it. Clips of different sizes are letterboxed into one frame rather than squashed.
A 2 second 30 fps clip at 2x, run twice: once keeping the pitch and once letting it follow.
Input
counter.mp4 2.000 s 30 fps 440 Hz tone - 2x speed
Output
Both 1.000 s at 30 fps. Pitch kept: still 440 Hz. Pitch following: 880 Hz
The two audio paths are genuinely different filters and the toggle now reaches both: atempo time stretches, which leaves the pitch alone, and asetrate resamples, which moves it with the speed. The length is exact because the output frame rate is now stated rather than left to the encoder; before this pass the same clip came out 1.067 seconds at 2x and 0.567 at 4x.
Retiming a video is three decisions, not one, and this tool now makes all three visible instead of picking silently. **What happens to the length** is the easy one: the new length is the old length divided by the speed, and after every run the tool reads the length back off the file it made and prints it next to the number it predicted. **What happens to the frames** is the one that used to be decided by accident. `setpts` moves the presentation times and leaves the frame count alone, so a 2x speedup of 30 fps material is the same frames at 60 fps. You can either keep the source rate, which drops half the frames when speeding up and repeats each frame when slowing down, or keep every frame and write the output at a different rate. Both are offered here, with the consequence spelled out. Before this pass neither was chosen and the encoder was left to guess: a 2 second clip at 2x came out 1.067 seconds instead of 1.000, and at 4x came out 0.567 instead of 0.500. **What happens to the pitch** is a genuine choice that the page had been offering for a while without wiring up. `atempo` is a time stretch: it changes the speed and leaves the pitch alone, so sped-up dialogue stays intelligible. `asetrate` resamples: it changes both together, the way a tape machine does, so 2x really is an octave up. The buttons now do what they say.
Speed a long recording up. Keep the source frame rate so the output plays at a normal rate with frames dropped, which is what a time-lapse is.
Slow a clip down. Neither mode invents new pictures, so the result is either repeated frames or a low frame rate; real slow motion has to be shot at a high frame rate to begin with.
Slow speech to 0.75x with the pitch kept, so the voice stays natural and only the pace changes.
Let the pitch follow the speed for a deliberately deep or chipmunk voice, which is the tape machine effect rather than a time stretch.
Everything runs in the browser through ffmpeg compiled to WebAssembly; nothing is uploaded. The export is a single pass whose filter graph the page prints in full with the result.
The audio chain is worth explaining because it has a rule that catches people out. `atempo` accepts a factor between 0.5 and 2.0 and nothing else, so any speed outside that has to be a chain, and the chain has to multiply out to the factor asked for. Each stage here is the nth root of the speed, so 4x is two stages of 2 and 0.25x is two stages of 0.5, and the page prints the product of the stages next to the speed requested so the identity can be seen rather than assumed. A sibling function in the same file used to fill its chain with literal 0.5 and 2 steps instead, which turned a request for 3x into 4x; it had no callers and has been deleted.
A source with no audio track at all used to fail outright, because the filter graph mapped `[0:a]` regardless of whether there was one. The graph is now built from what the file actually contains: a silent source gets a video-only graph and produces a silent output, and the page says that is what it is doing.
The rest is ordinary. Eight presets from 0.25x to 4x plus a fine slider, the live preview applying the speed and the pitch setting to the player so you can hear the effect first, an encoding speed preset and a CRF for the re-encode, a Cancel button, and a result panel with the file size, the frame rate written, the expected length, the length read back, and the exact ffmpeg command. The output is MP4 with H.264, because a retime cannot avoid re-encoding and that is what the encoder produces.
Only if you ask it to. The default holds the pitch with a time stretch, so dialogue at 2x sounds like the same person talking faster. Switching to "Let it follow" resamples instead, which raises the pitch by 1200 cents at 2x and lowers it by the same at 0.5x.
At 2x on 30 fps material, keeping the rate writes 30 fps and throws away half the frames; keeping every frame writes 60 fps and throws away nothing. The length is the same either way. For a time-lapse the first is normal. For slowing down, keeping every frame lowers the rate, which can look juddery, while keeping the rate repeats each frame, which looks stepped. Neither invents pictures.
The video stream does match, to a thousandth of a second. The container can be about twenty milliseconds longer because an AAC encoder writes whole frames of 1024 samples and pads the last one, which at 44.1 kHz is 23 milliseconds. The result panel shows both numbers so the difference is visible rather than hidden.
The presets stop there, but the chain behind them has no such limit: atempo stages are built as the nth root of whatever speed is asked for, so any factor multiplies out exactly. The limits are about what looks and sounds usable rather than about the arithmetic.
It works. The filter graph is built from what the file contains, so a silent source gets a video-only graph. It used to map an audio stream that was not there, and the whole run failed.
Video is decoded and re-encoded on your own device. Large files never leave your machine.