Последовательность изображений FFMPEG различной длительности

16

Допустим, у меня есть mp3-файл продолжительностью 1 минута. И у меня есть 20 PNG изображений. Я хочу объединить эти изображения и аудио в видеофайл, но я не хочу, чтобы каждое изображение длилось 3 секунды на экране, я хочу, чтобы некоторые изображения длились 5 секунд, другие - 1 секунда и т. Д.

Единственный способ, о котором я могу думать, это просто скопировать изображения, которые должны длиться больше времени, например, чтобы изображения1, изображение2, изображение3 были точно такими же, это дает мне в 3 раза больше времени в видео.

Однако это очень много времени и места. Есть ли в ffmpeg переключатель / параметр, который позволяет мне это делать?

Flot2011
источник
Как вы узнали, ffmpeg должен отображать каждое изображение одинаковой длины. Если вы хотите изменить длину, вам придется заранее продублировать изображения или создать отдельные видеоролики каждой желаемой продолжительности, а затем объединить их. Возможно, у некоторых других пользователей есть лучшие идеи, но этот тип задач может быть проще с таким редактором, как Kdenlive и т. Д.
llogan
Я делаю это из php скрипта, поэтому редактор - это не то, что я ищу.
Flot2011

Ответы:

21

Используя ffmpeg 2.0, есть несколько способов сделать это:

  1. Одним из методов является использование времени модификации файла. Сначала установите время модификации файлов изображений так, чтобы каждый файл изображения имел время модификации больше, чем предшествующее ему; разница во времени - это длительность предыдущего изображения (с разрешением 1 секунда). Затем используйте опцию демультиплексора image2 -ts_from_file 1. Например:

    touch -t 01010000.00 image01.png
    touch -t 01010000.03 image02.png
    touch -t 01010000.08 image03.png
    ...
    ffmpeg -ts_from_file 1 -i image%2d.png -i audio.mp3 -c:a copy -vf fps=25 out.avi
    
  2. Другой метод заключается в использовании concatдемультиплексора , который принимает список файлов для объединения с необязательной продолжительностью. Сначала создайте файл с вашими изображениями и продолжительностью, который выглядит следующим образом:

    ffconcat version 1.0
    file image01.png
    duration 3
    file image02.png
    duration 5
    file image03.png
    

    Затем предоставьте этот файл в качестве входных данных для ffmpeg. Например:

    ffmpeg -i in.ffconcat -i audio.mp3 -c:a copy -vf fps=25 out.avi
    

Возможно, вам придется дублировать последний файл после окончательной продолжительности. -c:a copyкопирует аудио mp3 как есть; если вы хотите преобразовать его в другой аудиокодек, вы можете указать это вместо copy. Вы также можете указать другой видеокодек -c:vили другой формат пикселей -pix_fmt, например -c:v libx264 -pix_fmt yuv420p. -vf fps=25сделает частоту кадров 25 кадров в секунду. Если ваш звук длиннее и вы хотите обрезать его после изображений, используйте эту -shortestопцию.

mark4o
источник
Любая идея, почему это просто не работает (я имею в виду, я следовал за вторым (и пытался первым) вариантом буквы, но он просто выводит либо черное видео без изображений, либо изображения просто мигают в течение одного кадра, а не нескольких секунд, как указано в файле ffconcat.
sup
@sup: это все еще работает для меня. Если видео чёрного цвета, ваш плеер может не поддерживать используемый вами формат видео; попробуйте -c:v libx264 -profile:v baseline -pix_fmt yuv420p out.mp4вместо out.avi, или попробуйте другой плеер, такой как mpv или ffplay. Также убедитесь, что вы используете текущую версию FFmpeg, и дублируйте последнее имя файла изображения после окончательной продолжительности.
mark4o
Хм, странно, U использует mpv и статическую сборку ffmpeg, загруженную с ffmpeg.org, и она просто игнорирует продолжительность. Во всяком случае, я нашел еще один способ , как это сделать, так что это не так уж важно: ffmpeg.org/pipermail/ffmpeg-user/2015-July/027702.html
вир
1

Если предположить, ffmpeg -i in.ffconcat -vf fps=25 out.avi

(2018: содержимое файла in.ffconcat) - это работает:

ffconcat версия 1.0
файл text.png
продолжительность 30,0
файл text.png

пока это не

ffconcat версия 1.0
файл text.png
продолжительность 30,0

то есть во втором случае

ffprobe out.avi -show_entries format=duration -v 0

[ФОРМАТ]
Продолжительность = 0.040000
[/ФОРМАТ]
Дарек Адамкевич
источник