[FFmpeg-user] Batch Join multimono to multichannel Auido (wav /

Oliver Fromme oliver at fromme.com
Thu Jul 10 17:52:39 CEST 2014

Luigi Rensinghoff wrote:
 > i found the solution:
 > #!/bin/sh
 > for f in *C.aif;
 > do
 > #echo "Processing $f"
 > prefix=${f%}
 > pre=`echo $prefix | sed 's/.\{6\}$//'`
 > L=`echo $pre-\(L\).aif`
 > R=`echo $pre-\(R\).aif`
 > C=`echo $pre-C.aif`
 > LFE=`echo $pre-\LFE\.aif`
 > Ls=`echo $pre-S\(L\).aif`
 > Rs=`echo $pre-S\(R\).aif`
 > out=`${pre}_6ch.wav`
 > ffmpeg -i $L -i $R -i $C -i $LFE -i $Ls -i $Rs -filter_complex "[0:a][1:a][2:a][3:a][4:a][5:a]amerge=inputs=6[aout]" -map "[aout]" ${f%-C.aif}_6ch.wav
 > rm $L
 > rm $R
 > rm $C
 > rm $LFE
 > rm $Ls
 > rm $Rs
 > done
 > But i am sure it can be achieved more elegant - Suggestions ???

This is somewhat off-topic, but anyway, here is how I would do it:


channels="L R C LFE Ls Rs"

for f in *-C.aif; do
        #echo "Processing $f"

        set --
        for c in $channels; do
                set -- -i "$pre-$c.aif"

        ffmpeg "$@" -filter_complex "$filter" -map "[aout]" "$out"
        if [ $? -ne 0 ]; then
                echo "****  ffmpeg failed!  Not removing input files!"
                exit 1

        for c in $channels; do
                echo rm -- "$pre-$c.aif"

Note that it is written in a way that all variables are protected
by quotes, so this works even if file names contain "unusual"
characters like spaces, tabs or newlines.

Also note that the rm command has been disabled by an echo
command.  I recommend you enable it only if you've tested the
script and you are sure that it does the right thing.  Unless
you have backup copies of the input files anyway, of course.

Best regards

``We are all but compressed light'' (Albert Einstein)

More information about the ffmpeg-user mailing list