Сегодня посмотрим на ещё один фильтр ffmpeg который позволяет создавать анимацию исчезновения/появления fade (in/out). Он простой и понятный но в предыдущих видосах я его не использовал.
Фильтры же split, trim и concat я тоже раньше не показывал. А они позволяют значительно эффективнее собирать наши видео из картинок и текста, а также строка аргументов для ffmpeg с этими фильтрами выглядит компактнее и короче.
Фильтр fade для ffmpeg
Плавно показывает или скрывает поданных к нему входной поток. В моем случае с его помощью я показываю в видео очередную картинку и скрываю её. В качестве аргументов мы передаем время начала применения фильтра к потоку (в секундах или кадрах), а также время длительности фильтра (также в секундах или кадрах). Подробнее здесь.
Фильтр split
Позволяет разбить поток на несколько дублей. Это удобно когда я использую результат работы цепочки фильтров в другой цепочке многократно. Подробнее в видео. Описание фильтра здесь .
Фильтр trim
Позволяет обрезать поток. Ведь по умолчанию поток будет виден на протяжении всего видео, а часто мне это не нужно. В предыдущих видео я скрывал ненужные потоки используя функцию enable between. Однако это порождает целый ряд проблем и усложняет код. Описание фильтра trim здесь .
Фильтр concat
С его помощью я собираю порезанные куски потоков в один общий выходной поток. Описание фильтра здесь .
Код скрипта на Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import os (w,h) = (640,480) # высота ширина клипа out_file = "c:\_tmp\out.mp4" filters = [] filters.append(f"[1]scale={w}:-1,split[x11][x12]") filters.append(f"[x11]fade=t=in:st=0:d=12[x21],[0][x21]overlay=(W-w)/2:(H-h)/2,trim=0:12[b1]") filters.append(f"[x12]fade=t=out:st=0:d=12[x22],[0][x22]overlay=(W-w)/2:(H-h)/2,trim=0:12[b2]") filters.append("[b1][b2]concat") ''' Собираю ffmpeg ''' filters = ",".join(filters) cmd = f"ffmpeg -f lavfi -i color=c=gray:s={w}x{h} " # белый фон cmd += "-loop 1 -i data\kup1.jpg " # массив входных картинок cmd += f"-filter_complex \"{filters}\" " cmd += f"-t 24 " cmd += f"-y {out_file}" print(cmd) # вывод подготовленной команды os.system(cmd) # выполняю os.system(r'"C:\Program Files\VideoLAN\VLC\vlc.exe" ' + out_file) # для удобства под виндой |
Код команды для ffmpeg
Чтобы она сработала просто уберите переносы строк.
1 2 3 4 5 6 7 8 9 10 11 12 |
ffmpeg -f lavfi -i color=c=gray:s=640x480 -loop 1 -i data\kup1.jpg -filter_complex " [1]scale=640:-1,split[x11][x12], [x11]fade=t=in:st=0:d=12[x21], [0][x21]overlay=(W-w)/2:(H-h)/2,trim=0:12[b1], [x12]fade=t=out:st=0:d=12[x22], [0][x22]overlay=(W-w)/2:(H-h)/2,trim=0:12[b2], [b1][b2]concat " -t 24 -y c:\_tmp\out.mp4 |