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

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

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

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

Любой совет?

12 ответов

Нет необходимости переименовывать файлы при использовании -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", Кредит за это Майку Фитцпатрику /questions/472598/preobrazovanie-izobrazhenij-v-video-s-pomoschyu-ffmpeg-v-windows/472608#472608)

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

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

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

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

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

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

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

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

Вы можете найти пример сценария в документации 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

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

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

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

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

image001.jpg image002.jpg image003.jpg

и т.п.

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

Эта опция была упомянута по адресу: /questions/216133/kak-sozdat-video-iz-izobrazhenij-s-pomoschyu-ffmpeg/216165#216165 но вот несколько конкретных примеров ее использования, включая добавление аудио в выходное видео.

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

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

Нормальная скорость видео с одним изображением на кадр при 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

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

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

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

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

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

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

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

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

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

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

Проверено на

ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.

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

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

Я знаю, что это старый вопрос, но я наткнулся на него в 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. Менее сложный, без лишних переключателей в использовании, и он будет работать как есть. Вы можете добавить больше сложности (например, указав кодировщик) и настроить в соответствии с вашими потребностями.

Уважать

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

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

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

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

$ 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

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

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

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

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

где 10*PTS tells ffmpeg to slow it down 10 times. You can also have fractions there to speed it up.

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

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 (например, сначала указывается очень низкая / высокая частота кадров, а затем переходить от второго фильтра, который сделает замедленное видео нормальным?)

Другие вопросы по тегам