Version 12 (modified by slhck, 6 years ago) (diff)

copyedit; clarified a few things here and there


If you need to extract only a specific part of your input, you'll need to use the seeking option to get to that specific part in the input first. The parameter -ss is used to seek into the input and it can be used in several ways.

Fast seeking

The -ss parameter needs to be specified before -i:

ffmpeg -ss 00:03:00 -i Underworld.Awakening.avi -frames:v 1 out1.jpg

This example will produce one image frame (out1.jpg) somewhere around the third minute from the beginning of the movie. The input will be parsed using keyframes, which is very fast. The drawback is that it will also finish the seeking at some keyframe, not necessarily located at specified time (00:03:00), so the seeking will not be as accurate as expected.

Accurate seeking

The -ss parameter needs to be specified after -i:

ffmpeg -i Underworld.Awakening.avi -ss 00:03:00 -frames:v 1 out2.jpg

This example will also produce one image frame (out2.jpg) precisely at the third minute from the beginning of the movie.

Note the time difference on the clocks between the images out1.jpg and out2.jpg. The first one shows "00:02:05:05" and the second shows "00:02:05:06".

Here, the input will be decoded until it reaches the position given by -ss. This will be done very slowly, frame by frame. The advantage is that you'll get the frame at the third minute, but the drawback is that it will take a lot of time until it finally reaches that time point. The bigger the seeking time is, the longer you will have to wait.

Fast and accurate seeking

For this we specify the -ss parameter before and after -i:

ffmpeg -ss 00:02:30 -i Underworld.Awakening.avi -ss 00:00:30 -frames:v 1 out3.jpg

This approach is combining the best characteristics of both fast and accurate ways of seeking in ffmpeg. We first seek very fast somewhere before the third minute. Then we slow down and seek frame by frame to the third minute. This works because ffmpeg will first seek by keyframes, until it reaches 00:02:30. This is where it stops at the last keyframe found (somewhere before 00:02:30, depending on the GOP size/keyframe interval of the input) and then it will slowly seek the next 00:00:30 seconds to the desired time point. The result should be the same as in "Accurate seeking" section, only a lot faster.

Note that both out2.jpg and out3.jpg show the same time on the clock "00:02:05:06"

There is no general rule on how to correctly set both time points for -ss options, because those depend on the keyframe interval used when the input was encoded. To give some orientation, the x264 encoder by default uses a GOP size of 250 (which means 1 keyframe each 10 seconds if the input frame rate is 25 fps).


Cutting small sections

To extract only a small segment in the middle of a movie, it can be used in combination with -t which specifies the duration, like -ss 60 -t 10 to capture from second 60 to 70. Or you can use the -to option to specify an out point, like -ss 60 -to 70 to capture from second 60 to 70. -t and -to are mutually exclusive. If you use both, -t will be used.

Note that if you specify -ss before -i only, the timestamps will be reset to zero, so -t and -to have the same effect:

ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy cut.mp4
ffmpeg -i video.mp4 -ss 00:01:00 -to 00:02:00 -c copy cut.mp4

Here, the first command will cut from 00:01:00 to 00:03:00 (in the original), whereas the second command would cut from 00:01:00 to 00:02:00, as intended.

If you cut with stream copy (-c copy) you need to use the `-avoid_negative_ts 1` option if you want to use that segment with the concat demuxer .


ffmpeg -ss 00:03:00 -i video.mp4 -t 60 -c copy -avoid_negative_ts 1 cut.mp4

Timestamp syntax

Note that you can use two different formats, 00:02:30 or 150, i.e. [HH:MM:SS] or just seconds. They mean the same thing. Also, if you use a fraction, like 02:30.05 this is interpreted as "5 100ths of a second" not as frame 5. For instance, 02:30.5 would be 2 minutes, 30 seconds, and a half a second.

Doing a bitstream copy gives me a broken file?

If you use -ss with -c:v copy, the resulting bitstream might end up being choppy, not playable, or out of sync with the audio stream, since ffmpeg is forced to only use/split on i-frames.

Multiple cuts at once

You can do do multiple splits with the same file as well, see How to split video efficiently, which may or may not save you time/CPU.

Attachments (4)

Download all attachments as: .zip