1

У меня есть каталог 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

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

numFiles=3
maxStart=10
idx=1
for randomStart in $(jot -r $numFiles 0 $maxStart); do
    ffmpeg -y -ss "$randomStart" -i "track${idx}.mp3" -t 10 -c:a copy "track${idx}-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

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

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