Создать видео с 5 изображениями с эффектом fadeIn / out в ffmpeg

27

С 5 изображениями я должен создать видео 60 секунд в ffmpeg, каждое изображение должно отображаться в течение 15 секунд. через 15 секунд первое изображение должно исчезнуть, и второе изображение должно исчезнуть, после этого второе изображение должно исчезнуть, третье изображение должно исчезнуть в ... и т. д. Пожалуйста, объясните мне, как я могу добиться этого с помощью команд ffmpeg.

user384847
источник
4
Что вы пробовали, и тогда мы можем вам помочь? Этот форум не является форумом типа «пожалуйста, дайте мне ответ, не делая никакой работы». С учетом сказанного я предоставлю вам ссылку на документацию ffmpeg fade - ffmpeg.org/ffmpeg-filters.html#fade
Майк Диглио,

Ответы:

49

Окунитесь / исчезните к черному

Прокрутите вниз для метода кроссфейдера.

пример исчезновения

Пример, где каждое изображение отображается в течение 5 секунд, и каждое изображение имеет затухание, которое длится 1 секунду. Каждый ввод изображения имеет одинаковую ширину, высоту и соотношение сторон образца. Если они различаются по размеру, см. Пример № 3 ниже.

Выход MP4

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4

С аудио

То же, что и выше, но со звуком:

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-i audio.m4a \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" -map 5:a -shortest out.mp4

Для входных изображений с различными или произвольными размерами

Как и в первом примере, но с входными изображениями, которые различаются по ширине и высоте. Они будут вставлены в коробку 1280x720:

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=out:st=4:d=1[v0]; \
 [1:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4

См. Примеры в разделе « Изменение размера видео», чтобы вписать их в проигрыватель статического размера, если вы хотите обрезать (заполнить экран) вместо пэда (почтовый ящик / ящик для столбов) или если вы хотите предотвратить масштабирование.

GIF выход

Добавляет фильтры из Как я могу конвертировать видео в GIF с использованием ffmpeg, с приемлемым качеством?

ffmpeg \
-framerate 10 -loop 1 -t 5 -i input0.png \
-framerate 10 -loop 1 -t 5 -i input1.png \
-framerate 10 -loop 1 -t 5 -i input2.png \
-framerate 10 -loop 1 -t 5 -i input3.png \
-framerate 10 -loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,split[v0][v1]; \
 [v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" out.gif

Используйте параметр -loopвывода, чтобы контролировать количество циклов GIF. По умолчанию используется бесконечный цикл, если эта опция не используется. Значение -1не является циклом.

Используемые параметры и фильтры:

  • -t установить длительность в секундах каждого входа.

  • -loop 1 Зацикливает изображение, иначе оно будет иметь длительность 1 кадр.

  • -framerateустановить частоту кадров входного изображения (по умолчанию, когда необъявлено 25). Полезно для создания GIF.

  • масштабируйте с помощью пэда, чтобы подогнать входные изображения к определенному, одинаковому размеру (используется в примере № 3).

  • исчезать постепенно исчезать. dпродолжительность затухания. stкогда это начинается.

  • concat для объединения (или «объединения») каждого изображения.

  • формат для вывода схемы подвыборки цветности, совместимой с проигрывателями, не основанными на FFmpeg, при выводе MP4 и кодировании с помощью libx264 (кодировщик по умолчанию для вывода MP4, если он поддерживается вашей сборкой).

  • разделить, чтобы сделать копии фильтра вывода. Необходимые фильтры палитры *, чтобы сделать все в одной команде.

  • palettegen и paletteuse для создания красивого GIF.


Crossfade

пример перекрестного затухания

Пример, где каждое изображение отображается в течение 5 секунд, а каждое изображение имеет затухание, которое длится 1 секунду Каждый ввод изображения имеет одинаковую ширину, высоту и соотношение сторон образца. Если они различаются по размеру, адаптируйте пример № 3 выше.

Выход MP4

ffmpeg \
-loop 1 -t 5 -i 1.png \
-loop 1 -t 5 -i 2.png \
-loop 1 -t 5 -i 3.png \
-loop 1 -t 5 -i 4.png \
-loop 1 -t 5 -i 5.png \
-filter_complex \
"[1]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3]; \
 [bg3][f3]overlay,format=yuv420p[v]" -map "[v]" -movflags +faststart out.mp4

С аудио

ffmpeg \
-loop 1 -t 5 -i 1.png \
-loop 1 -t 5 -i 2.png \
-loop 1 -t 5 -i 3.png \
-loop 1 -t 5 -i 4.png \
-loop 1 -t 5 -i 5.png \
-i music.mp3 \
-filter_complex \
"[1]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3]; \
 [bg3][f3]overlay,format=yuv420p[v]" -map "[v]" -map 5:a -shortest -movflags +faststart out.mp4

Кроссфейд между двумя видео с аудио

Выберите 5-секундный сегмент от каждого входа и добавьте 1-секундный кроссфейд:

ffmpeg -i input0.mp4 -i input1.mp4 -filter_complex \
"[0:v]trim=start=5:end=10,setpts=PTS-STARTPTS[v0];
 [1:v]trim=start=12:end=17,setpts=PTS-STARTPTS+4/TB,format=yuva444p,fade=st=4:d=1:t=in:alpha=1[v1];
 [v0][v1]overlay,format=yuv420p[v];
 [0:a]atrim=start=5:end=10,asetpts=PTS-STARTPTS[a0];
 [1:a]atrim=start=12:end=17,asetpts=PTS-STARTPTS[a1];
 [a0][a1]acrossfade=d=1[a]" \
-map "[v]" -map "[a]" output.mp4

GIF выход

ffmpeg \
-framerate 10 -loop 1 -t 5 -i 1.png \
-framerate 10 -loop 1 -t 5 -i 2.png \
-framerate 10 -loop 1 -t 5 -i 3.png \
-framerate 10 -loop 1 -t 5 -i 4.png \
-framerate 10 -loop 1 -t 5 -i 5.png \
-filter_complex \
"[1]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3];[bg3][f3]overlay,split[v0][v1]; \
 [v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" out.gif

Используйте параметр -loopвывода, чтобы контролировать количество циклов GIF. По умолчанию используется бесконечный цикл, если эта опция не используется. Значение -1не является циклом.

llogan
источник
1
@LordNeckbeard, спасибо за этот ответ, я использовал его для другого примера. Хорошо ли я понял, что число, следующее -tза, -loop 1 -t 1 -i 001.pngопределяет продолжительность отдельных кадров, и что числа, следующие T/за filter_complexблоком, определяют длительность перехода? И учитывается ли длительность кадра в этом примере, включая длительность перехода или нет?
Cincplug
1
@Nisarg Похоже, это не полный вывод, и я не уверен, какая это команда из двух, которые вы отображали ранее. В любом случае, попробуйте добавить -preset ultrafast.
Llogan
1
@LordNeckbeard Мне нужно объединить набор изображений, видеоклипов и аудиодорожки, чтобы создать один видеофайл (желательно ogg, но это менее актуально в данный момент). Кроме того, мне нужно создать некоторые эффекты перехода между соседними изображениями. Есть ли способ написать всю эту задачу, используя ffmpeg и / или другие инструменты командной строки? Цель состоит в том, чтобы автоматизировать задачу через интерфейс командной строки.
Веб-пользователь
1
Переходы @WebUser, вероятно, будут проще в использовании melt.
Llogan
2
Подход ffmpeg хорошо работает для меня; Благодарность! Один совет для новичков на странице; в concat=n=9части команды 9получено из 5 изображений в примере + 4 перехода между изображениями. Если вы обрабатываете другое количество изображений, вам необходимо соответствующим образом настроить его.
Джим Миллер
4

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

https://gist.github.com/anguyen8/d0630b6aef6c1cd79b9a1341e88a573e

Сценарий, по сути, просматривает изображения в папке и выводит команду, аналогичную ответу @LordNeckbeard выше, и выполняет команду. Этот сценарий помогает, когда в папке много изображений и вы не хотите вручную вводить удручающе длинную команду.

anh_ng8
источник
Извините, но ваш скрипт завершается ошибкой с ffmpeg 3.0.1, с входами от 0 до # 4 он возвращает: «Недопустимый индекс файла 5 в описании filtergraph»
Кшиштоф Бочюрко
TobySpeight: хорошая мысль, я отредактировал ответ, чтобы быть более ясным. В основном основная идея уже дана @LordNeckbeard выше. Этот скрипт просто обобщает многие изображения.
anh_ng8 21.09.16