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

Это видео показывает пример того, чего я хочу достичь.

Какая команда мне понадобится для этого? Я не знаю, как писать команды ffmpeg.

В моем приложении пользователь может выбрать изображения из галереи. Используя выбранные изображения, я должен создать видео, каждое изображение будет отображаться в течение 5 секунд. У меня есть видео и аудио небольшой продолжительности (как показано в связанном видео, например, видео о пожаре), которое будет повторяться до тех пор, пока не будут показаны все слайды.

1 ответ1

1

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

Этот ответ дает несколько примеров, но у вас есть дополнительное требование зацикливания видео и аудио потока.

Вот примеры, которые вы можете адаптировать и использовать. Сценарии будут зависеть от вас.

Пример 1

Этот пример предполагает, что:

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

  • Все входы изображений называются img001.jpg , img002.jpg , img003.jpg и т.д. В качестве альтернативы вы можете использовать шаблон glob, как описано в документации по демультиплексору файлов изображений.

 

ffmpeg -i video.mkv -i audio.mp3 -framerate 1/5 -i img%03.jpg -filter_complex \
"[0:v]setpts=PTS-STARTPTS[vid]; \
 [vid][vid][vid]concat=n=3:v=1:a=0[bg]; \
 [1:a][1:a][1:a]concat=n=3:v=0:a=1[a]; \
 [2:v]drawbox=t=5:c=white[fg]; \
 [bg][fg]overlay=(W-w)/2:(H-h)/2,format=yuv420p[v]" \
-map "[v]" -map "[a]" -shortest output.mp4

Пример 2

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

ffmpeg -i video.mkv -i audio.mp3 -loop 1 -i hound.jpg -loop 1 -i crow.jpg \
-loop 1 -i donkey.png -filter_complex \
"[0:v]setpts=PTS-STARTPTS[vid]; \
 [vid][vid][vid]concat=n=3:v=1:a=0[bg]; \
 [1:a][1:a][1:a]concat=n=3:v=0:a=1[a]; \
 [2:v]trim=duration=5,scale=640:360,drawbox=t=5:c=white[fg0]; \
 [3:v]trim=duration=5,scale=640:360,drawbox=t=5:c=white[fg1]; \
 [4:v]trim=duration=5,scale=640:360,drawbox=t=5:c=white[fg2]; \
 [bg][fg0]overlay=(W-w)/2:(H-h)/2[ol0]; \
 [ol0][fg1]overlay=(W-w)/2:(H-h)/2[ol1]; \
 [ol1][fg2]overlay=(W-w)/2:(H-h)/2,format=yuv420p[v]" \
-map "[v]" -map "[a]" -shortest output.mp4

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

Что нужно определить

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

У вас могут возникнуть некоторые проблемы. Демуксеры и concat изображения иногда бывают привередливыми.

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