Я конвертирую FLV
фильм в 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?
Вывод команды:
ffmpeg -i input.flv -ss 00:00:00.000 -pix_fmt rgb24 -r 10 -s 320x240 -t 00:00:10.000 output.gif
ffmpeg version 0.8.5-6:0.8.5-0ubuntu0.12.10.1, Copyright (c) 2000-2012 the Libav developers
built on Jan 24 2013 14:52:53 with gcc 4.7.2
*** THIS PROGRAM IS DEPRECATED ***
This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.flv':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2013-02-14 04:00:07
Duration: 00:00:18.85, start: 0.000000, bitrate: 3098 kb/s
Stream #0.0(und): Video: h264 (High), yuv420p, 1280x720, 2905 kb/s, 25 fps, 25 tbr, 50 tbn, 50 tbc
Metadata:
creation_time : 1970-01-01 00:00:00
Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 192 kb/s
Metadata:
creation_time : 2013-02-14 04:00:07
[buffer @ 0x92a8ea0] w:1280 h:720 pixfmt:yuv420p
[scale @ 0x9215100] w:1280 h:720 fmt:yuv420p -> w:320 h:240 fmt:rgb24 flags:0x4
Output #0, gif, to 'output.gif':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2013-02-14 04:00:07
encoder : Lavf53.21.1
Stream #0.0(und): Video: rawvideo, rgb24, 320x240, q=2-31, 200 kb/s, 90k tbn, 10 tbc
Metadata:
creation_time : 1970-01-01 00:00:00
Stream mapping:
Stream #0.0 -> #0.0
Press ctrl-c to stop encoding
frame= 101 fps= 32 q=0.0 Lsize= 8686kB time=10.10 bitrate=7045.0kbits/s dup=0 drop=149
video:22725kB audio:0kB global headers:0kB muxing overhead -61.778676%
Благодарю.
Ответы:
ffmpeg
пример183K
ffmpeg
может вывести высокое качество GIF. Всегда рекомендуется использовать последнюю версию: скачать или скомпилировать .-ss 30
) ввода и создаст 3 секунды вывода (-t 3
).-loop
возможностью вывода. Значение0
бесконечного цикла.Посмотрите Высокое качество GIF с FFmpeg для многих других примеров и опций.
convert
Пример ImageMagick227k
Другой метод командной строки - это передача из
ffmpeg
toconvert
(илиmagick
) из ImageMagick.Установка частоты кадров
Установите частоту кадров с помощью комбинации
fps
фильтров вffmpeg
и-delay
вconvert
. Это может быть сложно, потому чтоconvert
просто получает сырой поток изображений, поэтому не сохраняется fps. Во- вторых,-delay
значениеconvert
в клещами (есть 100 тиков в секунду), а не в кадрах в секунду. Например, сfps=12.5
= 100 / 12,5 = 8 =-delay 8
.convert
округляет-delay
значение до целого числа, поэтому 8.4 приводит к 8, а 8.5 - к 9. Это фактически означает, что при установке равномерной задержки для всех кадров поддерживаются только некоторые частоты кадров (конкретная задержка может быть установлена для каждого кадра, но она превышает этот ответ).-delay
По-видимому, игнорируется, если используется в качестве параметра вывода, поэтому его необходимо использовать до того,-
как показано в примере.Наконец, браузеры и средства просмотра изображений могут реализовывать минимальную задержку, так что вы
-delay
все равно можете проигнорировать.Видео любезно предоставлено Национальным центром по охране природы Службы охраны рыб и дикой природы США.
источник
-vf scale=320:-1,format=rgb8,format=rgb24
convert
команды для преобразования из кадров PNG я в конечном итоге использовалconvert -delay 5 -loop 0 -dither None -colors 80 "frames/ffout*.png" -fuzz "40%" -layers OptimizeFrame "output.gif"
, что немного уменьшает общий размер файлаscale=0:-1
, поэтому, когда вы установите масштаб0
, он будет брать масштаб из видео.Если вы предпочитаете избегать промежуточных файлов изображений, команды, предоставляемые LordNeckBeard, могут передаваться между
ffmpeg
ImageMagick иconvert
так, чтобы промежуточные файлы не требовались:Он
-f image2pipe
сообщает ffmpeg разделить видео на изображения и сделать его пригодным для передачи по конвейеру, а также-vcodec ppm
указывает формат вывода ppm (по какой-то причине, если формат png, либоconvert
не читает все изображения из канала, либо ffmpeg делает не выводить их всех). Для-
обеих команд указывает, что канал будет использоваться для вывода и ввода соответственно.Чтобы оптимизировать результат без сохранения файла, вы можете передать вывод
convert
второйconvert
команде:gif:-
Говоритconvert
к трубе его выход , как GIF данные в формате , и-layers Optimize
говорит втораяconvert
для выполненияoptimize-frame
иoptimize-transparancy
методы (см ImageMagick Введение в анимации оптимизации ). Обратите внимание, что выходные данные-layers Optimize
могут не всегда обеспечивать меньший размер файла, поэтому вы можете попробовать сначала преобразовать его в gif без оптимизации, чтобы быть уверенным.Помните, что в течение всего этого процесса все находится в памяти, поэтому вам может понадобиться достаточно памяти, если изображения достаточно велики.
источник
avconv
convert -delay 5 -loop 0 -layers Optimize - output.gif
split
фильтр в ffmpeg. Не нужно ничегоffmpeg -ss 30 -t 3 -i "input.flv fps=10,scale=320:-1:flags=lanczos,split[x][z];[z]palettegen[y];[x][y]paletteuse" output.gif
Начиная с ffmpeg 2.6, мы можем сделать еще лучше:
HT
источник
Я сделал собственную версию скрипта, которая также параметрирует выходное разрешение и частоту кадров.
Запуск
./gifenc.sh input.mov output.gif 720 10
будет выводить GIF 10pps шириной 720p из фильма, который вы дали. Возможно, вам придется сделатьchmod +x gifenc.sh
для файла.Вы можете прочитать подробности на моем Github
Предположения: ffmpeg установлен, и скрипт находится в той же папке, что и другие файлы.
источник
Ответ от @Stephane очень хороший. Но он получит предупреждение, как
Buffer queue overflow, dropping.
для некоторого видео, и в сгенерированномgif
кадре будет пропущено.Вот лучшая версия с
fifo
фильтром, чтобы избежатьBuffer queue overflow
при использованииpaletteuse
фильтра. С помощьюsplit
фильтра можно избежать создания промежуточной палитры PNG-файла.источник
fifo
фильтра междуo2
иo3
? Чтобы избежатьBuffer queue overflow
предупреждения.сделал скрипт, протестировал и работает.
использование:
ИМЕЙТЕ ФАН :)
vim avi2gif.sh
кстати: vokoscreen - ОТЛИЧНЫЙ инструмент для захвата экрана для Linux :)
СПАСИБО МНОГО Майкл Кохаупт :) Рок устойчиво.
некоторая статистика по размеру файла:
5.3M = vokoscreen-2015-04-28_15-43-17.avi -> vokoscreen-2015-05-28_12-41-56.avi.gif = 1013K
увидеть результаты здесь.
источник
ffmpeg
С палитрой метод может работать в одной команде, без промежуточного.png
файла.Это можно сделать благодаря
split
фильтру.источник
Linux / Unix / MacOS
Следуя @LordNeckbeard подходу с
ffmpeg
командой, найдите следующую полезную функцию Bash, которую можно добавить в ваш~/.bash_profile
файл:После загрузки функции (вручную или из
. ~/.bash_profile
) у вас должна появиться новаяvideo2gif
команда.Пример использования:
или же:
Масштаб до 320 с шириной 10 кадров в секунду.
Вы также можете указать другой формат видео (например, mp4).
Macos
Вы можете попробовать приложение GIF Brewery , которое может создавать GIF-файлы из видеофайлов.
В качестве альтернативы есть несколько сайтов, которые делают онлайн-конвертацию бесплатно.
источник
Выбранный ответ предполагает, что вы хотите масштабировать исходное видео и изменять его fps в произведенном gif. Если вам не нужно это делать, работает следующее:
Это пригодилось, когда я хотел подарить подарок, который точно воссоздает исходное видео, которое я использовал.
источник
Для пользователей Windows:
создайте
video2gif.bat
файл в каталоге Windows со следующим содержимым:И тогда везде, где вы можете использовать это, как этот пример:
Тогда у вас есть
myvideo.gif
в текущем каталоге.Если
myvideo.gif
существует, вопрос от вас, чтобы перезаписать его.РЕДАКТИРОВАТЬ:
Я предлагаю использовать этот пакетный скрипт: https://github.com/NabiKAZ/video2gif
источник
fps=10
иscale=-1:-1
). Ответ Sun, уже дал нам пакетный файл, и что один (например , сценарии оболочки в ответ ПРД в и ответ thevangelist в ) имеет преимущество , что он присваивает список фильтров переменной ( один раз ), ... (продолжение)fps=10,scale=-1:-1
)? (См. Заметный ответ для примера объяснения частей команды.)Ниже приведен пакетный файл для пользователей Windows:
gifenc.bat:
Источник: высококачественный GIF с FFmpeg: извлечение только образца
Если вы просто хотите использовать одну входную переменную и иметь имя выхода, имеющее только расширение GIF (произносится JIF), используйте вместо этого:
источник
Как добавить пункт контекстного меню Windows 7/10 «щелкнуть правой кнопкой мыши», чтобы преобразовать ваш видеофайл в GIF
В некоторых других ответах упоминался скрипт video2gif , который я использовал. Но вы можете использовать любой скрипт.
Чтобы создать опцию контекстного меню, вам нужно отредактировать ваш реестр. Откройте командную строку powershell, запустив w / admin privs. Выполните эти команды:
Теперь, когда вы щелкнете правой кнопкой мыши по файлу, у вас будет опция «Запустить Video2Gif»!
Кстати, я установил ffmpeg
C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\
и поместилvideo2gif.bat
скрипт в папку bin прямо рядом сffmpeg.exe
. Я также добавилC:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\bin
к своим окнамPATH
, но я не думаю, что вам нужно.Если вы хотите иметь возможность предоставлять некоторые дополнительные флаги / аргументы командной строки для сценария, то создайте новый файл с именем
video2gif-prompt.bat
и попросите реестр использовать его вместоvideo2gif.bat
:Вы все еще можете просто нажать Enter, чтобы быстро получить значения по умолчанию.
источник