14

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

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

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

2 ответа2

19

Используя 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 .

1

Предполагая, что ffmpeg -i in.ffconcat -vf fps=25 out.avi

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

ffconcat version 1.0
file text.png
duration 30.0
file text.png

пока это не

ffconcat version 1.0
file text.png
duration 30.0

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

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

[FORMAT]
duration=0.040000
[/FORMAT]

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