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