MP3-Dateipaare in Ordnern mit ffmpeg zusammenfügen

MP3-Dateipaare in Ordnern mit ffmpeg zusammenfügen

Ich habe jede Menge MP3-Dateien in einem Ordner und möchte jedes Paar (Teil 1 und Teil 2) zu einer einzigen MP3-Datei zusammenführen. Alle Dateien haben das gleiche Format.

Ich weiß, dass ich dies mit einem Dateipaar machen kann:

ffmpeg -i "concat:01 Snow White Part 1.mp3|01 Snow White Part 2.mp3" -acodec copy "01 Snow White.mp3"

.. aber wie mache ich das mit einem ganzen Ordner? Dies ist der Ordnerinhalt:

01 Snow White Part 1.mp3
01 Snow White Part 2.mp3
02 Jack and the Beanstalk Part 1.mp3
02 Jack and the Beanstalk Part 2.mp3
03 The Wizard of Oz Part 1.mp3
03 The Wizard of Oz Part 2.mp3
04 Thumbelina Part 1.mp3
04 Thumbelina Part 2.mp3
05 Puss in Boots Part 1.mp3
05 Puss in Boots Part 2.mp3
06 The Lions Glasses Part 1.mp3
06 The Lions Glasses Part 2.mp3
07 The Snow Queen Part 1.mp3
07 The Snow Queen Part 2.mp3
08 Alibaba and the Forty Thieves Part 1.mp3
08 Alibaba and the Forty Thieves Part 2.mp3
09 The Emperor's New Clothes Part 1.mp3
09 The Emperor's New Clothes Part 2.mp3
10 Little Red Riding Hood Part 1.mp3
10 Little Red Riding Hood Part 2.mp3

Antwort1

Angenommen, Sie verwenden Bash unter Linux und alle Dateipaare sind wie von Ihnen aufgelistet nummeriert, würde ich die Nummern mit einer For-Schleife durchlaufen.

for c in {1..10}; do
  c=$(printf '%02.f' "$i")
  fnames=$(find . -maxdepth 1 -name "${i}*" | sort)
  parts=$(wc -l <<< "$fnames")
  if [ "$parts" -gt 1 ]; then 
    fnameout="${fnames%% Part 1*}.mp3"
    ffmpeg -i "concat: $f" -acodec copy "$fnameout"
  fi
done

Wenn es Dateien gibt, die nicht gepaart sind, werden sie ignoriert. Zu Testzwecken würde ich es echovor ffmpeg hinzufügen und dann die letzte Zeile erstellen, done > test.txtdamit ich nach Fehlern oder genialen Ergebnissen suchen kann.

Ich hoffe das hilft.

Antwort2

So habe ich es in macOS/zsh gemacht. Ich bin sicher, es gibt einen einfacheren Weg

PART1FILES=( )
for f in *1.mp3; do 
  PART1FILES+=($f)
done
PART2FILES=( )
for f in *2.mp3; do 
  PART2FILES+=($f)
done


INDEX=0
for i in $PART1FILES; do 
    FILE1=$i
    FILE2=$PART2FILES[INDEX+1]
    NEWFILE="${FILE1:0:-11}.mp3"
    ffmpeg -i "concat:$FILE1|$FILE2" -acodec copy "$NEWFILE"
    let INDEX=${INDEX}+1
done

verwandte Informationen