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


165
ffmpeg -r 1/5 -start_number 2 -i img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

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

img001.jpg
img002.jpg
img003.jpg
...

Как я могу ввести файлы изображений из другой папки? Пример:C:\mypics

Я попробовал эту команду, но ffmpegсгенерировал видео только с первым изображением (img001.jpg).

ffmpeg -r 1/5 -start_number 0 -i C:\myimages\img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Ответы:


170

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

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

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4

В качестве альтернативы видеофильтр формата можно добавить в цепочку фильтров, чтобы заменить -pix_fmt yuv420p на «fps = 25, format = yuv420p» . Преимущество этого метода в том, что вы можете контролировать, какой фильтр идет первым

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf "fps=25,format=yuv420p" out.mp4

Я тестировал ниже параметров, у меня это работало

"e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -vf "fps=25,format=yuv420p" e:\out.mp4

ниже параметры также работают, но он всегда пропускает первое изображение

"e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -r 30 -pix_fmt yuv420p e:\out.mp4

создание видео из изображений, размещенных в разных папках

Сначала добавьте пути к изображениям в imagepaths.txt, как показано ниже.

# this is a comment details https://trac.ffmpeg.org/wiki/Concatenate

file 'E:\images\png\images__%3d.jpg'
file 'E:\images\jpg\images__%3d.jpg'

Пример использования следующим образом;

"h:\ffmpeg\ffmpeg.exe" -y -r 1/5 -f concat -safe 0 -i "E:\images\imagepaths.txt" -c:v libx264 -vf "fps=25,format=yuv420p" "e:\out.mp4"

-safe 0 параметр предотвращает небезопасную ошибку имени файла

Ссылки по теме

FFmpeg делает видео из изображений, помещенных в разные папки

FFMPEG Промежуточное руководство / последовательность изображений

Конкатенация - FFmpeg


«Если ваше видео не показывает кадры правильно. Если вы столкнулись с проблемами, такими как первое изображение пропускается или показывается только для одного кадра, используйте вместо этого видеофильтр fps» Извините, но не могли бы вы объяснить, что вы подразумеваете под «fps»? видеофильтр "точно?
— арнушки

3
Насколько я знаю, параметр -r является переменной частотой кадров, это означает, что FFMPEG может отбрасывать или дублировать кадры для достижения желаемой частоты кадров на выходе. Использование фильтра fps «-vf fps = value» заставляет FFMPEG генерировать постоянную частоту кадров. См. Создание слайд-шоу видео из изображений - FFmpeg , и в чем заключается (техническая) разница между -r и фильтром fps? , Таким образом , используя -r параметр иногда Couse пропуская первое изображение ..
— хан

Первая команда в этом списке, ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4казалось, сработала, но в итоге вылилось в видео, которое не удалось прочитать ни одному плееру (в Ubuntu). VNC сказал: «Атом moov не найден». Попытка исправить это qt-faststartвызвала ошибку «последний атом в файле не был атомом moov»
— sh37211

150

-pattern_type glob

Этот отличный вариант облегчает выбор изображений во многих случаях.

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

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

и так далее.

Сначала я бы позаботился о том, чтобы все используемые изображения имели одинаковое соотношение сторон, возможно, предварительно обрезав их с помощью nomacsimagemagick или так, чтобы ffmpeg не пришлось принимать трудные решения. В частности, ширина должна делиться на 2, в противном случае преобразование завершается неудачно: «ширина не делится на 2».

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

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

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

GIF, созданный с помощью: /ubuntu/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

Это тестовые материалы, которые я использовал:

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

Изображения, созданные с помощью: Как использовать GLUT / OpenGL для рендеринга в файл?

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

  • opengl-rotating-triangle.mp4: 340K
  • opengl-rotating-triangle.zip: 7.3M

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

Ответ на: /superuser/700419/how-to-convert-mp3-to-youtube-allowed-video-format/1472572#1472572

Полная реалистичная демонстрация слайд-шоу шаг за шагом

Создание слайд-шоу представляет собой нечто большее, чем просто запуск одной команды ffmpeg, поэтому здесь приведен более интересный подробный пример, вдохновленный этой временной шкалой .

Получите входные данные:

mkdir -p orig
cd orig
wget -O 1.png https://upload.wikimedia.org/wikipedia/commons/2/22/Australopithecus_afarensis.png
wget -O 2.jpg https://upload.wikimedia.org/wikipedia/commons/6/61/Homo_habilis-2.JPG
wget -O 3.jpg https://upload.wikimedia.org/wikipedia/commons/c/cb/Homo_erectus_new.JPG
wget -O 4.png https://upload.wikimedia.org/wikipedia/commons/1/1f/Homo_heidelbergensis_-_forensic_facial_reconstruction-crop.png
wget -O 5.jpg https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Sabaa_Nissan_Militiaman.jpg/450px-Sabaa_Nissan_Militiaman.jpg
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg
cd ..

# Convert all to PNG for consistency.
# /unix/29869/converting-multiple-image-files-from-jpeg-to-pdf-format
# Hardlink the ones that are already PNG.
mkdir -p png
mogrify -format png -path png orig/*.jpg
ln -P orig/*.png png

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

identify png/*

какие выводы:

png/1.png PNG 557x495 557x495+0+0 8-bit sRGB 653KB 0.000u 0:00.000
png/2.png PNG 664x800 664x800+0+0 8-bit sRGB 853KB 0.000u 0:00.000
png/3.png PNG 544x680 544x680+0+0 8-bit sRGB 442KB 0.000u 0:00.000
png/4.png PNG 207x238 207x238+0+0 8-bit sRGB 76.8KB 0.000u 0:00.000
png/5.png PNG 450x600 450x600+0+0 8-bit sRGB 627KB 0.000u 0:00.000

поэтому классическое соотношение сторон 480p (640x480 == 4/3) кажется подходящим.

Выполните одно преобразование с минимальным изменением размера, чтобы сделать ширину равномерной (TODO автоматизирует для любой ширины, здесь я просто вручную посмотрел на identifyвывод и уменьшил ширину и высоту на единицу):

mkdir -p raw
convert png/1.png -resize 556x494 raw/1.png
ln -P png/2.png png/3.png png/4.png png/5.png raw
ffmpeg -framerate 1 -pattern_type glob -i 'raw/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p raw.mp4

Это дает ужасный результат, потому что, как видно из:

ffprobe raw.mp4

ffmpeg просто берет размер первого изображения, 556x494, а затем преобразует все остальные изображения в этот точный размер, нарушая их соотношение сторон.

Теперь давайте автоматически конвертируем изображения в целевое соотношение сторон 480p, обрезая их в соответствии с ImageMagick: как минимально обрезать изображение до определенного соотношения сторон?

mkdir -p auto
mogrify -path auto -geometry 640x480^ -gravity center -crop 640x480+0+0 png/*.png
ffmpeg -framerate 1 -pattern_type glob -i 'auto/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p auto.mp4

Так что теперь соотношение сторон хорошее, но неизбежно нужно было кое-что подрезать, что бы вырезать интересные части изображений.

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

mkdir -p black
ffmpeg -framerate 1 -pattern_type glob -i 'black/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p black.mp4

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

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

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

-r 30делает -framerate 1видео 30 FPS для преодоления ошибок в проигрывателях, таких как VLC для низких частот кадров: VLC останавливается для видео 1 FPS, созданного из изображений с ffmpeg. Поэтому он повторяет каждый кадр 30 раз, чтобы сохранить желаемый эффект 1 изображение в секунду.

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

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

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

Проверено на

ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.

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


Если вы используете python и subprocess.call для запуска ffmpeg, вы не должны использовать одинарные кавычки 'в именах входных и выходных файлов. В противном случае он не найдет файлы.
— RunOrVeith

Это было бы здорово для меня, но моя сборка из пакета npm ffmpeg-staticне реализует glob. ( Pattern type 'glob' was selected but globbing is not supported by this libavformat build)
— Себи

-pix_fmtвызвал Trailing options were found on the commandline.ошибку
— Энтони Конг

@AnthonyKong Я не могу воспроизвести ffmpeg -framerate 1 -pattern_type glob -i '*.png' -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4на Ubuntun 19.10 ffmpeg 4.1.4 только сейчас, какая у вас версия и точная команда?
— Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功

21

Простая версия из Документов

Особенно хорошо работает с изображениями Google Earth Studio :

ffmpeg -framerate 24 -i Project%03d.png Project.mp4

1
Невозможно воспроизвести этот вывод: аппаратному ускорителю [h264 @ 0x7f148cc3cc40] не удалось декодировать изображение
— Брэм

привет, как я могу выполнить эту команду, я просто нахожу, что вы можете мне помочь?
— Невинный

@ Innocent С вашего терминала или консоли.
— Джошуа Пинтер

понял, но project% 3d.png не выбрал все мои изображения в папке с именем Project001.png, Project002.png и так далее, получил только 2 изображения, что я должен сделать, чтобы получить все мои фотографии и преобразовать их в видео
— Невинный

Вы используете %3dили %03d?
— Джошуа Пинтер

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