Cutting the dead air off the start of a recording, or grabbing one section out of a long video, shouldn’t mean re-rendering the entire file or uploading it to an editor site. Most editors re-encode everything just to chop the ends, which is slow and quietly drops quality.
FFmpeg in WSL can cut by copying the existing streams — no re-encoding at all. It finishes almost instantly, the output is bit-for-bit as good as the source, and the file never leaves your machine. It’s free and there’s no length limit.
No WSL yet? See the WSL install guide.
Install FFmpeg
sudo apt update && sudo apt install -y ffmpeg
Confirm:
ffmpeg -version
Trim by start and end time
The key is -c copy, which copies streams instead of re-encoding. Cut from 30 seconds to 1 minute 45:
ffmpeg -ss 00:00:30 -to 00:01:45 -i input.mp4 -c copy output.mp4
-ss 00:00:30is the start time.-to 00:01:45is the end time.-c copydoes the magic: no re-encoding, no quality loss, near-instant.
Times can be HH:MM:SS or plain seconds (-ss 30 -to 105).
Trim by start and duration
If you’d rather specify how long the clip should be, use -t (duration) instead of -to:
ffmpeg -ss 00:00:30 -t 00:00:15 -i input.mp4 -c copy output.mp4
That takes 15 seconds starting at 30 seconds.
The keyframe trade-off
Stream copy is fast and lossless because it doesn’t decode the video — but that’s also its one limitation. Cuts can only happen on keyframes, which appear periodically through the video. FFmpeg starts at the nearest keyframe to your requested time, so the beginning of a copied clip may be off by a second or two.
For most trims — topping and tailing a recording, pulling a rough section — that’s fine. When you need the cut to land on an exact frame, re-encode instead:
ffmpeg -ss 00:00:30 -to 00:01:45 -i input.mp4 -c:v libx264 -crf 20 -c:a aac output.mp4
This decodes and re-encodes, so it can cut anywhere, at the cost of time and a small quality hit. See compress a video without losing quality for the CRF settings.
Trim options
| -ss START -to END -c copy | Cut from start to end, instant, lossless |
|---|---|
| -ss START -t DURATION -c copy | Cut a fixed-length clip, lossless |
| -ss before -i | Fast input seeking (recommended for copy) |
| -c:v libx264 (no -c copy) | Re-encode for a frame-exact cut |
Why -ss goes before -i
Putting -ss before -i (input seeking) tells FFmpeg to jump close to the start point before it begins reading, which makes the cut fast. Putting it after -i reads from the beginning and is slower. For stream-copy trims, before -i is the standard, efficient choice.
Cut several files the same way
To trim the same window out of every MP4 in a folder:
mkdir -p trimmed
for f in *.mp4; do ffmpeg -ss 00:00:05 -to 00:00:35 -i "$f" -c copy "trimmed/$f"; done
Each result lands in trimmed/ with the originals untouched.
Wrapping up
Trimming without re-encoding is one FFmpeg pattern: ffmpeg -ss START -to END -i input.mp4 -c copy output.mp4. It’s instant and lossless, with the only caveat that copied cuts snap to keyframes — so the start may shift slightly. When you need a frame-exact cut, drop -c copy and re-encode.
It’s free, it batches, and it runs in WSL — so your videos never get uploaded. The same FFmpeg install handles converting MOV/MKV to MP4 and making GIFs from clips.