Цикл аудіофайлу на задану довжину


2

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

Подальше пояснення: Скажімо, у мене є файл foo.mp3, мені потрібно створити файл bar.mp3, який має деяку задану довжину, скажімо 30 секунд, що містить файл foo.mp3, а якщо foo.mp3 коротший ніж 30 секунд, він стає циклічним стільки разів, що він заповнює цілих 30 секунд. Сподіваюся, зараз зрозуміло, про що я прошу.


Чи можете ви уточнити своє запитання. Мені незрозуміло, що це ти запитуєш.
Нд

1
Варіант -stream_loop для ffmpeg існує з dbb03b8e, як зазначено в trac.ffmpeg.org/ticket/2584, пов'язаному вище.
джамадагні

Відповіді:


4

ffmpeg може зробити це для вас, але вам можуть знадобитися два кроки

Необов’язковий крок 1: Знайдіть довжину вихідного файлу

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

Тепер ви можете розрахувати кількість необхідних повторів. Як альтернативу, ви можете просто використовувати "безпечну" кількість повторень, оскільки занадто багато не зашкодить.

Крок 2: Обведіть файл і виріжте його до потрібної довжини

створити "concat.txt" з цим вмістом

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'

У ньому повинно бути принаймні стільки рядків, скільки потрібно повторень, але, знову ж таки, більше не зашкодить, тому ви можете використовувати безпечний (занадто високий) кількість рядків

І запустіть ffmpeg (припускаючи, що вам потрібно 123,456 секунди):

ffmpeg -t 123.456 -f concat -i concat.txt -c copy -t 123.456 output.mp3

Рішення не може бути елегантним, але воно робить те, що мені потрібно. Можливо, я повинен поставити запит на особливості для розробників ffmpeg, щоб поставити щось на кшталт -t варіант з опцією циклу, а може бути просто варіант циклу з параметрами секунд для циклу. Але все ж, дякую за вашу допомогу Євгене! Це вирішує мою проблему, ура!
Tomcatus

@Tomcatus Як я вже згадував вище, вже є запит на функцію. Цикл і потім використання -tдозволить досягти того, що ви хочете, якби це було реалізовано…
slhck

Я звичайно використовую це з "безпечною" кількістю рядків - перший -tпереконається, що ви не прочитаєте все те непотрібне
Євген Рік

@slhck Що таке URL-адреса запиту та чи була вона реалізована? Спасибі
Роель Ван де Паар

@RoelVandePaar Цей запит на функцію -stream_loopбув реалізований.
slhck
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.