В FFmpeg довольно сложно сделать перекрестное затухание между двумя частями видеоконтента. Нет фильтра «перекрестного затухания», как для аудио.
Какой эффективный способ сделать это?
ffmpeg
video-editing
Марк Геролиматос
источник
источник
[0:a][1:a] acrossfade=d=1 [audio]
в фильтр, а затем-map "[audio]"
в команду, и это сработало. Если хотите, пройдите тест и обновите ответ!Ответы:
TL; DR версия:
В этом примере выполняется только видео, при условии, что оба видеоклипа имеют одинаковое разрешение, частоту кадров и т. Д. Это создаст 1-секундное замирание между fadeoutclip и fadeinclip. Предположим, что fadeoutclip длится 10 секунд. Обратите внимание, что это отформатировано для ясности: это действительно одна строка кода.
Полная версия:
Вот объяснение того, что это было все:
Спецификация ввода ... очевидно
Создание
filter_complex
: при условии, что вы уже понимаете комплексы фильтров:Сначала мы разбиваем два потока на две части, используя фильтр обрезки : содержимое и секцию перекрестного затухания. Затухание разбивается на раздел контента и затухания, а затухание - на раздел затухания и контент. Всего четыре раздела.
Обратите внимание, что, строго говоря, нам не нужно разбивать участки перекрестного затухания: мы МОЖЕМ просто указать время затухания и затухания для двух видеоклипов. Однако, делая это, мы:
overlay
фильтраВ каждом из этих четырех разделов указываются: время начала (секунды), время окончания (секунды) и загадочный
setpts=PTS-STARTPTS
фильтр , который, по сути, запускает каждый видеоклип с 0 секунд. Это будет жизненно важно при их повторном создании.Обратите внимание, что
s=0
спецификаторы являются избыточными, аsetpts
фильтр дляs=0
них также избыточен. Тем не менее, оба указываются с избыточностью, чтобы позволить изменение времени начала с 0, не нарушая комплекс фильтра. Кроме того, второй клип контента выполняется до конца, поэтомуe=
часть (end =) не указана.Далее мы указываем постепенное увеличение и уменьшение. Сначала мы добавляем альфа-канал (прозрачность) в обе части постепенного изменения, указав формат пикселя
yuva420p
. Вы можете использовать любой формат, который обеспечивает альфа-канал.Далее в этом подкомплексе фильтра мы указываем один для постепенного исчезновения, а другой для постепенного исчезновения. Это
alpha=1
означает, что само видео не будет затемняться, только «прозрачность» будет «исчезать».st
означает начало,d
значит продолжительность.Что это ?: В
fifo
фильтр гарантирует , что есть буфер пространства , доступного в фильтре комплекса. Удивительно, но это не по умолчанию. Если вы этого не сделаете, кроссфейд может потерпеть неудачу, если выходные данные вышеприведенного каскада превысят фильтр наложения ниже. Да, я знаю, о чем ты сейчас думаешь. Это действительно ошибка FFMPEG .Теперь наложите две секции затухания: убедившись, что две секции перекрестного затухания имеют одинаковый размер, нам не нужно беспокоиться о довольно неприятных опциях, которые принимает фильтр наложения (и поэтому мы их здесь игнорируем):
Наконец, мы выстраиваем наши три сегмента, используя фильтр concat .
А теперь сопоставьте выходную панель как источник видео.
НЕ ЗАБУДЬТЕ установить формат пикселя в ТО, ЧТО ВЫ НОРМАЛЬНО ИСПОЛЬЗУЕТЕ (обычно
yuv420p
), поскольку секция кроссфейдера установит егоyuv420
на выходном канале! (поскольку мы не указали это, вы можете использовать оверлейные аргументы) Конечно, если вы хотитеyuv420
, то все в порядке :-)Затем вы можете потом объединить аудио (за рамками этого Q & A)
источник
trim=start=0:end=9
(а неtrim=st=0:e=9,
..Filter setpts has an unconnected output
для скрипта. Я уже изменил параметры обрезки, чтобы начать и закончить.