Який ефективний спосіб зробити відеоперехрещення за допомогою FFmpeg?


11

Робити перехресний проміжок між двома фрагментами відеоконтенту насправді у FFmpeg досить складний. Немає фільтру "перекреслений", як для аудіо.

Який ефективний спосіб це зробити?


Приємне запитання з самовідповіддю!
JakeGould

На цю відповідь потрібно отримати багато більше відгуків ... Позначте, я б так любив вас назавжди, якби ви додали також перехресне завмирання для аудіо ...
Merc

Як тільки я зрозумію як, я додам його. Я думаю, що аудіо кроссфейд є швидким, тхо, вірю, що для цього є простий фільтр.
Марк Героліматос

Я просто додав [0:a][1:a] acrossfade=d=1 [audio]у фільтр, а потім -map "[audio]" у команду, і він працював. Якщо вам подобається, поставте тест і оновіть відповідь!
Merc

Відповіді:


17

Версія 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>

Потім ви можете рекомбінувати звук пізніше (поза межами цього питання)


1
В останньому ffmpeg це повинно бути trim=start=0:end=9, а не trim=st=0:e=9,..
Merc

Але якщо серйозно, це, мабуть, буде найкращою відповіддю на FFMPEG, яку я коли-небудь бачив, і найяскравішим поясненням ffmpeg коли-небудь.
Merc

Людина, це мені піде в голову :-) Дякую за реквізит !!!!
Марк Героліматос

Не хвилюйтесь. Будь ласка, оновіть відповідь, особливо за допомогою = trim = start = 0, оскільки зараз це не працює з останнім ffmpeg
Merc

Остання помилка ffmpeg дає мені цю помилку: Filter setpts has an unconnected outputдля сценарію. Я вже змінив параметри обрізки, щоб почати і закінчити.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.