Допустим, у меня есть mp3-файл продолжительностью 1 минута. И у меня есть 20 PNG изображений. Я хочу объединить эти изображения и аудио в видеофайл, но я не хочу, чтобы каждое изображение длилось 3 секунды на экране, я хочу, чтобы некоторые изображения длились 5 секунд, другие - 1 секунда и т. Д.
Единственный способ, о котором я могу думать, это просто скопировать изображения, которые должны длиться больше времени, например, чтобы изображения1, изображение2, изображение3 были точно такими же, это дает мне в 3 раза больше времени в видео.
Однако это очень много времени и места. Есть ли в ffmpeg переключатель / параметр, который позволяет мне это делать?
Ответы:
Используя ffmpeg 2.0, есть несколько способов сделать это:
Одним из методов является использование времени модификации файла. Сначала установите время модификации файлов изображений так, чтобы каждый файл изображения имел время модификации больше, чем предшествующее ему; разница во времени - это длительность предыдущего изображения (с разрешением 1 секунда). Затем используйте опцию демультиплексора image2
-ts_from_file 1
. Например:Другой метод заключается в использовании
concat
демультиплексора , который принимает список файлов для объединения с необязательной продолжительностью. Сначала создайте файл с вашими изображениями и продолжительностью, который выглядит следующим образом:Затем предоставьте этот файл в качестве входных данных для ffmpeg. Например:
Возможно, вам придется дублировать последний файл после окончательной продолжительности.
-c:a copy
копирует аудио mp3 как есть; если вы хотите преобразовать его в другой аудиокодек, вы можете указать это вместоcopy
. Вы также можете указать другой видеокодек-c:v
или другой формат пикселей-pix_fmt
, например-c:v libx264 -pix_fmt yuv420p
.-vf fps=25
сделает частоту кадров 25 кадров в секунду. Если ваш звук длиннее и вы хотите обрезать его после изображений, используйте эту-shortest
опцию.источник
-c:v libx264 -profile:v baseline -pix_fmt yuv420p out.mp4
вместо out.avi, или попробуйте другой плеер, такой как mpv или ffplay. Также убедитесь, что вы используете текущую версию FFmpeg, и дублируйте последнее имя файла изображения после окончательной продолжительности.Если предположить,
ffmpeg -i in.ffconcat -vf fps=25 out.avi
(2018: содержимое файла in.ffconcat) - это работает:
пока это не
то есть во втором случае
ffprobe out.avi -show_entries format=duration -v 0
источник