Joining MP4 Files with FFmpeg

Joining MP4 Files with FFmpeg

Requirements

Install FFmpeg and make sure it is available:

ffmpeg -version

Join MP4 files without re-encoding (recommended)

This method is the fastest because the video and audio streams are copied directly without quality loss.

It requires all files to have the same codec, resolution, FPS, and audio format.

Create a file list

Create files.txt:

file 'video1.mp4'
file 'video2.mp4'
file 'video3.mp4'

The order in this file determines the order in the final video.

Merge files

Run:

ffmpeg -f concat -safe 0 -i files.txt -c copy output.mp4

Automatically create the file list (Linux/macOS)

For all MP4 files in the current directory:

for f in *.mp4; do
    echo "file '$f'"
done > files.txt

Then merge:

ffmpeg -f concat -safe 0 -i files.txt -c copy merged.mp4

Join MP4 files with re-encoding

Use this if the files have different codecs, resolutions, FPS, or you get errors with -c copy.

Example:

ffmpeg \
-i video1.mp4 \
-i video2.mp4 \
-i video3.mp4 \
-filter_complex \
"[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" \
-map "[outa]" \
output.mp4

This method:

  • converts the video streams
  • normalizes different input files
  • takes longer

Merge files directly from the command line

printf "file '%s'\n" *.mp4 > files.txt
ffmpeg -f concat -safe 0 -i files.txt -c copy merged.mp4

Troubleshooting

Non-monotonous DTS error

Try:

ffmpeg -fflags +genpts -f concat -safe 0 -i files.txt -c copy output.mp4

Check video information

Use:

ffprobe video1.mp4

If the files have different parameters, use the re-encoding method.


Removing source files

FFmpeg does not delete the original files.

After checking the output:

rm video1.mp4 video2.mp4 video3.mp4