2010-05-13 17:58:09 +0000 2010-05-13 17:58:09 +0000
89
89

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

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

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

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

Какие-нибудь советы?

Ответы (10)

84
84
84
2012-08-28 13:19:14 +0000

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

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

где n является началом последовательности кадров.

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

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

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

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 ).

17
17
17
2010-07-18 17:02:21 +0000

Пример скрипта можно найти в документации ffmpeg documentation :

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
14
14
14
2014-07-13 07:11:20 +0000

Из ffmpeg’s docs:

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

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

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

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

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

11
11
11
2010-05-13 18:15:35 +0000

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

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

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

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

image001.jpg image002.jpg image003.jpg

etc.

5
5
5
2010-05-13 18:23:37 +0000

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

2
2
2
2016-08-03 23:44:55 +0000

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

0x6 и конкретные примеры со звуком 0x2 и 0x2 и этот вариант был упомянут на: 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 ]0x3 и 0x2 и 0x2 и Нормальная скорость видео с одним изображением на кадр при 30 кадров в секунду 0x2 и 0x2 и 0x1 и 0x2 и 0x2 и 0x2 и т.д. Вот как это выглядит:

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' \
  -c:v libx264 -pix_fmt yuv420p out.mp4

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

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

Ответ получен: [ Как преобразовать MP3 в видеоформат, разрешенный Youtube? ]0x3 и 0x2 и 0x2 и Получить синтетические тестовые входные изображения 0x2 и 0x2 и Это тестовые изображения, которые я использовал в этом ответе:

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

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

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

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

О вариантах CLI

Обратите внимание, однако, что, несмотря на название, opengl-rotating-triangle.zip это не так общее, как паттеры оболочки Глобус, например: -glob не работает: https://trac.ffmpeg.org/ticket/3620 (по-видимому, потому что тип файла вычитается из расширения).

-i '*' делает -r 30 видео 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.

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

0
0
0
2017-10-30 18:28:51 +0000

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

$ 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
0
0
2016-01-29 12:05:41 +0000

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

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

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

0
0
0
2016-01-14 23:22:34 +0000

Вы можете сделать это с помощью 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 говорит ffmpeg замедлить его в 10 раз. Вы также можете иметь дроби там, чтобы ускорить его.

Похожие вопросы

6
10
5
37
3