23

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

Фильтры fade и concat отлично подходят для постепенного исчезновения видео 1, перехода к видео 2 и преобразования переходов типа 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

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

3 ответа3

20

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

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

Так что команда для добавления кроссфейдера к 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 секунд черного цвета, масштабируем его для вывода размера видео и наложения материала.

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

5

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

  • 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

5

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .