86

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

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

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

Любой совет?

12 ответов12

76

Нет необходимости переименовывать файлы, если используется ключ -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" . Кредит за это Майку Фитцпатрику https://superuser.com/a/344178/153054)

35

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

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

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

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

Используя шаблон шара

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

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

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

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

11

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

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

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

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

image001.jpg image002.jpg image003.jpg

и т.п.

5

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

1

уважать

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

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

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

0

Я знаю, что это старый вопрос, но я наткнулся на него в 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

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

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

0

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

0

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

$ 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .