3

I am trying to concat a few .mp4 files. I first create intermediate .mpg clips, and then merge them together with 'cat' command; then convert it to .mp4 files

for example,

ffmpeg -i input1.mp4 -qscale:v 1 intermediate1.mpg
ffmpeg -i input2.mp4 -qscale:v 1 intermediate2.mpg

// Now merge them together

cat intermediate1.mpg intermediate2.mpg > intermediate_all.mpg
ffmpeg -i intermediate_all.mpg -qscale:v 2 output.mp4

Now, I would like to merge all .mpg files within a directory the following command works if I have max 9 .mpg files

cat folder/*.mpg > intermediate_all.mpg

But, if I got more then 9 .mpg files, the movie sequence breakes, meaning no. 10 clip shows up after no. 1 clip which I do not want. Is there any naming convention that I can follow with ffmpeg. In imagemagick, I can easily use the following syntax and it works, but in ffmpeg it is not working.

cat folder/%d.mpg or cat folder/%d.mpg[0-10] 
Anay Bose
  • 880
  • 1
  • 14
  • 24
  • I recommend using the [concat demuxer](http://stackoverflow.com/questions/7333232/concatenate-two-mp4-files-using-ffmpeg) instead. You can possibly avoid re-encoding (depending on your inputs). – llogan Oct 25 '15 at 23:34

2 Answers2

0

Sure. When you create your intermediate files, zero-pad the numbers like this:

ffmpeg -i input1.mp4 -qscale:v 1 intermediate01.mpg
ffmpeg -i input2.mp4 -qscale:v 1 intermediate02.mpg

then when you do the cat *.mpg it will pick them up in the correct order. If you are using a loop to make the intermediate files, use printf to zero-pad the numbers like this:

#!/bin/bash

    for i in {1..20}; do
        inname=input${i}.mp4 
        outname=$(printf "intermediate%03d.mpg" $i)
        echo Converting "$inname" to "$outname"
        ffmpeg -i "$inname" -qscale:v 1 "$outname"
   done

Output

Converting input1.mp4 to intermediate001.mpg
ffmpeg -i input1.mp4 -qscale:v 1 intermediate001.mpg
Converting input2.mp4 to intermediate002.mpg
ffmpeg -i input2.mp4 -qscale:v 1 intermediate002.mpg
Converting input3.mp4 to intermediate003.mpg
ffmpeg -i input3.mp4 -qscale:v 1 intermediate003.mpg
Converting input4.mp4 to intermediate004.mpg
ffmpeg -i input4.mp4 -qscale:v 1 intermediate004.mpg
Converting input5.mp4 to intermediate005.mpg
ffmpeg -i input5.mp4 -qscale:v 1 intermediate005.mpg
Converting input6.mp4 to intermediate006.mpg
ffmpeg -i input6.mp4 -qscale:v 1 intermediate006.mpg
Converting input7.mp4 to intermediate007.mpg
ffmpeg -i input7.mp4 -qscale:v 1 intermediate007.mpg
Converting input8.mp4 to intermediate008.mpg
ffmpeg -i input8.mp4 -qscale:v 1 intermediate008.mpg
Converting input9.mp4 to intermediate009.mpg
ffmpeg -i input9.mp4 -qscale:v 1 intermediate009.mpg
Converting input10.mp4 to intermediate010.mpg
ffmpeg -i input10.mp4 -qscale:v 1 intermediate010.mpg
Converting input11.mp4 to intermediate011.mpg
ffmpeg -i input11.mp4 -qscale:v 1 intermediate011.mpg
Converting input12.mp4 to intermediate012.mpg
ffmpeg -i input12.mp4 -qscale:v 1 intermediate012.mpg
Converting input13.mp4 to intermediate013.mpg
ffmpeg -i input13.mp4 -qscale:v 1 intermediate013.mpg
Converting input14.mp4 to intermediate014.mpg
ffmpeg -i input14.mp4 -qscale:v 1 intermediate014.mpg
Converting input15.mp4 to intermediate015.mpg
ffmpeg -i input15.mp4 -qscale:v 1 intermediate015.mpg
Converting input16.mp4 to intermediate016.mpg
ffmpeg -i input16.mp4 -qscale:v 1 intermediate016.mpg
Converting input17.mp4 to intermediate017.mpg
ffmpeg -i input17.mp4 -qscale:v 1 intermediate017.mpg
Converting input18.mp4 to intermediate018.mpg
ffmpeg -i input18.mp4 -qscale:v 1 intermediate018.mpg
Converting input19.mp4 to intermediate019.mpg
ffmpeg -i input19.mp4 -qscale:v 1 intermediate019.mpg
Converting input20.mp4 to intermediate020.mpg
ffmpeg -i input20.mp4 -qscale:v 1 intermediate020.mpg
Mark Setchell
  • 191,897
  • 31
  • 273
  • 432
0

Here is a solution I have just crafted using PHP as the scripting language. We can use PHP's natural order algorithm.

$line = '';
$files = glob($location . "/*.mpg"); 
natsort($files);
    foreach ($files as $filename) 
    {
        $line .= " " . $filename; 
    }

 $command = "cat $line > $location/intermediate_all.mpg";
 exec($command); 
Anay Bose
  • 880
  • 1
  • 14
  • 24