2016-06-01 10 views
2

Я использую ffmpeg для преобразования видео высокого качества в gif, большинство видеороликов составляет 60 кадров в секунду и более 720p, но когда я использую приведенный ниже код, чтобы преобразовать видео в gif, Я получаю очень низкий фпс для вывода GIF,ниже fps при использовании ffmpeg для преобразования mp4 в gif

#!/usr/bin/env 
palette=/tmp/pallete.png 
filter="fps=50,scale=480:-1:flags=lanczos" 

ffmpeg -y -i test.mov -vf $filter,palettegen=stats_mode=diff $palette 
ffmpeg -y -i test.mov -i $palette -lavfi "$filter [x]; [x][1:v] paletteuse" test.gif 

еще один вопрос, я отметил это - как, например, ширина увеличивается 720 вместо 480 я получаю еще меньше кадров в секунду.

здесь пример журнала выход, выход кадров ниже присвоенного 50fps

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/tmp/201631203815.mp4': 
Metadata: 
major_brand  : isom 
minor_version : 512 
compatible_brands: isomiso2avc1mp41 
encoder   : Lavf56.36.100 
Duration: 00:00:05.48, start: 0.016000, bitrate: 1579 kb/s 

Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1/0x31637661), yuv420p, 1334x1334, 1576 kb/s, 60.18 fps, 60 tbr, 1000k tbn, 50 tbc (default) 
Metadata: 
    handler_name : VideoHandler 

Input #1, png_pipe, from '/tmp/pallete.png': 
    Duration: N/A, bitrate: N/A 
Stream #1:0: Video: png, rgba(pc), 16x16 [SAR 1:1 DAR 1:1], 25 tbr, 25 tbn, 25 tbc 

Output #0, gif, to '/tmp/201631203815.gif': 
Metadata: 
    major_brand  : isom 
    minor_version : 512 
    compatible_brands: isomiso2avc1mp41 
    encoder   : Lavf56.40.101 
Stream #0:0: Video: gif, pal8, 480x480, q=2-31, 200 kb/s, 50 fps, 100 tbn, 50 tbc (default) 
Metadata: 
    encoder   : Lavc56.60.100 gif 
Stream mapping: 
    Stream #0:0 (h264) -> fps 
    Stream #1:0 (png) -> paletteuse:palette 
    paletteuse -> Stream #0:0 (gif) 
Press [q] to stop, [?] for help 

frame= 275 fps= 32 q=-0.0 Lsize= 2480kB time=00:00:05.50 bitrate=3693.5kbits/s  

Как убедиться, что выходной кадр всегда, Что задается пользователем? Любой ресурс на это высоко ценится.

UPDATE

я также заметил, что использование более высокой кадров в секунду, например filter="fps=90,scale=480:-1:flags=lanczos" имеет эффект замедления GIF, как медленный эффект движения, выход кадров еще ниже около 15fps,

ответ

5

установки значения кадров в секунду явно дали один и тот же нижний выход кадров в секунду результаты кадра = 346 кадров в секунду = 24 кв = -0,0 Lsize = 6506kB время = 00: 00: 06,92 битрейт = 7701.8kbits/с

Это не выход fps! Это кодировка скорость. Большинство игроков неправильно воспроизводят GIF с fps выше 50. См. Описание demo.

+0

, что имеет большой смысл, и похоже, что приклеивание с 50 кадров в секунду обеспечивает лучшее видео, когда gif преобразуется в mp4 с помощью gfycat, –

+1

@ 8bittree Изменено для архивирования ссылки. – Mulvya

2

У меня нет опыта в создании файлов GIF с FFmpeg, но, насколько я знаю, фильтр fps имеет индивидуальный параметр «fps» для фактического значения частоты кадров, поэтому я думаю, что он может работать некорректно, если вы его опустите.

Просто, чтобы убедиться, что фильтр получает правильное значение, вы должны явно установить значение кадров в секунду:

filter="fps=fps=50,scale=480:-1:flags=lanczos" 

Если он не работает, я бы попробовать очередной вариант «курс» тоже:

ffmpeg -y -i test.mov -i $palette -lavfi "$filter [x]; [x][1:v] paletteuse" -r 50 test.gif 

В противном случае ваш выход в консоль выглядит хорошо (он указывает, что выход будет 50 кадров в секунду), поэтому явления немного загадочны.


Рабочий раствор:

Все, что вам нужно сделать, это разбить процесс на три отдельных этапа, и использовать «-framerate» DeMUX-вариант.

Во-первых, давайте сгенерировать файл палитры:

ffmpeg -i <input_file> -filter_complex "scale=w=480:h=-1:flags=lanczos, palettegen=stats_mode=diff" palette.png 

Во-вторых, сломать видеокадры в файлы изображений:

ffmpeg -i <input_file> -r 50 -f image2 image_%06d.png 

И, наконец, присоединиться указанные изображения в последовательности один GIF: (важной частью здесь является image2 demuxer частота кадров опция!)

ffmpeg -framerate 50 -i img_%06d.png -i palette.png -filter_complex "[0]scale=w=400:h=-1[x];[x][1:v] paletteuse" -pix_fmt rgb24 output.gif 

Редактировать: Наконец-то найдите ответ!

Вам необходимо использовать image2 demuxer -framerate option!(Ответ отредактированы соответственно)

Альтернативные методы:

  • gifsickle - конвертировать изображения в формате GIF, можно установить задержку кадра
  • ImageMagic - может конвертировать видео непосредственно GIF, отличные возможности контроля качества GIF.
+0

Фильтры FFmpeg не нуждаются в имени ключа, если вы укажете значения в порядке, указанном в исходном коде. – Mulvya

+0

Это не проблема, спасибо за информацию! –

+0

, значение fps явно дало те же результаты с низким выходом fps '' 'frame = 346 fps = 24 q = -0.0 Lsize = 6506kB time = 00: 00: 06.92 bitrate = 7701.8kbits/s' '' –

 Смежные вопросы

  • Нет связанных вопросов^_^