переход между двумя видео с помощью ffmpeg


27

Я пытался добиться перехода с плавным переходом между двумя видеоклипами с помощью ffmpeg, но до сих пор не получилось. Я новичок в ffmpeg и в основном полагаюсь на то, что я могу найти в документации и существующих примерах онлайн. Из того, что я читал до сих пор, используя либо смесь или наложения фильтра должно помочь в достижении того, что я после , но я не могу выяснить подробности командной строки , чтобы получить его на работу.

В замирании и Concat фильтров отлично подходит для постепенного исчезновения видео 1, нарастающих и видео 2 и CONCAT на 2 в 1 клип переходов типа , но я ценю помощь в получении команды перехода из видео 1 к видео 2 без какого - либо собирается черный между ними. Я нигде не мог найти примеров именно этой проблемы, может быть, я ищу неправильные ключевые слова ...?

Говоря более конкретно, мои видео имеют формат mp4 (видео h264, без звука, если это имеет значение), каждое из них имеет длину 5 секунд, и я после перехода с ок. 4,5 с видео от 1 до 0,5 с видео 2.

Подобно тому, как этот учебник использует MLT и фреймы (пример затухания см. В 2:25), хотя я ищу способ сделать это только в ffmpeg без вызова каких-либо других прог. http://www.youtube.com/watch?v=3PRZ9L_KLdI

Любые указатели или, возможно, командная строка, чтобы получить исчезновение, как это было бы очень признательно, большое спасибо!


Ответы:


23

Я предлагаю сделать так:

  • Создайте черный фон с той же продолжительностью и разрешением, что и для выходного видео.
  • Добавить альфа-канал к каждому видео
  • Добавьте эффект постепенного исчезновения альфа в каждое видео
  • Используйте наложение на каждом видео с черным фоном

Таким образом, команда для добавления кроссфейдера к 2 видео (5 секунд) должна быть:

ffmpeg -i 1.mp4 -i 2.mp4 -f lavfi -i color=black -filter_complex \
"[0:v]format=pix_fmts=yuva420p,fade=t=out:st=4:d=1:alpha=1,setpts=PTS-STARTPTS[va0];\
[1:v]format=pix_fmts=yuva420p,fade=t=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+4/TB[va1];\
[2:v]scale=960x720,trim=duration=9[over];\
[over][va0]overlay[over1];\
[over1][va1]overlay=format=yuv420[outv]" \
-vcodec libx264 -map [outv] out.mp4

Это приведет к исчезновению первого видео в альфа-формате на 4-й секунде (st = 4) в течение 1 секунды (d = 1), к второму видео на 0 секунд (st = 0) в течение 1 секунды (d = 1) и переместит его отображение время пересылки до 4 с (+ 4 / ТБ). Затем мы просто обрезаем 9 секунд черного цвета, масштабируем его для вывода размера видео и наложения материала.

Надеюсь, это поможет.


Привет @ptQa, большое спасибо, эффект кроссфейда работает как шарм. Хотя в выходном видео происходит то, что в нем отображается только верхняя левая часть исходного видео, а остальная часть кадра отсутствует. Я посмотрел на разрешение, входной сигнал равен 960 x 720, а выходной - 320 x 240, но он не уменьшает масштаб всего видео, а вырезает раздел 320 x 240 в верхнем левом углу и показывает, что в выходном видео остальные входные видео отсутствуют. Есть ли дополнение к вашей командной строке, которое предотвращает это?
Мугба

О, я понял, вы также должны масштабировать черный цвет до разрешения, которое вы хотите получить. Смотрите обновленный ответ. Я добавил масштаб, чтобы отфильтровать график.
ptQa

Это решило это, спасибо. Я загрузил пример видео, показывающего переход, если кто-то захочет увидеть его в действии, youtu.be/JqorgXAjjTo
Mugba

Та же проблема; У меня есть вариант работы над некоторыми из моих собственных видео - спасибо. Вопрос: Как это можно изменить, чтобы также перекрыть аудио дорожки видео, следуя той же схеме, что и видео?
Джим Миллер

1
Кстати, я думаю, что есть ошибка в примере команды ответа - так и должно быть -i 1.mp4 -i 2.mp4..., верно?
Джим Миллер

7

Вот как я это сделал:

  • ffmpeg версия N-77197-gdf2ce13
  • 2 видео по 4 секунды каждый.
  • Нужно присоединиться к нему с исчезновением между ними.
  • видео 25 кадров в секунду.

1) Добавьте исчезновение (от светлого к темному) в конце 1-го и добавьте (от темного к светлому) в начале 2-го:

ffmpeg -i 1.mp4 -y -vf fade=out:76:24 1f.mp4

ffmpeg -i 2.mp4 -y -vf fade=in:0:25 2f.mp4

76:24 означает, что затухание начнется с 76-го кадра и закончится через 24 кадра = 1 с затухания.

0:25 означает, что появление начнется с 0 кадра и закончится через 25 кадров.

2) Объединить 2 видео

Конвертировать все в TS

ffmpeg -i 1f.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 1f.ts

ffmpeg -i 2f.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 2f.ts

Объединить

ffmpeg -i "concat:1f.ts|2f.ts" -bsf:a aac_adtstoasc -c copy output.mp4

Благодаря:

http://www.bogotobogo.com/FFMpeg/ffmpeg_fade_in_fade_out_transitions_effects_filters.php


6
Это не кроссфейд.
Гьян

4
Что @Mulvya сказал. Перекрестное затухание затухает в одном клипе одновременно с затуханием другого. Прозрачность первого клипа неуклонно увеличивается в течение всего времени затухания; у второй прозрачность неуклонно снижается.
интуитивно

7

ffmpeg-concat - это самый простой способ выполнить то, что вы хотите, и он позволяет вам использовать множество сексуальных переходов OpenGL, по умолчанию это кроссфейд.

ffmpeg-gl-transition - это пользовательский фильтр ffmpeg, который позволяет использовать GLSL для плавного перехода между двумя видеопотоками. Этот фильтр значительно проще в использовании и настройке, чем альтернативы, перечисленные здесь.

Этот фильтр поддерживает большой список типов переходов, по умолчанию используется кроссфейд.

./ffmpeg -i 0.mp4 -i 1.mp4 -filter_complex "gltransition=duration=4:offset=1.5" out.mp4

4
Вы рассматривали возможность отправки патча в FFmpeg?
Llogan

1
Я определенно буду, мне просто нужно исправить некоторые небольшие проблемы и сначала протестировать больше. Хороший звонок!
fisch2

это в официальном FFmpeg? Я не могу найти его
kraftydevil
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.