2013-02-22 20:06:30 +0000 2013-02-22 20:06:30 +0000
335
335

Как преобразовать видео в GIF с помощью ffmpeg, с приемлемым качеством?

Я конвертирую видео в GIF файл с помощью ffmpeg:

ffmpeg -i input.flv -ss 00:00:00.000 -pix_fmt rgb24 -r 10 -s 320x240 -t 00:00:10.000 output.gif

Он работает отлично, но выходной gif файл имеет очень низкое качество.

Есть идеи, как я могу улучшить качество преобразованного gif?

Ответы (12)

505
505
505
2013-02-22 21:31:46 +0000

ffmpeg пример

183k

ffmpeg может выводить высококачественный GIF. Перед началом работы всегда рекомендуется использовать последнюю версию: загрузить или скомпилировать .

ffmpeg -ss 30 -t 3 -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif
  • Этот пример пропустит первые 30 секунд (-ss 30) входа и создаст 3-х секундный вывод (-t 3).
  • Фильтр fps устанавливает частоту кадров. В примере используется частота 10 кадров в секунду. Фильтр
  • шкала изменит размер выходного сигнала до 320 пикселей в ширину и автоматически определит высоту с сохранением пропорций. В данном примере используется lanczos алгоритм масштабирования . Фильтры
  • палитра и палитра будут генерировать и использовать пользовательскую палитру, сгенерированную на входе. Эти фильтры имеют много опций, поэтому обратитесь к ссылкам для получения списка всех доступных опций и значений. См. также раздел Дополнительные параметры ниже. Фильтр
  • разделить позволит сделать все за одну команду и избавит вас от необходимости создавать временный PNG-файл палитры.
  • Петля управления с опцией вывода -loop, но значения путаются. Значение 0 - бесконечная петля, -1 - не петля, и 1 будет петлять один раз, что означает, что он будет проигрываться дважды. Таким образом, значение 10 приведет к тому, что GIF будет проигрываться 11 раз.

Дополнительные опции

Фильтры палитра и палитра имеют много дополнительных опций. Самые важные из них:

  • stats_mode (палитра). Вы можете заставить фильтры сфокусировать палитру на общем изображении (full по умолчанию), только на движущихся частях (diff), или на каждом отдельном кадре (single). Например, чтобы сгенерировать палитру для каждого отдельного кадра, используйте palettegen=stats_mode=single и paletteuse=new=1.

  • dither (палитра). Выберите алгоритм дизеринга. Существует три основных типа: детерминистический (bayer), диффузия ошибок (все остальные, включая стандартный sierra2_4a) и ни один. Ваш GIF может выглядеть лучше с использованием определенного алгоритма дизеринга, или вообще без дизеринга. Если вы хотите попробовать bayer, обязательно протестируйте и опцию bayer_scale.

См. раздел Высококачественный GIF с FFmpeg для получения пояснений, например, изображений, и более подробной информации для расширенного использования.

Также см. документацию палитра и палитра для всех доступных опций и значений.


ImageMagick convert пример

227k

Другой метод командной строки - трубка от ffmpeg до convert (или magick) из ImageMagick.

ffmpeg -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos" -c:v pam -f image2pipe - | convert -delay 10 - -loop 0 -layers optimize output.gif

ffmpeg опции:

  • -vf "fps=10,scale=320:-1:flags=lanczos" a фильтр-граф с помощью фильтров fps и шкала . fps устанавливает частоту кадров до 10, а шкала устанавливает размер до 320 пикселей в ширину, а высота автоматически определяется и использует значение, сохраняющее пропорции. В этом примере используется lanczos алгоритм масштабирования .

  • -c:v pam Выбирает кодировщик изображения пэм. В примере выводится формат изображения PAM (Portable AnyMap), который является простым, без потерь форматом RGB, поддерживающим прозрачность (альфа) и поддерживаемым параметром convert. Кодирование происходит быстрее, чем PNG.

  • -f image2pipe выбирает image2pipe muxer, потому что при выводе в трубу ffmpeg нужно сказать, какой muxer использовать. Опции

convert:

  • -delay См. раздел Установка частоты кадров ниже.

  • -loop 0 делает бесконечный цикл.

  • -layers optimize Включит оптимизатор GIF общего назначения. Подробнее см. раздел Оптимизация анимации ImageMagick . Не гарантируется, что это даст меньший результат, поэтому стоит попробовать без -layers optimize и сравнения результатов.

Установка частоты кадров

Установка частоты кадров с комбинацией фильтра fps в ffmpeg и -delay в convert. Это может усложниться, потому что convert просто получает необработанный поток изображений, поэтому fps не сохраняется. Во-вторых, значение -delay в convert находится в ticks (есть 100 тиков в секунду), а не в кадрах в секунду. Например, при fps=12.5 = 100/12.5 = 8 = -delay 8.

convert округляет значение -delay до целого числа, таким образом 8.4 приводит к 8, а 8.5 к 9. Это фактически означает, что ** только некоторые частоты кадров поддерживаются** при установке равномерной задержки для всех кадров (конкретная задержка может быть установлена для каждого кадра, но это выходит за рамки данного ответа).

-delay, по-видимому, игнорируется, если используется в качестве выходного параметра, поэтому его необходимо использовать до -, как показано в примере.

Наконец, браузеры и программы просмотра изображений могут реализовать минимальную задержку, поэтому ваш параметр -delay все равно может быть проигнорирован.

Видео любезно предоставлено Национальным учебным центром по охране природы (U.S. Fish & Wildlife Service National Conservation Training Center).

88
88
88
2014-03-18 09:47:53 +0000

Если вы предпочитаете избегать промежуточных файлов изображений, команды, предоставляемые LordNeckBeard, могут быть связаны между ffmpeg и ImageMagick’s convert, так что промежуточные файлы не понадобятся:

ffmpeg -i input.flv -vf scale=320:-1 -r 10 -f image2pipe -vcodec ppm - | convert -delay 5 -loop 0 - output.gif

-f image2pipe говорит ffmpeg разделить видео на изображения и сделать его пригодным для конвейерной передачи, а -vcodec ppm указывает выходной формат в ppm (по какой-то причине, если формат png, либо convert не считывает все изображения с конвейера, либо ffmpeg не выводит их все). - для обеих команд указывает, что канал будет использоваться для вывода и ввода соответственно.

Для оптимизации результата без сохранения файла можно передать вывод из convert во вторую команду convert:

ffmpeg -i input.flv -vf scale=320:-1 -r 10 -f image2pipe -vcodec ppm - | convert -delay 5 -loop 0 - gif:- | convert -layers Optimize - output.gif

gif:- указывает convert на передачу данных в gif-формате, а -layers Optimize указывает второй convert на выполнение методов optimize-frame и optimize-transparancy (смотрите ImageMagick Введение в оптимизацию анимации ). Обратите внимание, что на выходе из -layers Optimize не всегда получается файл меньшего размера, поэтому сначала попробуйте преобразовать его в gif без оптимизации.

Помните, что в течение всего этого процесса все находится в памяти, поэтому вам может понадобиться достаточный объем памяти, если изображения достаточно большие.

38
38
38
2015-03-23 18:39:20 +0000

Начиная с ffmpeg 2.6, мы можем сделать еще лучше:

palette="/tmp/palette.png"
filters="fps=15,scale=320:-1:flags=lanczos"

ffmpeg -i input.flv -vf "$filters,palettegen" -y $palette
ffmpeg -i input.flv -i $palette -lavfi "$filters [x]; [x][1:v] paletteuse" -y output.gif

HT

20
20
20
2017-10-05 12:04:32 +0000

Ответ из @Stephane очень хорош. Но он получит предупреждение типа Buffer queue overflow, dropping. для некоторого видео, а сгенерированная gif имеет некоторый кадр.

Вот лучшая версия с fifo фильтром, чтобы избежать Buffer queue overflow при использовании paletteuse фильтра. Использование split фильтра для избежания создания промежуточной палитры PNG файла.

ffmpeg -i input.mp4 -filter_complex 'fps=10,scale=320:-1:flags=lanczos,split [o1] [o2];[o1] palettegen [p]; [o2] fifo [o3];[o3] [p] paletteuse' out.gif
18
18
18
2015-07-12 09:35:07 +0000

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

Running ./gifenc.sh input.mov output.gif 720 10 будет выводить 720p широкий 10fps GIF из фильма, который вы дали ему. Возможно, вам понадобится сделать chmod +x gifenc.sh для файла.

#!/bin/sh

palette="/tmp/palette.png"

filters="fps=$4,scale=$3:-1:flags=lanczos"

ffmpeg -v warning -i "$1" -vf "$filters,palettegen" -y "$palette"
ffmpeg -v warning -i "$1" -i $palette -lavfi "$filters [x]; [x][1:v] paletteuse" -y "$2"

Вы можете прочитать подробную информацию о моем Github

Предположения: ffmpeg установлен, и скрипт находится в той же папке, что и другие файлы.

12
12
12
2017-09-30 15:23:29 +0000

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

ffmpeg -y -ss 30 -t 3 -i input.flv -filter_complex \
"fps=10,scale=320:-1:flags=lanczos[x];[x]split[x1][x2]; \
[x1]palettegen[p];[x2][p]paletteuse" output.gif

Это может быть сделано благодаря фильтру split .

11
11
11
2015-05-28 10:55:51 +0000

сделал сценарий, протестировал и работает.

использование:

./avi2gif.sh ./vokoscreen-2015-05-28_12-41-56.avi

HAVE PHUN :)

vim avi2gif.sh

#!/bin/sh

INPUT=$1

# default settings, modify if you want.

START_AT_SECOND=0; # in seconds, if you want to skip the first 30 seconds put 30 here

LENGTH_OF_GIF_VIDEO=9999999; # in seconds, how long the gif animation should be

echo "Generate a palette:"
ffmpeg -y -ss $START_AT_SECOND -t $LENGTH_OF_GIF_VIDEO -i $INPUT -vf fps=10,scale=320:-1:flags=lanczos,palettegen palette.png

echo "Output the GIF using the palette:"
ffmpeg -ss $START_AT_SECOND -t $LENGTH_OF_GIF_VIDEO -i $INPUT -i palette.png -filter_complex "fps=10,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse" $INPUT.gif

btw: vokoscreen - это EXCELLENT ScreenCapturing tool для Linux :)

Спасибо многим Майклу Коаупту :)

статистика некоторых размеров файлов:

5.3M = vokoscreen-2015-04-28_15-43-17.avi -> vokoscreen-2015-05-28_12-41-56.avi.gif = 1013K

смотрите результаты здесь.

10
10
10
2016-12-09 17:34:16 +0000

Linux/Unix/macOS

Следуя @LordNeckbeard approach с командой ffmpeg, пожалуйста, найдите следующую полезную функцию Bash, которая может быть добавлена в ваш файл ~/.bash_profile:

# Convert video to gif file.
# Usage: video2gif video_file (scale) (fps)
video2gif() {
  ffmpeg -y -i "${1}" -vf fps=${3:-10},scale=${2:-320}:-1:flags=lanczos,palettegen "${1}.png"
  ffmpeg -i "${1}" -i "${1}.png" -filter_complex "fps=${3:-10},scale=${2:-320}:-1:flags=lanczos[x];[x][1:v]paletteuse" "${1}".gif
  rm "${1}.png"
}

После загрузки функции (вручную или из . ~/.bash_profile), у вас должна быть новая команда video2gif.

Пример использования:

video2gif input.flv

или:

video2gif input.flv 320 10

Масштаб до 320 ширины с 10 кадрами в секунду.

Вы также можете указать другой формат видео (например, mp4).

  • *

macOS

Вы можете попробовать приложение GIF Brewery , которое может создавать GIF-файлы из видеофайлов.

Или же есть несколько сайтов, которые делают конвертацию в Интернете бесплатно.

9
9
9
2017-11-14 23:01:37 +0000

Выбранный ответ предполагает, что вы хотите масштабировать исходное видео и изменить его fps в произведенном подарке. Если вам не нужно это делать, следующие работы:

src="input.flv"
dest="output.gif"
palette="/tmp/palette.png"

ffmpeg -i $src -vf palettegen -y $palette
ffmpeg -i $src -i $palette -lavfi paletteuse -y $dest

Это пригодилось, когда я хотел подарок, который точно воссоздал исходное видео, которое я использовал.

6
6
6
2017-04-21 15:36:34 +0000

Для пользователей windows: создайте video2gif.bat файл в каталоге windows с таким содержимым:

@echo off
set arg1=%1
set arg2=%arg1:~0,-4%
ffmpeg -y -i %arg1% -vf fps=10,scale=-1:-1:flags=lanczos,palettegen %TEMP%\palette.png
ffmpeg -i %arg1% -i %TEMP%\palette.png -filter_complex "fps=10,scale=-1:-1:flags=lanczos[x];[x][1:v]paletteuse" %arg2%.gif
del /f %TEMP%\palette.png

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

video2gif myvideo.mp4

Тогда у вас есть myvideo.gif в текущем каталоге. Если myvideo.gif существует, вопрос от вас о его перезаписи.

EDIT:

Я предлагаю использовать этот пакетный скрипт https://github.com/NabiKAZ/video2gif

4
4
4
2016-06-23 22:31:26 +0000

Ниже представлен пакетный файл для пользователей Windows:

gifenc.bat:

set start_time=0
set duration=60
set palette="c:\temp\palette.png"
set filters="fps=15,scale=-1:-1:flags=lanczos"
ffmpeg -v warning -ss %start_time% -t %duration% -i %1 -vf "%filters%,palettegen" -y %palette%
ffmpeg -v warning -ss %start_time% -t %duration% -i %1 -i %palette% -lavfi "%filters% [x]; [x][1:v] paletteuse" -y %2

Source: Высококачественный GIF с FFmpeg: извлечение простого примера

Если вы хотите использовать только одну входную переменную, а выходное имя имеет только GIF (произносится как JIF) расширение, то используйте вместо этого:

3
3
3
2018-04-15 23:48:54 +0000

Как добавить “щелчок правой кнопкой мыши” в контекстное меню окна 7/10 для преобразования вашего видеофайла в gif

Некоторые из других ответов упоминали скрипт video2gif , который я использовал. Но, вы можете использовать любой скрипт.

Для создания опции контекстного меню, вам нужно отредактировать ваш реестр. Откройте интерпретатор командной строки, запустив w/ admin privs. Выполните эти команды:

$key = "Registry::HKEY_CLASSES_ROOT# Как добавить "щелчок правой кнопкой мыши" в контекстное меню окна 7/10 для преобразования вашего видеофайла в gif 

Некоторые из других ответов упоминали скрипт [ video2gif ]&003, который я использовал. Но, вы можете использовать любой скрипт. 

Для создания опции контекстного меню, вам нужно отредактировать ваш реестр. Откройте интерпретатор командной строки, запустив w/ admin privs. Выполните эти команды: 

*\shell\Run Video2Gif"
New-Item -Path $key"\Command" -Value "C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\bin\video2gif.bat `"%1`"" -Force

Теперь, когда вы щелкните правой кнопкой мыши на файл, у вас будет опция “Run Video2Gif”!

я установил ffmpeg на `C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static# Как добавить “щелчок правой кнопкой мыши” в контекстное меню окна 7/10 для преобразования вашего видеофайла в gif

Некоторые из других ответов упоминали скрипт [ video2gif ]&003, который я использовал. Но, вы можете использовать любой скрипт.

Для создания опции контекстного меню, вам нужно отредактировать ваш реестр. Откройте интерпретатор командной строки, запустив w/ admin privs. Выполните эти команды:

$key = "Registry::HKEY_CLASSES_ROOT# Как добавить "щелчок правой кнопкой мыши" в контекстное меню окна 7/10 для преобразования вашего видеофайла в gif 

Некоторые из других ответов упоминали скрипт [ video2gif ]&003, который я использовал. Но, вы можете использовать любой скрипт. 

Для создания опции контекстного меню, вам нужно отредактировать ваш реестр. Откройте интерпретатор командной строки, запустив w/ admin privs. Выполните эти команды: 

*\shell\Run Video2Gif"
New-Item -Path $key"\Command" -Value "C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\bin\video2gif.bat `"%1`"" -Force

Теперь, когда вы щелкните правой кнопкой мыши на файл, у вас будет опция “Run Video2Gif”!

я установил ffmpeg на и поместил скрипт video2gif.bat в bin dir прямо рядом с ffmpeg.exe. Я также добавил C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\bin в свои windows PATH, но я не думаю, что вам это нужно.

Если вы хотите иметь возможность добавить дополнительные флаги / аргументы командной строки в скрипт, то сделайте новый файл с именем video2gif-prompt.bat, и пусть реестр ссылается на него вместо video2gif.bat:

@echo off
set /p inp=Enter extrta args, if desired:
C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\bin\video2gif.bat %* %inp%

Вы все еще можете просто нажать enter, чтобы быстро получить значения по умолчанию.