Как создать видео из изображений с помощью FFmpeg?


86

Можно ли использовать ffmpegсоздание видео из набора последовательностей, где номер не начинается с нуля?

Например, у меня есть несколько изображений [test_100.jpg, test_101.jpg, test_102.jpg, ..., test_200.jpg], и я хочу преобразовать их в видео. Я попробовал следующую команду, но она не сработала (кажется, число должно начинаться с нуля):

ffmpeg -i test_% d.jpg -vcodec mpeg4 test.avi

Любой совет?


Прошло много времени с тех пор, как вы задали этот вопрос, но если вам все еще интересен вопрос, ответ - ДА - я опубликовал подробности и пример ниже: stackoverflow.com/a/12160155/181638
Асад Эбрахим

@casperOne было бы полезно иметь представление, почему это не по теме. Это похоже на специфическую проблему программирования. Тэг FFmpeg имеет 3,7 тыс. Подписчиков, и с 27 тыс. Просмотров люди явно находят его полезным ..
geotheory

2
@geotheory Статистика тегов не имеет значения. ffmpeg - это программа, очень похожая на WinRar. Хотя вы можете программировать против библиотек в ffmpeg , этот вопрос не об этом. Использование ffmpeg из командной строки нужно спросить у суперпользователя , где это по теме.
casperOne

Ответы:


81

Нет необходимости переименовывать файлы, если использовать -start_numberпереключатель следующим образом:

ffmpeg -start_number n -i test_%d.jpg -vcodec mpeg4 test.avi

где nначало последовательности фотографий.

Обратите внимание, это будет работать до тех пор, пока последовательность не будет прервана после запуска. Если есть пробелы, и вы хотите, чтобы все кадры были включены, то для их устранения может потребоваться перенумерация.

Есть некоторые другие переключатели, которые могут оказаться полезными.

Я использую следующую однострочную строку, чтобы получить более медленную частоту кадров, сжимать изображения и получать уменьшенное видео:

ffmpeg.exe -f image2 -framerate 25 -pattern_type sequence -start_number 1234 -r 3 -i Imgp%04d.jpg -s 720x480 test.avi

-r 3Опция устанавливает частоту кадров результирующего видео 3 кадров в секунду , так что я могу видеть каждый еще в течение короткого периода времени. -sВариант перемасштабирует снимки в нужное разрешение управлять размером получаемого видео.

(В оболочке Windows замените -i Imgp%04d.jpgна -i "Imgp%%04d.jpg". Кредит за это Майк Фицпатрик https://superuser.com/a/344178/153054 )


4
В чем разница между -r и -framerate?

1
они одинаковые IIRC
rogerdpack

22
Нет необходимости в нумерации чепухи, если вы счастливы принять порядок, в котором они появляются (скажем) в «ls» ... просто используйте: ffmpeg -pattern_type glob -i '* .jpg' movie.mp4
Orwellophile

2
Есть ли переключатель для управления временным интервалом между изображениями, скажем, я хотел бы показать первое изображение 13 с, вторые 15 с, 24 с для третьего, временной интервал определяется пользователем, это возможно?
zionpi

2
Смотри также trac.ffmpeg.org/wiki/...
david.libremone

38

Вы можете использовать этот фрагмент кода ниже:

 cat *.jpg | ffmpeg -f image2pipe -r 1 -vcodec mjpeg -i - -vcodec libx264 out.mp4

Это не поворачивает JPG к повороту, указанному в метаданных.
Эрик Йоханссон

17

Вы можете найти пример сценария в документации ffmpeg :

3.2 Как мне кодировать отдельные картинки в фильмы?

Если у вас есть большое количество картинок для переименования, вы можете использовать следующую команду, чтобы облегчить бремя. Команда, используя синтаксис оболочки Bourne, символически связывает все файлы в текущем каталоге, которые соответствуют * jpg, с /tmp' directory in the sequence ofimg001.jpg ', `img002.jpg' и так далее.

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done

Затем запустите:

ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg

2
Лучше сделать x = 0 для запуска, чтобы имя образа начиналось с img000.jpg, поскольку именно этого ожидает ffmpeg. Кроме того, символические ссылки не работали для меня, так как ffmpeg не мог найти файлы, поэтому мне пришлось вместо этого использовать cp (очевидная скорость и недостаток места, но я все равно их получаю). mv также подойдет, если вы не против потерять оригиналы.

Обратите внимание, что в этом ответе предоставленная команда создает жесткие ссылки, а не символические ссылки. Что касается использования, cpесли связывание не работает, если ваша файловая система поддерживает его, cp --reflink=autoвы достигнете гораздо лучшего использования скорости / пространства.
Феликс Сапарелли,

12

Из документов ffmpeg:

Использование шаблона шара

ffmpeg также поддерживает глобирование в стиле bash (* обозначает любое количество любых символов).

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

ffmpeg -r 1 -pattern_type glob -i 'test_*.jpg' -c:v libx264 out.mp4

Таким образом, пока ваши файлы отсортированы, использование -pattern_type globпереключателя должно работать для вас.


Обратите внимание, что этот глоб более ограничен, чем обычный глобус оболочки: trac.ffmpeg.org/ticket/3620, очевидно, потому что тип изображения определяется из расширения.
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

11

Насколько я знаю, вы не можете запустить последовательность в случайных числах (я не помню, нужно ли начинать ее с 0 или 1), плюс, она не может иметь пробелов, если это произойдет, ffmpeg будет считать, что последовательность окончена, и прекратите добавлять больше изображений.

Также, как указано в комментариях к моему ответу, помните, что вам нужно указать ширину вашего индекса. Подобно:

Изображение% 03d.jpg

И если вы используете индексный тип% 03d, вам нужно добавить имена файлов в 0, например:

image001.jpg image002.jpg image003.jpg

и т.п.


1
Если имена файлов изображений имеют начальные нули, то строка формата также должна указывать ширину, например «% 03d».

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

1
Да, я работал с этим раньше, я написал оболочку в Ruby некоторое время назад, где вы вызывали instance.addImage (), затем instance.processVideo (), и это создаст временный каталог, скопируйте / переименуйте изображения с соответствующими индексами и создать видео. Это довольно легко.

@Jefromi Я создал символическую ссылку, но как мне указать путь к файлу символической ссылки для ffmpeg? Предполагается, что файл символической ссылки - это изображение, которое я пытаюсь преобразовать? Я на win7 между прочим

Последовательность может начинаться с 0 до 4 включительно.
Асад Эбрахим

5

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


1

уважать

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i"
/tmp/img"$counter".jpg; x=$(($x+1)); done

1

Я знаю, что это старый вопрос, но я наткнулся на него в Google, ища тот же ответ. Ни один из ответов здесь не удовлетворил меня полностью, поэтому я больше занимался поиском и чтением, и это команда, которую я придумал для своей собственной проблемы.

cat {0032..1501}*.png | ffmpeg -f image2pipe -framerate 5 -i - -s 720x480 test2.avi

Причина, по которой я бы использовал такую ​​команду ...

  1. Cat и -f image2pipe дают вам более точный контроль над тем, какие изображения вы используете. Например, он позволяет вам использовать функции bash, такие как расширение скобок, и другие команды, такие как grep, для точной настройки результатов, которые вы выберете.
  2. Меньше переключается, чтобы запомнить.
  3. Я рекомендую НЕ использовать -r, а вместо этого просто использовать -framerate. По моему опыту -r имеет тенденцию отбрасывать кадры чаще.
  4. Менее сложный, без лишних переключателей в использовании, и он будет работать как есть. Вы можете добавить больше сложности (например, указав кодировщик) и настроить в соответствии с вашими потребностями.

По вопросу ОП, -start_numberэто все, что нужно.
Джан

0

Я использовал кодировщик flv, так как мое видео собиралось во флеш-плеере (Jwplayer)

ffmpeg -i% d.jpg -vcodec flv test.flv


0

Из документации кажется, что вы можете просто использовать *

For example, for creating a video from filenames matching the glob pattern foo-*.jpeg:

ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi

Как примечание, для улучшения влияния на качество может быть важна скорость / fps (например, сначала указывается очень низкая / высокая частота кадров, а затем переходить от второго фильтра, который сделает замедленное видео нормальным?)


0

В моем случае это было немного сложнее из-за чисел в файлах. Вот как выглядят мои изображения:

$ ls | head -5
2014_aq_unprocessed 001.jpg
2014_aq_unprocessed 002.jpg
2014_aq_unprocessed 003.jpg
2014_aq_unprocessed 004.jpg
2014_aq_unprocessed 005.jpg

и вот команда, которую я использовал:

ffmpeg -i 2014_aq_unprocessed\ %3d.jpg  -vcodec mpeg4 test.avi

0

Вы можете сделать это с convert -morph:

convert *.jpg -delay 10 -morph 10 %05d.jpg

Если вы хотите использовать ffmpeg, я использовал

ffmpeg -pattern_type glob -i '*.jpg' -vf "setpts=10*PTS" movie.mp4

где 10*PTSffmpeg указывает замедлить его в 10 раз. Вы также можете иметь дроби, чтобы ускорить его.


Это просто интерполяция вашей исходной последовательности изображений в новое пространство, она не создает видеофайл, как задано OP.
f0ster

0

-pattern_type glob конкретные примеры с аудио

Эта опция была упомянута по адресу: https://superuser.com/a/782520/128124, но вот несколько конкретных примеров ее использования, включая добавление аудио в выходное видео.

Слайд-шоу видео с одним изображением в секунду

ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
  -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Добавьте немного музыки к нему, обрежьте звук после окончания изображения:

ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \
  -c:a copy -shortest -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Вот две демонстрации на YouTube:

Станьте хиппи и используйте незащищенный от видео формат Theora :

ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \
  -c:a copy -shortest -c:v libtheora -r 30 -pix_fmt yuv420p out.ogg

Ваши изображения, конечно, должны быть отсортированы в алфавитном порядке, как правило:

0001-first-thing.jpg
0002-second-thing.jpg
0003-and-third.jpg

и так далее.

Смотрите также: http://unix.stackexchange.com/questions/68770/converting-png-frames-to-video-at-1-fps/339399#339399

Нормальная скорость видео с одним изображением на кадр при 30 кадрах в секунду

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -c:v libx264 -pix_fmt yuv420p out.mp4

Вот как это выглядит:

GIF, созданный с помощью: https://askubuntu.com/questions/648603/how-to-create-an-animated-gif-from-mp4-video-via-command-line/837574#837574

Добавьте немного аудио к нему:

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -i audio.ogg -c:a copy -shortest -c:v libx264 -pix_fmt yuv420p out.mp4

Результат: https://www.youtube.com/watch?v=HG7c7lldhM4

Конвертируйте один музыкальный файл в видео с фиксированным изображением для загрузки на YouTube

Ответ на: Как конвертировать MP3 в видео в формате YouTube?

Получить некоторые синтетические тестовые входные изображения

Вот тестовые изображения, которые я использовал в этом ответе:

wget -O opengl-rotating-triangle.zip https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.zip?raw=true
unzip opengl-rotating-triangle.zip
cd opengl-rotating-triangle
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg

Изображения, созданные с помощью: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292

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

  • opengl-rotating-triangle.mp4: 340K
  • opengl-rotating-triangle.zip: 7,3 млн

О параметрах CLI

Однако обратите внимание, что, несмотря на название, -globэто не так широко, как шаблоны оболочки Glob, например: -i '*'fails: https://trac.ffmpeg.org/ticket/3620 (очевидно, потому что тип файла выводится из расширения).

-r 30делает -framerate 1видео на 30 FPS, чтобы преодолеть ошибки в плеерах, таких как VLC, для низких частот: https://stackoverflow.com/questions/19267443/playback-issues-in-vlc-with-low-fps-video-from-images-using- ffmpeg / 41797724 # 41797724 Поэтому он повторяет каждый кадр 30 раз, чтобы сохранить желаемый эффект 1 изображение в секунду.

Следующие шаги

Вы также хотите:

TODO: научитесь вырезать и объединять несколько аудио файлов в видео из командной строки:

Проверено на

ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.

Библиография

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.