Как создать видео из изображений с помощью 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
user3877422
источник

Ответы:

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?
Джошуа Пинтер