21

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

2 ответа2

42

Окунуться в черный

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

Основной пример

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

2

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

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

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

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