Unir pares de archivos mp3 en una carpeta con ffmpeg

Unir pares de archivos mp3 en una carpeta con ffmpeg

Tengo una gran cantidad de archivos mp3 en una carpeta y quiero fusionar cada par (Parte 1 y Parte 2) en un solo archivo mp3. Todos los archivos están en el mismo formato.

Sé que puedo hacer esto en un par de archivos:

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

.. pero ¿cómo lo haría en una carpeta completa? Este es el contenido de la carpeta:

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

Respuesta1

Suponiendo que esté usando bash en Linux y suponiendo que todos los pares de archivos estén numerados como lo había enumerado, repetiría los números con un bucle for.

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

Si hay algún archivo que no esté emparejado, se ignorará. Para fines de prueba, agregaría echoantes de ffmpeg y luego haría la última línea done > test.txtpara poder verificar si hay errores o brillo.

Espero que esto ayude.

Respuesta2

Así es como lo hice en macOS/zsh. Estoy seguro de que hay una manera más fácil

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

información relacionada