С 5 изображениями я должен создать видео 60 секунд в ffmpeg, каждое изображение должно отображаться в течение 15 секунд. через 15 секунд первое изображение должно исчезнуть, а второе изображение должно исчезнуть, после чего второе изображение должно исчезнуть, третье изображение должно исчезнуть в ... и т. д. Пожалуйста, объясните мне, как я могу добиться этого с помощью команд ffmpeg.
2 ответа
Окунуться в черный
Основной пример
Пример, где каждое изображение отображается в течение 5 секунд, и каждое изображение имеет затухание, которое длится 1 секунду. Каждый ввод изображения имеет одинаковую ширину, высоту и соотношение сторон образца. Если они различаются по размеру, см. Пример № 3.
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
- См. Примеры в разделе « Изменение размера видео», чтобы вписать их в проигрыватель со статическим размером, если вы хотите обрезать (заполнить экран) вместо пэда (почтовый ящик / столб), или если вы хотите предотвратить масштабирование.
Используемые параметры и фильтры:
-t
установить длительность в секундах каждого входа.scale
с помощью пэда, чтобы подогнать входные изображения к определенному однородному размеру (используется в примере № 3).fade
исчезать.d
- длительность замирания.st
когда он начинает.concat
для объединения (или "объединения") каждого изображения.format
для вывода схемы подвыборки цветности, совместимой с проигрывателями, не основанными на FFmpeg, при кодировании с помощью libx264 (кодировщик по умолчанию для вывода MP4, если он поддерживается вашей сборкой).
Crossfade
Использование melt
из MLT Multimedia Framework может быть проще для этой задачи:
melt -verbose \
-profile atsc_720p_25 \
001.png out=50 \
002.png out=75 -mix 25 -mixer luma \
003.png out=75 -mix 25 -mixer luma \
004.png out=75 -mix 25 -mixer luma \
005.png out=75 -mix 25 -mixer luma \
-consumer avformat:output.mp4 vcodec=libx264 an=1
Используйте профиль, который подходит для ваших входных файлов. Вы можете перечислить профили с
melt -query profiles
и получить информацию о конкретном профиле, например,melt -query "profile=atsc_720p_25"
.out
устанавливает продолжительность каждого изображения. Значение в кадрах. В этом примере используется профиль, который устанавливает частоту кадров 25, поэтому 25 кадров равны 1 секунде.mix
устанавливает продолжительность затухания. Значение в кадрах.mixer
устанавливает тип смеси.См. MLT Documentation и Melt Documentation для получения дополнительной информации.
Я написал общий сценарий bash, который берет путь к папке с изображениями и выводит видео с перекрестным затуханием с помощью ffmpeg:
https://gist.github.com/anguyen8/d0630b6aef6c1cd79b9a1341e88a573e
Сценарий, по сути, просматривает изображения в папке и выводит команду, аналогичную ответу @LordNeckbeard выше, и выполняет команду. Этот скрипт помогает, когда у вас много изображений в папке и вы не хотите вручную вводить удручающе длинную команду.