ffmpeg gif анимация

Как известно, ffmpeg поддерживает широкий набор всевозможных видеокодеков и видеоконтейнеров. Среди этих форматов есть и анимационный gif. Ffmpeg с легкостью может перевести любое видео в gif анимацию, предоставляя пользователю полный контроль над процессом через различные параметры.


Сделать анимационный gif с помощью ffmpeg очень просто, достаточно выполнить команду:

ffmpeg -i video.mp4 video.gif

и через некоторое время у вас в текущей директории появится gif’ка, которую можно вставить в web страницу или опубликовать в социальных сетях.

Но помимо простоты использования у данного метода (см. команду выше) есть один существенный недостаток. Результирующая gif анимация имеет очень большой размер и совершенно непригодна для использования в соцсетях или на страницах вашего сайта.

Но к счастью есть выход из данной ситуации и FFmpeg предлагает достойное решение. Рассмотрим следующую команду с помощью которой вы сможете получить идеальную gif’ку:

ffmpeg -ss 5.0 -t 1 -i video.mp4 -filter_complex "[0:v] fps=9,scale=480:-1,split [a][b];[a] palettegen=max_colors=16 [p];[b][p] paletteuse=dither=bayer:bayer_scale=5:diff_mode=rectangle" video.gif

Мы не будем разбирать все опции, а рассмотрим только те, которые имеют непосредственное отношение к размеру результирующей GIF анимации.

Назначение опций

Интервал

Если весь видеоролик не нужно переводить в gif’ку, то можно взять только часть видео определив временной интервал:

-ss 5.0 -t 1

-ss 5.0 — начиная с 5-ой секунды;

-t 1 — в течении одной секунды

то есть в gif’ку закодирует интервал с 5-ой по 6-ую секунды.

Частота кадров

fps=9

Если вам не критична плавность движения то выбирайте fps=15 или 9 или даже 4.

Размер изображения

scale=480:-1

Как ни странно, но это один из важнейших параметров при создании GIF анимации. Не стоит делать gif’ку из Full HD видео. Измените его размер с помощью scale.
scale=480:-1 означает, сделать ширину видео равной «480», а высоту FFmpeg подберет автоматически для сохранения исходных пропорций («-1»).

Цветовая палитра

palettegen=max_colors=16

Качество картинки в результирующей gif анимации напрямую зависит от количества цветов в цветовой палитре gif. Чем выше это число тем больше цветовых тонов будет отражено в gif’ке, но и размер выходного файла резко возрастет. Но не всегда нужно делать параметр max_color слишком большим. Если ваше видео содержит мало цветов, то не имеет смысла выбирать max_colors=256, достаточно взять 128.
Для того, чтобы посмотреть какие цвета преобладают в исходном видео и какую палитру подготовил для этого FFmpeg запустите следующую команду:

ffmpeg -v warning -i video.mp4 -vf "palettegen=max_colors=16" -y palette.png

На следующей картинке представлены кадры из gif анимации при использовании палитр с разным значением max_colors. В этой таблице видно, что max_colors = 128 вполне достаточно для создания gif’ки.

Смешение

GIF анимация использует такие алгоритмы, которые при недостатке цвета (палитра-то у нас ограниченная 256,128 или еще меньше) пытается сделать картинку максимально приближенной к оригиналу. Для этого включается механизм «dithering». Как это работает? Если у нас есть два цвета, то третий можно получить не смешением их, а геометрическим расположением по некоему шаблону. Эта методика широко используется в типографии при печати газет, когда набор цветов ограничен. Посмотрите на следующую картинку и вы увидите, как бы коврик из пикселей, это и ести dithering:

bayer_scale=5

Параметр bayer_scale изменяется от 0 до 5. Сложно рекомендовать какое-то значение. Для разных типов видео bayer_scale лучше подбирать индивидулаьно.

You May Also Like