Как создать видео из изображений с помощью 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 также поддерживает глобирование в стиле 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 of
img001.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
: 340Kopengl-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 изображение в секунду.
Следующие шаги
Вы также хотите:
отрежьте немного аудио, чтобы соответствовать длине видео: https://stackoverflow.com/questions/18444194/cutting-the-videos-based-on-start-and-end-time-using-ffmpeg
ffmpeg -i in.mp3 -ss 03:10 -to 03:30 -c copy out.mp3
добавить обрезанный звук: как объединить аудио и видео файл в ffmpeg
ffmpeg -i video.mp4 -i audio.mp3 -c copy output.mkv
TODO: научитесь вырезать и объединять несколько аудио файлов в видео из командной строки:
- https://stackoverflow.com/questions/42250223/ffmpeg-cut-and-concat-single-command-line
- https://video.stackexchange.com/questions/21315/concatenating-split-media-files-using-concat-protocol
- Объединить несколько файлов WAV с помощью одной команды, без дополнительного файла
Проверено на
ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.
Библиография
- http://trac.ffmpeg.org/wiki/Slideshow официальная вики
Я согласен с Франциско, но в качестве обходного пути вы можете просто написать быстрый скрипт для перемещения или создать символические ссылки на файлы с порядковыми номерами, которые нужны ffmpeg. Затем сценарий может вызвать ffmpeg, а затем удалить ссылки или переместить файлы обратно в их исходные местоположения.
Я знаю, что это старый вопрос, но я наткнулся на него в Google, ища тот же ответ. Ни один из ответов здесь не удовлетворил меня полностью, поэтому я больше занимался поиском и чтением, и это команда, которую я придумал для своей собственной проблемы.
cat {0032..1501}*.png | ffmpeg -f image2pipe -framerate 5 -i - -s 720x480 test2.avi
Причина, по которой я бы использовал такую команду...
- Cat и -f image2pipe дают вам более точный контроль над тем, какие изображения вы используете. Например, он позволяет вам использовать функции bash, такие как расширение скобок, и другие команды, такие как grep, для точной настройки результатов, которые вы выберете.
- Меньше переключается, чтобы запомнить.
- Я рекомендую НЕ использовать -r, а вместо этого просто использовать -framerate. По моему опыту -r имеет тенденцию отбрасывать кадры чаще.
- Менее сложный, без лишних переключателей в использовании, и он будет работать как есть. Вы можете добавить больше сложности (например, указав кодировщик) и настроить в соответствии с вашими потребностями.
Уважать
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 (например, сначала указывается очень низкая / высокая частота кадров, а затем переходить от второго фильтра, который сделает замедленное видео нормальным?)