Как мне перевернуть только часть видео с помощью 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
Объяснение:
Использование filtergraph немного похоже на создание цепочки действий, и есть хорошее визуальное объяснение 1 этого в разделе «Введение в фильтрацию» документации по фильтрам. Фильтры работают со входами - это бит, который вы видите перед фильтром, например, [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:
В libavfilter
фильтр может иметь несколько входов и несколько выходов. Чтобы проиллюстрировать возможные варианты, рассмотрим следующий фильтр-граф.
[main]
input --> split ---------------------> overlay --> output
| ^
|[tmp] [flip]|
+-----> crop --> vflip -------+
Этот фильтр графа разделяет входной поток на два потока, а затем отправляет один поток через фильтр кадрирования и фильтр vflip, а затем объединяет его с другим потоком, накладывая его сверху.
2 Протестировано с использованием ffmpeg version N-72939-g5b0f55a