How to concatenate clips from the same video with ffmpeg I have a long video with different scenes in it.
I want to extract and concatenate 2 scenes from the video (that do not start on an I-frame) using ffmpeg 2.1.4.

For argument, say I want 5 seconds from 01:00 and 02:00.

I can do this:

ffmpeg -ss 01:00 -i in.mkv -ss 02:00 -i in.mkv -filter_complex "
  [0:v]select='lt(t,5)'[v0];
  [0:a]aselect='lt(t,5)'[a0];
  [v0][a0][1:v][1:a]concat=n=2:v=1:a=1
" -c:a libvorbis -t 10 out.mkv


That gives me the movie I want, but select actually forces ffmpeg to decode the entire rest of the movie.  So, how do I tell it to truncate the first movie instead of decoding it?

I would prefer to do this with an ffmpeg complex filter, if possible.  I know that I can just use -t to recode separate movies first, but the extra encoding step is very slow in my case and also loses a fair amount of quality for this video.

I can't seem to find a filter that truncates the length of a steam.  Are there filter nodes that correspond to the -t or -ss parameters?
concat filter

This method is best if you need to perform additional filtering:

Use the trim, atrim, setpts, asetpts, and concat filters:

ffmpeg -i input -filter_complex \
"[0:v]trim=60:65,setpts=PTS-STARTPTS[v0]; \
 [0:a]atrim=60:65,asetpts=PTS-STARTPTS[a0]; \
 [0:v]trim=120:125,setpts=PTS-STARTPTS[v1];
 [0:a]atrim=120:125,asetpts=PTS-STARTPTS[a1]; \
 [v0][a0][v1][a1]concat=n=2:v=1:a=1[out]" \
-map "[out]" output.mkv



setpts and asetpts will prevent a jerky output due to presentation timestamp issues.
Make sure to use a recent version. See the FFmpeg Download page for links to builds for Windows, OS X, and Linux.




concat demuxer

Another method is to to create the segments individually and stream copy them instead of re-encoding (to save time and quality), and join them with the concat demuxer.

$ ffmpeg -ss 60 -i input -t 5 -codec copy clip1.mkv
$ ffmpeg -ss 120 -i input -t 5 -codec copy clip2.mkv
$ echo "file 'clip1.mkv'" &gt; concat.txt
$ echo "file 'clip2.mkv'" &gt;&gt; concat.txt
$ ffmpeg -f concat -i concat.txt -codec copy output.mkv