28

У меня есть несколько изображений, и я хотел бы сделать анимированный 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

4 ответа4

44

Без каких-либо дополнительных опций, демпфер 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 качестве выходных файлов и перезапишет их. Нехорошо.

26

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

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

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

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

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

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

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

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