Use this to cut video from
[duration]. Make sure you download a recent version of
ffmpeg, and don't use the one that comes with your distribution (e.g. Ubuntu).
ffmpeg -i in.mp4 -ss [start] -t [duration] -c:v copy -c:a copy out.mp4
Here, the options mean the following:
-ss specifies the start time, e.g.
83 (in seconds)
-t specifies the duration of the clip (same format).
ffmpeg also has a flag to supply the end time with
-c:v copy and
-c:a copy copy the video and audio bitstreams without re-encoding them. This won't harm the quality and make the command run within seconds. You can replace the two options with
-c copy if you want to copy one video, audio and subtitle stream to the output.
- If you leave out the
-c copy option,
ffmpeg will automatically re-encode the output video and audio according to the format you chose. For high quality video and audio, read the x264 Encoding Guide and the AAC Encoding Guide, respectively.
However, there's one drawback. The video will have to be decoded until it reaches the position implied by
-ss, and only then it starts copying the bitstream. This can take a long time, especially for really long videos.
For additional speed when doing this, you can supply the
-ss option before
-i. This way, the decoder will first seek to the position and then start decoding:
ffmpeg -ss [start] -i in.mp4 -t [duration] -c:v copy -c:a copy out.mp4
This might not be that accurate, so choose the appropriate command depending on what results you get. See also: Seeking with FFmpeg
If you need to use an old version of
ffmpeg and can't use the
-to option, you can create an edit list of in and out points, and convert these into in points with duration. For this you can use this Ruby script I wrote, which calculates the difference:
def time_diff(time1_str, time2_str)
t = Time.at( Time.parse(time2_str) - Time.parse(time1_str) )
(t - t.gmt_offset).strftime("%H:%M:%S.%L")