Версія TL; DR:
Цей приклад виконує лише відео, якщо припустити, що обидва відеокліпи мають однакову роздільну здатність, частоту кадрів і т. Д. Це створить 1-секундне згасання між fadeoutclip та fadeinclip. Припустимо, що fadeoutclip триває 10 секунд. Зауважте, що це відформатовано для наочності: це дійсно один рядок коду.
ffmpeg -i fadeoutclip.mp4 -i fadeinclip.mp4 -an \
-filter_complex "\
[0:v]trim=start=0:end=9,setpts=PTS-STARTPTS[firstclip]; \
[1:v]trim=start=1,setpts=PTS-STARTPTS[secondclip]; \
[0:v]trim=start=9:end=10,setpts=PTS-STARTPTS[fadeoutsrc]; \
[1:v]trim=start=0:end=1,setpts=PTS-STARTPTS[fadeinsrc]; \
[fadeinsrc]format=pix_fmts=yuva420p, \
fade=t=in:st=0:d=1:alpha=1[fadein]; \
[fadeoutsrc]format=pix_fmts=yuva420p, \
fade=t=out:st=0:d=1:alpha=1[fadeout]; \
[fadein]fifo[fadeinfifo]; \
[fadeout]fifo[fadeoutfifo]; \
[fadeoutfifo][fadeinfifo]overlay[crossfade]; \
[firstclip][crossfade][secondclip]concat=n=3[output] \
" \
-map "[output]" <add in encoding part here>
Повна версія:
Ось пояснення того, що це було про:
Специфікація введення ... очевидно
ffmpeg -i fadeoutclip.mp4 -i fadeinclip.mp4 -an
Створення filter_complex
: якщо припустити, що ви вже розумієте комплекси фільтрів:
-filter_complex
Спочатку ми розбиваємо два потоки на дві частини, використовуючи фільтр обрізки : вміст та поперечний зріз. Вимкнення розбивається на вміст і зникає розділ, тоді як зникнення врізається в розділ зникнення і вміст. Всього чотири розділи.
Зауважте, що суворо кажучи, нам не потрібно розбивати розділи з перехресною зрізкою: ми МОЖЕ ВИКОРИСТОВУВАТИ просто вказівку вицвітання та вицвітання часу для двох відеокліпів. Однак, роблячи це, ми:
- Дотримуйтесь методології, яку зазвичай використовують редактори відеоінтерфейсів
- Уникайте складних труднощів використання
overlay
фільтра
- Переконайтесь, що рішення є максимально загальним (тобто код для багаторазового використання)
- Дозвольте попередньо обробити і після обробки перехресного розділу, якщо це необхідно (не робиться тут)
Кожен з цих чотирьох розділів вказує: час початку (секунди), час закінчення (секунди) та загадковий setpts=PTS-STARTPTS
фільтр , який по суті змушує кожний відеокліп починатись за 0 секунд. Це буде життєво важливим при їх перекомпозиції.
Зауважте, що s=0
специфікатори є надлишковими, а setpts
фільтр для s=0
них ТАКОЖ надлишковим. Однак обидва задані надлишково, щоб дозволити змінити час початку від 0, не порушуючи комплекс фільтру. Також другий кліп контенту працює до кінця, тому e=
частина (end =) не вказується.
[0:v]trim=s=0:e=9,setpts=PTS-STARTPTS[firstclip];
[1:v]trim=s=1,setpts=PTS-STARTPTS[secondclip];
[0:v]trim=s=9:e=10,setpts=PTS-STARTPTS[fadeoutsrc];
[1:v]trim=s=0:e=1,setpts=PTS-STARTPTS[fadeinsrc];
Далі ми вказуємо зменшення та згасання: спочатку додаємо альфа (прозорість) канал до обох розділів зникаючи, вказуючи формат пікселяyuva420p
. Ви можете фактично використовувати будь-який формат, який забезпечує альфа-канал.
Далі в цьому фільтрі підкомплексу ми вказуємо один затухати, і один , щоб зникнути в. The alpha=1
означає , що саме відео темніють, тільки сума прозорості буде «завмирання». st
означає початок, d
означає тривалість.
[fadeinsrc]format=pix_fmts=yuva420p,
fade=t=in:st=0:d=1:alpha=1[fadein];
[fadeoutsrc]format=pix_fmts=yuva420p,
fade=t=out:st=0:d=1:alpha=1[fadeout];
Що це?: У fifo
фільтр гарантує , що є буфер простору , доступного в фільтрі комплексу. Дивно, але це НЕ за замовчуванням. Якщо цього не зробити, перехресне випромінювання може вийти з ладу, якщо вихід на етапі вище перекриє фільтр накладання внизу. Так, я знаю, про що ти зараз думаєш. Це справді помилка FFMPEG .
[fadein]fifo[fadeinfifo];
[fadeout]fifo[fadeoutfifo];
Тепер накладіть два зрізані секції: переконуючись, що два перерізані секції однакового розміру, нам не потрібно турбуватися про досить неприємні параметри, які використовує фільтр накладання (і тому ми їх ігноруємо тут):
[fadeoutfifo][fadeinfifo]overlay[crossfade];
Нарешті, ми вишикуємо наші три сегменти, використовуючи фільтр concat .
[firstclip][crossfade][secondclip]concat=n=3[output]
А тепер, картографуйте вихідну панель як джерело відео.
НЕ ЗАБУДУЙТЕ встановлювати формат пікселів ДЛЯ ЧОГО ВИ НОРМАЛЬНО ВИКОРИСТОВУЄТЬСЯ (як правило yuv420p
), оскільки розділ перехресно встановив його yuv420
на вихідному каналі! (як ми цього не вказали, ви можете використовувати аргументи накладання) Звичайно, якщо ви хочете yuv420
, то ви все добре :-)
-map "[output]" <add your normal encoding part here>
Потім ви можете рекомбінувати звук пізніше (поза межами цього питання)