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 echo
antes de ffmpeg y luego haría la última línea done > test.txt
para 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