
У меня есть короткий клип продолжительностью 3 минуты, который переворачивается слева направо только примерно на 30 секунд в середине.
Итак, если бы все это перевернулось слева направо, я бы просто хотел применить:
ffmpeg -i 3min.mp4 -vf hflip flipped_3min.mp4
Но поскольку он перевернут лишь частично, есть ли способ в одной команде ffmpeg применить временной сегмент для этого фильтра hflip (1:30-2:00)?
Я ищу какую-нибудь документацию по этому поводу и не могу ничего найти. Интересно, возможно ли это в FFmpeg или нет.
решение1
Как перевернуть только часть видео с помощью ffmpeg
?
Здесь,-filter_complex
ваш друг, поскольку он может создавать цепочки отфильтрованного ввода. Мы по-прежнему будем использовать фильтр, hflip
упомянутый в вопросе в графе фильтров.
Вы можете подать заявку в подраздел следующим образом:
ffmpeg -i input.mp4 -filter_complex "[0:v]trim=start=0:duration=90[a];\
[0:v]trim=start=90:duration=30,setpts=PTS-STARTPTS[b];\
[b]hflip[c];\
[a][c]concat[d];\
[0:v]trim=start=120:duration=60,setpts=PTS-STARTPTS[e];\
[d][e]concat[out1]" -map [out1] flip.mp4
Одна строка для легкого копирования и вставки:
ffmpeg -i input.mp4 -filter_complex "[0:v]trim=start=0:duration=90[a];[0:v]trim=start=90:duration=30,setpts=PTS-STARTPTS[b];[b]hflip[c];[a][c]concat[d];[0:v]trim=start=120:duration=60,setpts=PTS-STARTPTS[e];[d][e]concat[out1]" -map [out1] flip.mp4
Объяснение:
Использование фильтр - графа немного похоже на создание цепочки действий, и вРаздел «Фильтрация Введение»документации фильтров. Фильтры работают свходы- это тот бит, который вы видите перед фильтром, например [0:v]
(видео первого входного потока) или [a]
(созданного выходного потока с именем a
) - ивыходы. То есть,входиливходыпреобразуются в соответствии с а filter
и затем выводятся либо каквыходиливыходы.
У нас есть простой набор действий, и если мы последовательно их выполним, то сможем построить граф-фильтр входов и выходов.
Сегменты
Создайте 3 сегмента видео (из входных данных [0:v]
), используя trim
:
- Первый сегмент (90 секунд), ничего не делать (вывести как
[a]
) - Второй сегмент (30 секунд),
hflip
иsetpts
чтобы избежать проблем с длительностью (вывести обрезку как[b]
и передать ееhflip
в вывести как[c]
)
Затем эти два результата concat
объединяются для создания выходного сигнала [a]+[c] -> [d]
(продолжительность: 120 с).
- Третий сегмент (60 секунд), снова установите PTS (вывод как
[e]
)
Объедините сегменты для создания выходных данных [d] + [e] -> [out1]
, а -map
затем добавьте их в конечный выходной файл.
Это дает вам видео той же длительности, что и оригинал (180 с), но с 30-секундным фрагментом в середине, который перевернут по горизонтали 2 .
1 :
Визуальное представление отffmpeg
фильтры документация
В
libavfilter
фильтр может иметь несколько входов и несколько выходов. Чтобы проиллюстрировать возможные типы вещей, рассмотрим следующий фильтр-граф.
[main]
input --> split ---------------------> overlay --> output
| ^
|[tmp] [flip]|
+-----> crop --> vflip -------+
Этот фильтр-граф разделяет входной поток на два потока, затем отправляет один поток через фильтр обрезки и фильтр vflip, а затем объединяет его с другим потоком, накладывая его сверху.
2 Протестировано с использованиемffmpeg version N-72939-g5b0f55a
решение2
В этом примере горизонтальное перелистывание происходит каждые 2–3 секунды.
Некоторые фильтры поддерживают временную шкалу черезвключить опцию.
Вы можете увидеть список фильтров и если они поддерживают временную шкалу с ffmpeg -filters
. " T
" перед именем фильтра указывает на то, что он поддерживает редактирование временной шкалы. Если нужный вам фильтр не поддерживает временную шкалу, обновите его, ffmpeg
так как фильтры иногда обновляются для поддержки этого. В противном случае используйте фильтры обрезки, как описано в другом ответе.
ffmpeg
пример:
ffmpeg -i input -vf "hflip=enable='between(t,90,120)'" -c:a copy output
ffplay
пример:
ffplay -vf "hflip=enable='between(t,90,120)'" input