Cutting video is where FFmpeg shines — and where people accidentally re-encode (slow, lossy) when a stream copy (instant, lossless) would do. The trick is understanding -ss (start) and -to/-t (end/duration), and when keyframes force a small compromise.
Key takeaways
-sssets the start time;-toan end time,-ta duration.-c copymakes cuts instant and lossless — but only at keyframes.- Need a frame-exact cut? Drop
-c copyto re-encode. - The concat demuxer joins clips without re-encoding.
The fast, lossless trim
Put -ss before -i for a fast seek, and copy streams to avoid re-encoding. This extracts 30 seconds starting at 1:05:
ffmpeg -ss 00:01:05 -i input.mp4 -t 30 -c copy clip.mp4
Or use an explicit end time with -to:
ffmpeg -ss 00:01:05 -to 00:01:35 -i input.mp4 -c copy clip.mp4
When the cut starts late or freezes
Stream copy can only cut on keyframes, so a copied clip may begin a moment early/late or show a brief freeze. For a frame-accurate cut, re-encode by removing -c copy:
ffmpeg -ss 00:01:05 -to 00:01:35 -i input.mp4 \ -c:v libx264 -crf 18 -c:a aac clip.mp4
Split a long file into segments
The segment muxer slices a file into equal chunks in one pass:
ffmpeg -i input.mp4 -c copy -map 0 \ -f segment -segment_time 600 -reset_timestamps 1 \ part_%03d.mp4
Join clips back together (concat)
To stitch clips with the same codec/resolution, use the concat demuxer — no re-encode:
printf "file 'a.mp4'\nfile 'b.mp4'\nfile 'c.mp4'\n" > list.txt ffmpeg -f concat -safe 0 -i list.txt -c copy joined.mp4
Want a smooth blend between joined clips instead of a hard cut? Use an xfade transition.
Cut on a real timeline
FFmpegLab gives you a draggable timeline for trimming and splitting, generating the exact -ss/-to command underneath — and it runs entirely offline, so even rough cuts of sensitive footage never upload. Pair it with the compression and format conversion guides for a full export workflow.