Что такое эффективный способ сделать кроссфейд видео с помощью FFmpeg?

Выполнение кроссфейда между двумя частями видеоконтента на самом деле довольно сложно в FFmpeg. Нет фильтра «crossfade», например, для аудио.

Каков эффективный способ сделать это?

Версия TL: DR:

В этом примере выполняется только видео, предполагая, что оба видеоролика имеют одинаковое разрешение, частоту кадров и т. Д. Это создаст 1-секундную затухание между fadeoutclip и fadeinclip. Предположим, что fadeoutclip длится 10 секунд. Обратите внимание, что это отформатировано для ясности: это действительно одна строка кода. Вам также нужно будет избежать [ ] и ; В соответствии с требованиями вашей оболочки.

 ffmpeg -i fadeoutclip.mp4 -i fadeinclip.mp4 -an -filter_complex [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]; [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 фильтр setpts=PTS-STARTPTS , который по существу делает каждый видеоподкап запустимым на 0 секунд. Это будет жизненно важно при их перекомпоновке.

Обратите внимание, что спецификаторы s=0 являются избыточными, а фильтр setpts для s=0 является ТАКЖЕ избыточным. Тем не менее, оба указаны избыточно, чтобы позволить изменять время начала с 0 без нарушения комплекса фильтров. Кроме того, второй клип контента заканчивается, поэтому e= part (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 . Фактически вы можете использовать любой формат, предоставляющий альфа-канал.

Далее в этом подкомплексе фильтра мы укажем, что один из них будет исчезать, а один – исчезать. 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 мы не указали его, вы можете использовать аргументы оверлея) Конечно, если вы ХОТИТЕ yuv420 , тогда вы в порядке 🙂

 -map [output] <add your normal encoding part here> 

Затем вы можете рекомбинировать аудио в дальнейшем (вне сферы действия этого Q & A)

  • Конкат два файла mp4 с ffmpeg без потери качества
  • Использование рабочего стола в качестве поддельной веб-камеры на Linux
  • Как получить временную метку ближайшего ключевого кадра перед заданной меткой времени с помощью FFmpeg?
  • Объедините одно изображение + один аудиофайл, чтобы сделать одно видео с помощью FFmpeg
  • Построение видео по возрастанию из входящих jpeg-изображений
  • Как установить фильтр «Fade» для FFmpeg?
  • Последовательность изображений для качества видео
  • Исправлена ​​ошибка инициализации ffmpeg drawtext
  • Как я могу получить ffmpeg для преобразования .mov в .gif?
  • ffmpeg в трубе bash
  • Масштаб (или центр) водяного знака с ffmpeg до того же разрешения, что и выходной файл
  • Interesting Posts

    Создание якорных комментариев программным способом в Документах Google

    Найти файл с определенным расширением в папке

    Как создать резервную копию и восстановить системный буфер обмена в C #?

    Поиск пересекающегося узла из двух пересекающихся связанных списков

    Проблемы / проблемы совместимости с твердотельными накопителями (SSD) с Dell D820 / D830?

    Когда используется MySQL BLOB?

    Как установить значок в JFrame

    Может ли PictureBox показывать анимированный GIF в приложении Windows?

    Как resize изображения программно в объективе-c в iphone

    Как добавить заголовок и подзаголовок в Gridview

    Как отобразить диалоговое окно только при успешном заполнении формы

    Кабель питания ноутбука Dell всегда выпадает!

    Предотвратить преобразование значений Excel в даты при открытии файлов HTML

    Как изменить текст на кнопке «Назад»

    Периодическая текстовая печать – струйная или лазерная?

    Давайте будем гением компьютера.