Как мне перевернуть только часть видео с помощью 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