Уточнение опции ввода ffmpeg с файлами изображений в качестве входных данных


34

У меня есть несколько изображений, и я хотел бы сделать анимированный GIF с ffmpeg. Изображения имеют названия как:

837_1.png
838_1.png
...

Я пытаюсь понять параметр командной строки -i в ffmpeg, но сталкиваюсь с некоторыми проблемами.

Если я ничего не укажу, он попросит меня заменить файлы:

ffmpeg -i * -vcodec libx264 out.mp4

ffmpeg version 1.2.1 Copyright (c) 2000-2013 the FFmpeg developers
  built on Jul 26 2013 20:18:03 with Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/1.2.1 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=cc --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid
  libavutil      52. 18.100 / 52. 18.100
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.104 / 54. 63.104
  libavdevice    54.  3.103 / 54.  3.103
  libavfilter     3. 42.103 /  3. 42.103
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
Input #0, image2, from '358_1.png':
  Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: png, rgb24, 550x550, 25 tbr, 25 tbn, 25 tbc
File '359_1.png' already exists. Overwrite ? [y/N]

И если я пытаюсь использовать один из наиболее часто используемых форматов (% d) в интернете ... ffmpeg не находит файлы:

fmpeg -i '%3d_1.png' -vcodec libx264 out.mp4

ffmpeg version 1.2.1 Copyright (c) 2000-2013 the FFmpeg developers
  built on Jul 26 2013 20:18:03 with Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/1.2.1 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=cc --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid
  libavutil      52. 18.100 / 52. 18.100
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.104 / 54. 63.104
  libavdevice    54.  3.103 / 54.  3.103
  libavfilter     3. 42.103 /  3. 42.103
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
[image2 @ 0x7f963a006600] Could find no file with with path '%3d_1.png' and index in the range 0-4
%3d_1.png: No such file or directory

Итак ... вот вопрос, как использовать параметр командной строки -i с ffmpg?

Ради ясности я на Mac OSX 10.8, ffmpeg версии 1.2.1, zsh 4.3.11

Ответы:


47

Без каких-либо дополнительных опций image2демультиплексор ffmpeg будет искать последовательность, начинающуюся с 0. Он также проверит этот индекс с диапазоном по умолчанию 5 (поэтому он будет жаловаться на отсутствие индекса в диапазоне 0–4). Согласно документации , вы должны установить начальный номер, если хотите начать с произвольного индекса, например, 837.

ffmpeg -start_number 837 -i '%3d_1.png' -c:v libx264 out.mp4

Цветовое пространство в преобразовании PNG в H.264

Поскольку файлы PNG используют цветовое пространство RGB для представления пикселей, преобразование в формат H.264 в конечном итоге будет иметь формат YUV 4: 4: 4 ( без подвыборки ). Полученное видео может воспроизводиться не на всех проигрывателях, особенно на тех, которые не основаны на FFmpeg. Ваш игрок будет показывать только черные рамки, или, возможно, сбой. Чтобы это исправить, измените формат пикселя на YUV 4: 2: 0:

ffmpeg -start_number 837 -i '%3d_1.png' -c:v libx264 -pix_fmt yuv420p out.mp4

Для контроля качества используйте -crfопцию. См. Руководство по кодированию x264 для получения дополнительной информации.

Почему *шар не работает

Не используйте в *качестве параметра ввода. Оболочка развернет его до всех файлов в текущем каталоге, прежде чем ffmpegувидит его, поэтому команда развернется до ffmpeg -i file1 file2 … filen. Поскольку все входные файлы ffmpegнуждаются в этом -iпараметре, он будет принимать их file2 … filenвместо выходных и перезаписывать их. Не хорошо.


очень полный ответ! и у вас также есть несколько советов по анимации GIF?
nkint

Для анимированных GIF-файлов вы хотите обновить ffmpeg до версии 2.0 и выше, поскольку они значительно улучшили визуальное качество. На странице загрузки есть несколько ссылок на статические сборки для OS X. Для более старой версии ffmpeg см .: ffmpeg с ужасным качеством преобразует видео .flv в .gif
slhck

На самом деле, он проверяет не только +0,4, но и 8,16,32,64 и т. Д. Это заметно при использовании URL-адресов HTTP. Тем image2не менее, не может распознать, что 200 OKявляется эквивалентом «файл найден», поэтому он не прекращает поиск.
MSalters

1
Я получаю то же самое даже после попытки реализовать ваши предложения. Мои файлы называются DSCxxxxx.jpgгде xxxxx5-значный номер, начинающийся с нуля (обратите внимание, у меня нет подчеркивания). Тем не менее, после запуска ffmpeg -r 30 -start_number 04606 -i DSC%d.jpg out.mp4я получаю ту же ошибку, что и в оригинальном посте выше
Anonymous

@jphollowed Вы поместили шаблон имени файла в кавычки?
slhck

29

Globbing можно включить, указав -pattern_type globопцию:

ffmpeg -pattern_type glob -i '*.png' -vcodec libx264 out.mp4

2
Намного лучше :)
Густав

3
Только это сработало для меня. Ни в коем случае не получить это xxx%d.png, xxx%3d.png, 'xxx%d.png'или 'xxx%3d.png'вещь , рабочий
yPhil

Я получаю ту же ошибку после попытки этого:[image2 @ 0x2552560] Could find no file with path '*.jpg' and index in the range 0-4 *.jpg: No such file or directory
Аноним

Тип шаблона 'glob' был выбран, но глобализация не поддерживается этой сборкой libavformat [с использованием Windows ffmpeg] [oof, следовало прокрутить вниз один ответ]
Katastic Voyage

7

Примечание. Подстановка шаблонов не работает в Windows (и, возможно, никогда из-за отсутствия поддержки подстановки в libavfilter в Windows.) Поэтому, если вы делаете это в Windows, вам придется переименовывать файлы, чтобы они были пронумерованы последовательно. и без пробелов.

Вы можете переименовать их с помощью простой командной строки Powershell:

dir *.jpg | %{$x=0} {Rename-Item $_ -NewName “Base$x”; $x++ }

Это вернет file1.jpg file2.jpg... file10.jpgчто, если вы сортируете в алфавитном порядке, в конечном итоге file1.jpg, file10.jpg...file2.jpg
18:00

Разве это не должно быть Base $ x.jpg? Как есть, ваш переименовал все мои и убил расширения файлов.
Katastic Voyage

5

лучший способ переименовать с помощью PowerShell (сохранить порядок):

dir *.jpg | %{$x=0} {Rename-Item $_ -NewName "Base$($x.tostring('000000')).jpg"; $x++ }

dirВсегда ли файлы возвращаются в алфавитном порядке? Было бы безопаснее добавить sort-objectв смесь?
августа
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.