Объяснение:

Объяснение:

У меня есть короткий клип продолжительностью 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 секунды.
В этом примере горизонтальное перелистывание происходит каждые 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

Связанный контент