How to concatenate (join, merge) media files

Concat demuxer

The concat demuxer was added to FFmpeg 1.1. You can read about it in the documentation.


Create a file mylist.txt with all the files you want to have concatenated in the following form (lines starting with a # are ignored):

Note that these can be either relative or absolute paths. Then you can stream copy or re-encode your files:

It is possible to generate this list file with a bash for loop, or using printfEither of the following would generate a list file containing every *.wav in the working directory:

If your shell supports process substitution (like Bash and Zsh), you can avoid explicitly creating a list file and do the whole thing in a single line. This would be impossible with the concat protocol (see below):

You can also loop a video. This example will loop input.mkv 10 times:

Concat protocol

While the demuxer works at the stream level, the concat protocol works at the file level. Certain files (mpg and mpeg transport streams, possibly others) can be concatenated. This is analogous to using cat on UNIX-like systems or copy on Windows.


If you have MP4 files, these could be losslessly concatenated by first transcoding them to mpeg transport streams. With h.264 video and AAC audio, the following can be used:

If you’re using a system that supports named pipes, you can use those to avoid creating intermediate files – this sends stderr (which ffmpeg sends all the written data to) to /dev/null, to avoid cluttering up the command-line:

All MPEG codecs (H.264, MPEG4/divx/xvid, MPEG2; MP2, MP3, AAC) are supported in the mpegts container format, though the commands above would require some alteration (the-bsf bitstream filters will have to be changed).



Leave a Reply

Your email address will not be published. Required fields are marked *