Случайно выбрать 10 секунд из mp3 файлов

346
Tony Vincent

У меня есть каталог tracksс 3 - мя файлами track1.mp3, track2.mp3, track3.mp3. Я хочу выбрать случайный фрагмент по 10 секунд из каждого файла и объединить эти фрагменты в новый файл с именем sample.mp3. Как мне сделать это с помощью ffmpeg?

Я довольно новичок в ffmpeg, и все, что мне удалось сделать, это разбить файл на куски

ffmpeg -i track1.mp3 -f segment -segment_time 10 -c copy out%03d.mp3

Кто-нибудь, пожалуйста, помогите. Я на Mac OSX сьерра и Bash оболочки

1

1 ответ на вопрос

3
slhck

Вы можете использовать следующий скрипт bash:

numFiles=3 maxStart=10 idx=1 for randomStart in $(jot -r $numFiles 0 $maxStart); do ffmpeg -y -ss "$randomStart" -i "track$.mp3" -t 10 -c:a copy "track$-chunk.mp3" idx=$((idx + 1)) done 

Здесь вы должны указать количество файлов ( track1до track3) и максимальную начальную позицию (например, если ваши файлы имеют длину всего 20 секунд, вы должны начинать самое большее с 00:00:10).

jotУтилита используется для создания случайных чисел от 0 до $maxStart(то есть, 10 в приведенном выше примере). В Linux jotнедоступен; вместо этого используйте shuf -n $numFiles -i 0-$maxStart.

Затем объедините фрагменты (см. Запись в FFmpeg Wiki ):

ffmpeg -f concat -safe 0 -i <(for f in ./*-chunk.mp3; do echo "file '$PWD/$f'"; done) -c copy output.mp3 

Он использует специальный синтаксис оболочки для создания временного файла конкатенации. Это скопирует битовые потоки, поэтому повторное кодирование не выполняется.

Спасибо за отличный ответ. Вы мне очень помогли, у меня нет возможности заранее узнать длину моих файлов Tony Vincent 6 лет назад 0
В этом случае вам придется подходить к нему по-другому: перебирать файлы, запускать первый проход с помощью ffmpeg или ffprobe, чтобы [получить их длину в секундах] (https://superuser.com/a/945604/48078), и использовать чтобы сгенерировать новое случайное число для максимальной стартовой позиции. Но здесь я бы прекратил использовать Bash и вместо этого использовать Python или Ruby. slhck 6 лет назад 0

Похожие вопросы