Зациклить аудио файл на заданную длину

5911
Tomcatus

В настоящее время я сталкиваюсь с проблемой, когда мне нужно взять какой-нибудь mp3-файл и создать еще один mp3-файл, в котором первый проигрывается в течение заданного промежутка времени, зацикливая при необходимости. Предпочтительно я ищу решение командной строки. Пробовал ffmpeg и sox, но не смог найти решение с ними. Поэтому сейчас я ищу несколько вариантов.

Дальнейшее объяснение: допустим, у меня есть файл foo.mp3, мне нужно создать файл bar.mp3, который имеет некоторую заданную длину, скажем, 30 секунд и который содержит файл foo.mp3, и если foo.mp3 короче, чем 30 секунд он зацикливается так много раз, что заполняет все 30 секунд. Надеюсь теперь понятно, о чем я прошу.

2
Можете ли вы уточнить свой вопрос. Мне не понятно, о чем ты спрашиваешь. Sun 9 лет назад 0
Обратите внимание, что опция цикла `ffmpeg` работает только с изображениями. Зацикливание аудио / видео - это [открытый запрос функции] (https://trac.ffmpeg.org/ticket/2584). slhck 9 лет назад 0
Опция -stream_loop для ffmpeg существует начиная с dbb03b8e, как указано выше в https://trac.ffmpeg.org/ticket/2584. jamadagni 5 лет назад 0

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

4
Eugen Rieck

ffmpeg can do that for you, but you might need two steps

Optional Step 1: Find length of original file

ffmpeg -i '/path/to/original.mp3' 2>&1 | grep 'Duration :' 

Now you can calculate the number of repetitions necessary. As an alternative, you can just use a "safe" number of repetitions, as too many won't hurt.

Step 2: Loop the file and cut it to needed length

create "concat.txt" with this content

file '/path/to/original.mp3' file '/path/to/original.mp3' ... file '/path/to/original.mp3' file '/path/to/original.mp3' file '/path/to/original.mp3' 

It must have at least as many lines as repetitions are necessary, but, again, more won't hurt, so you can use a safe (too high) line count

And run ffmpeg (assuming you want 123.456 seconds):

ffmpeg -t 123.456 -f concat -i concat.txt -c copy -t 123.456 output.mp3 
Решение не может быть элегантным, но оно делает то, что мне нужно. Может быть, я должен написать запрос на добавление функции для разработчиков ffmpeg, чтобы добавить что-то вроде опции -t с параметром цикла, или, может быть, просто параметр цикла с параметрами секунд для цикла. Но все же спасибо за помощь, Евгений! Это решает мою проблему, ура! Tomcatus 9 лет назад 0
@ Tomcatus Как я уже говорил выше, уже есть запрос функции. Зацикливание и последующее использование `-t` достигли бы того, что вы хотите, если бы это было реализовано… slhck 9 лет назад 0
Я обычно использую это с «безопасным» числом строк - первый `-t` убедится, что вы не прочитали все эти ненужные вещи Eugen Rieck 9 лет назад 0