Объединить пары файлов mp3 в папке с помощью ffmpeg

Объединить пары файлов mp3 в папке с помощью ffmpeg

У меня есть куча mp3-файлов в папке, и я хочу объединить каждую пару (часть 1 и часть 2) в один mp3-файл. Все файлы в одном формате.

Я знаю, что могу сделать это с парой файлов:

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

.. но как мне сделать это для всей папки? Вот содержимое папки:

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

решение1

Предполагая, что вы используете bash на Linux и что все пары файлов пронумерованы так, как вы перечислили, я бы перебрал номера с помощью цикла 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

Если есть какие-либо файлы, не объединенные в пару, они будут проигнорированы. Для целей тестирования я бы добавил echoперед ffmpeg, а затем сделал последнюю строку done > test.txt, чтобы я мог проверить либо ошибки, либо блеск.

Надеюсь, это поможет.

решение2

Вот как я это сделал в macOS/zsh. Я уверен, что есть способ проще

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

Связанный контент