Вариант 1 - обрезка и зацикливание
Вы можете использовать фильтр atrim
чтобы сначала подрезать ваш ввод до нужной части, а затем использовать фильтр aloop
для зацикливания этого раздела.
ffmpeg -i input.m4a \
-filter_complex " \
[0:a] \
atrim=0:3,asetpts=PTS-STARTPTS, \
asetrate=48000,aloop=2:size=3*48000 \
[outa]" \
-map "[outa]" \
-c:a aac \
out.m4a
В приведенном выше примере обратите внимание на следующие параметры:
- ввод сокращается от 0 до 3 секунд с помощью
atrim
- аудио зациклено на 3⨉ (
aloop=2
)
- размер цикла задается с
size=3*48000
- аудиокодек AAC со стандартными параметрами качества (
-c:a aac
)
Если вы хотите другую продолжительность, например, от 5 до 10 секунд, измените atrim=5:10
и измените size=5*48000
.
К сожалению, в фильтре aloop
требуется установить размер зацикленной части в сэмплах - в нашем случае это 3 секунды - 48 000 сэмплов. Поскольку вы не знаете входную частоту дискретизации, вы должны сначала установить ее на 48000 Гц с помощью фильтра asetrate
.
Если есть более простой способ, я был бы рад узнать об этом, но, к сожалению, источник входного сигнала amovie
не позволяет обрезать на лету.
Вариант 2 - зацикливание, затем остановка
Альтернативой может быть:
ffmpeg -ss 0 -i input.m4a \
-filter_complex " \
[0:a]asetrate=48000,aloop=1:size=3*48000[outa]" \
-map "[outa]" \
-t 6 \
-c:a aac \
out.m4a
Здесь вход не обрезается; это просто размер цикла, который определяет длину цикла. Но тогда вы должны указать общую продолжительность вывода (т.е. 6 секунд) с помощью -t
. Если вы хотите другое смещение, используйте ffmpeg -ss <timestamp> -i input.m4a
, где <timestamp>
- точка поиска.