3

Каждый день у меня на сервере создается около 10 разных mp3-файлов. То, что я хотел бы сделать, это настроить cronjob для запуска ночью и объединить треки текущих дней в один трек mp3. Меня не волнует информация ID3, хотя, если такой метод может объединить их, то это было бы идеально.

Чтобы мне было проще, вот что мне нужно сделать:

  • Объединить .mp3 файлы с текущего дня
  • Удалите отдельные файлы после того, как мне нужен только комбинированный mp3

Я открыт для использования Python или Bash-скрипта, но любые другие решения также будут работать. Возможно ли это сделать?

1 ответ1

2

Решение с использованием протокола concat ffmpeg

Сначала вы должны найти файлы, которые хотите объединить (не более одного дня)

find path/to/files -name '*.mp3' -mtime -1

И объединить их, как описано в другом вопросе. Наконец, строка, используемая для объединения, должна быть изменена, чтобы быть действительной для rm (кавычки вместо каналов и т.д.).

Окончательный сценарий:

#!/bin/bash
concat=$(echo -n "concat:" && find path/to/files -name '*.mp3' -mtime -1 -exec echo -n "{}|" \;)
ffmpeg -i "${concat%|}" -acodec copy output.mp3

IFS=$'\n'
for i in $(echo $concat | sed -e 's/^concat://' -e 's/|$//' -e 's/|/\n/g');
    do rm -i $i
done

${concat%|} удаляет последний канал в переменной, а выражение sed создает список файлов (по одному на строку), которые будут удалены rm .

Сортируемое решение (требуется ffmpeg 1.1 или новее)

В более поздних версиях ffmpeg файлы, которые должны быть объединены, могут быть прочитаны из файла. Это позволяет легко сортировать фрагменты.

#!/bin/bash

IFS=$'\n'

concatlist=$(find /path/to/files -name '*.mp3' -mtime -1 -printf "file '%p'\n" | sort)

ffmpeg -f concat -i <(echo "$concatlist") -c copy output.mp3

for i in $(echo "$concatlist" | sed -e "s/^file '//" -e "s/'$//"); do
    rm -i "$i"
done

Это решение не работает, если одно из имен файлов содержит одну кавычку ('). Если кто-нибудь знает, как это исправить, пожалуйста, измените его.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .