Размер GIF слишком велик?

1258
nfisher

Я пытаюсь извлечь GIF из видеофайла MP4.

Теперь у меня есть два способа, с помощью которых я делаю это:

1) обычный:

ffmpeg -t 7.7 -ss 00:22:53 -i video.mp4 -i palette.png -s 320x174 -filter_complex "fps=15" output.gif 

который выдает файл размером 1,6 МБ.

и 2)

ffmpeg -t 7.7 -ss 00:22:53 -i video.mp4 -i palette.png -filter_complex "fps=15,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse" output.gif 

который дает способ лучше выглядеть, но 4,5 МБ (увеличение на 181%) большого файла. Он использует файл палитры 16x16, который я создал с

ffmpeg -y -t 7.7 -ss 00:22:53 -i video.mp4 -vf fps=15,scale=320:-1:flags=lanczos,palettegen palette.png 

Теперь я не совсем понимаю, как 2 GIF с одинаковым fps, длительностью и разрешением могут иметь такую ​​огромную разницу в размере. Моя интуиция была бы, они должны быть одинаковыми. Почему эта разница? И есть ли способ сократить размер 2) до размера 1) без потери качества?

Спасибо

3
Я не думаю, что ваша первая команда использует файл палитры. Создайте изображение палитры из созданного GIF и сравните его с палитрой из 3-й команды. Gyan 8 лет назад 1
Это специально. Дело в том, что обе используют две разные палитры по 256 цветов (первая стандартная, а вторая сгенерированная), но сильно различающиеся по размеру. nfisher 8 лет назад 0
Да, из стандартной палитры используется меньше цветов, и они используются неоднократно, поэтому [LZW] (https://www.cs.cf.ac.uk/Dave/Multimedia/node214.html) может сжимать его более эффективно. Благодаря специальной палитре, использование более равномерно распределено по 256 доступным вариантам. Gyan 8 лет назад 0
Представьте, что вы хотите сделать GIF-изображение в градациях серого с 8-цветовой палитрой. Палитра А имела черный, белый и 6 оттенков красного и синего. Палитра B имела скат от черного к белому. Кодер GIF будет использовать только черный и белый из палитры A, поэтому компрессор должен представлять вхождения двух записей. Из палитры B все образцы будут использоваться в различной степени. Gyan 8 лет назад 0
Это может помочь: http://blog.pkh.me/p/21-high-quality-gif-with-ffmpeg.html slhck 8 лет назад 0
Mulvya, о хорошо, это имеет смысл, спасибо. nfisher 8 лет назад 0

1 ответ на вопрос

3
HydroxCookieHoax

Из-за того, как работают GIF-файлы, чем сложнее палитра, результирующий GIF-файл довольно быстро увеличивается.

Я бы использовал GIMP для оптимизации получившегося GIF из # 2 - не уверен на 100%, как он работает, но думаю, что он в основном удаляет дублирующую информацию из одного кадра в другой.

Скриншот GIMP

Хорошо, используемая палитра имеет размер 16x16 пикселей, что дает 256 точек данных. Насколько мне известно, результирующие GIF-изображения не должны различаться по размеру, если обе используемые палитры имеют одинаковый размер (а все остальное одинаково). nfisher 8 лет назад 0
Извиняюсь за мои неполные знания по этому вопросу, но я считаю, что это как-то связано с тем, как работает система сжатия GIF (LZW): например, может случиться так, что две разные палитры приводят к разным уровням дизеринга. Дизеринг является случайным точечный шаблон, который получается, когда цвета аппроксимируются путем смешивания похожих и доступных цветов из ограниченной палитры. Дизеринг имеет отношение к размеру файла GIF, потому что он прерывает чистые области плоского цвета, которые способствуют эффективному сжатию LZW, и может сделать размер файла больше, чем нужно. HydroxCookieHoax 8 лет назад 2
Вы определенно больше читаете в теме, чем я. Спасибо за комментарий. Я полагаю, что сглаживание увеличивает размер файла, когда используется больше цветов данной палитры, как предложил Мульвья. nfisher 8 лет назад 1

Похожие вопросы