The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Раздел полезных советов: Подготовка качественных GIF-файлов ..."
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"Раздел полезных советов: Подготовка качественных GIF-файлов ..."  +/
Сообщение от auto_tips (?), 18-Мрт-15, 13:53 
Появившиеся в FFmpeg 2.6 фильтры для работы с палитрами дали возможность существенно увеличить качество преобразования видео в GIF-файлы, за счёт создания для них высококачественных палитр.


Ранее при необходимости повышения качества GIF-файла можно было отключить использование прозрачности, что положительно сказывалось на видео с интенсивным движением или изменением цветов. Но отключение прозрачности в несколько раз повышало размер файла:

   $ ffmpeg -v warning -ss 45 -t 2 -i big_buck_bunny_1080p_h264.mov -vf scale=300:-1 -gifflags -transdiff -y bbb-notrans.gif
   $ ffmpeg -v warning -ss 45 -t 2 -i big_buck_bunny_1080p_h264.mov -vf scale=300:-1 -gifflags +transdiff -y bbb-trans.gif

   $ ls -l bbb-*.gif
   -rw-r--r-- 1 ux ux 1.1M Mar 15 22:50 bbb-notrans.gif
   -rw-r--r-- 1 ux ux 369K Mar 15 22:50 bbb-trans.gif

Наиболее оптимальным методом повышения качества преобразования является подбор оптимальной палитры, которая для GIF-файлов ограничена 256 цветами. Так как создание отдельной палитры для каждого кадра приведёт к расходованию дополнительных 768 байт на кадр, имеет смысл подготовить качественную глобальную палитру.

Перекодирование разделим на две стадии. На первой стадии сохраним статистику о палитрах для каждого кадра при помощи фильтра [[https://ffmpeg.org/ffmpeg-filters.html#palettegen palettegen]]. На второй стадии создадим сводную палитру при помощи фильтра [[https://ffmpeg.org/ffmpeg-filters.html#paletteuse paletteuse]], содержащую цвета, близкие к самым часто используемым цветам в кадрах.

Создадим скрипт gifenc.sh:

   #!/bin/sh

   palette="/tmp/palette.png"
   filters="fps=15,scale=320:-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

Для перекодирования следует выполнить:

   ./gifenc.sh video.mkv anim.gif

Для перекодирования части изображения (например, начиная с позиции 12:23, продолжительностью 35 сек), можно предварительно обрезать ролик командой:

   ffmpeg -ss 12:23 -t 35 -i full.mkv -c:v copy -map 0:v -y video.mkv

или воспользовать фильтром trim, поменяв в скрипте строку:

   filters="trim=start_frame=12:end_frame=431,fps=15,scale=320:-1:flags=lanczos"

Для оптимизации сводной палитры в фильтре palettegen  можно воспользоваться опцией stats_mod. По умолчанию применяется метод  stats_mode=full, при котором приоритет отдаётся качеству цветов неизменных частей изображения, таких как фон. При указании опции
stats_mode=diff можно поменять приоритет в сторону изменяющихся частей, таких как появляющийся поверх фона текст.

В фильтре paletteuse можно использовать опцию dither для выбора метода сглаживания цветов. Предлагается основанный на вероятностном предсказании метод dither=bayer (следует подобрать оптимальный размер шаблона через опцию dither=bayer:bayer_scale=[1,2,3]) и диффузионные методы dither=floyd_steinberg (наиболее популярный), dither=sierra2 (используется по умолчанию) и dither=sierra2_4a (быстрый вариант sierra2, учитывающий блоки по 3 пикселя вместо 7). Отключить сглаживание можно опцией dither=none.

URL: http://blog.pkh.me/p/21-high-quality-gif-with-ffmpeg.html
Обсуждается: http://www.opennet.dev/tips/info/2893.shtml

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по ответам | RSS]

1. Сообщение от ананиммemail (?), 18-Мрт-15, 13:53   +/
а можно ли какнибудь поудалять одинаковые кадры?
есть видео с камеры наблюдения, где 99% времени статичная картинка (никто неходит), вот бы из этого видео сделать короткую гифку с тем самым 1%...
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #11, #16, #19

2. Сообщение от Омоним (?), 18-Мрт-15, 23:01   +/
Debian 7:
Unrecognized option 'c:v'
Failed to set value 'copy' for option 'c:v'

Я так понимаю, это из-за разброда и шатания в разных реализациях ffmgeg-ов от разных команд?
Или libav тут ни при чем?

Ответить | Правка | Наверх | Cообщить модератору
Ответы: #3, #15

3. Сообщение от 02726 (?), 19-Мрт-15, 10:34   +1 +/
В самом же начале сказано про ffmpeg 2.6. А Debian libav, а когда вернётся нормальный ffmpeg пока неизвестно.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #2

4. Сообщение от Аноним (-), 19-Мрт-15, 11:42   +/
Огромное спасибо автору от Упячки
Ответить | Правка | Наверх | Cообщить модератору

5. Сообщение от Аноним (-), 19-Мрт-15, 15:08   +/
Наконец то я удивлю друзей вконтакте!
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #17

6. Сообщение от iZEN (ok), 19-Мрт-15, 19:56   –3 +/
Во FreeBSD только недавно появился порт ffmpeg 2.6: http://www.freshports.org/multimedia/ffmpeg26/
(версия 2.6.1 сейчас доступна)
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #7

7. Сообщение от Аноним (-), 20-Мрт-15, 11:03   +/
А зачем мне фрибзд?
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #6 Ответы: #8

8. Сообщение от sprutos (ok), 20-Мрт-15, 12:21   +/
привыкай, это Изя такой. ему везде надо похвалить, какая хорошая у него фря
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #7 Ответы: #18

9. Сообщение от Олегemail (??), 20-Мрт-15, 14:01   +/
Большое спасибо! Получаются очень качественные gif'ки :)
Ответить | Правка | Наверх | Cообщить модератору

10. Сообщение от Аноним (-), 20-Мрт-15, 17:03   +/
Воможно ли сейчас сделать несколько палитр на один кадр? Есть проприетарный софт который позволяет таким образом делать true-color гифки.
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #12

11. Сообщение от universiteemail (ok), 20-Мрт-15, 17:25   +1 +/
1) на камерах должно указываться время снимка и поэтому два снимка уже отличаются по содержимому
2) вам нужно motion detections.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #1 Ответы: #13

12. Сообщение от Аноним (-), 20-Мрт-15, 17:31   +/
это делается таким образом что кадр делится на части и каждая часть имеет свою палитру.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #10

13. Сообщение от Айнанимм (?), 21-Мрт-15, 03:41   +/
1.1) нельзя ли задать область кадра для контроля?
1.2) нельзя ли указать "размерность" изменений, например "более 5%"...?

2) т.е. видео файл скормить motion detections, его результат скормить в FFmpeg и получить gif-ку?

3) а автоматом фон убрать можно? есть кадр с "фоном", есть кадр с "предметом на фоне", можно ли оставить один предмет? (фон не "ровнозелёный")

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #11 Ответы: #14

14. Сообщение от psv (??), 21-Мрт-15, 13:06   +/
программа так и называется motion
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #13

15. Сообщение от _йцукен (ok), 23-Мрт-15, 11:24   +/
под дебом пользуюсь этим http://johnvansickle.com/ffmpeg/
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #2

16. Сообщение от count0krsk (ok), 02-Апр-15, 09:32   +1 +/
Используйте ZoneMinder и не парьтесь. Он вам сам покажет только те события, когда было движение. Определяет очень хорошо, лучше встроенного в камеры Dlink алгоритма. Даже при слабом освещении помещения от светодиодов, которых не видно с улицы через окно.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #1

17. Сообщение от count0krsk (ok), 02-Апр-15, 09:34   +1 +/
Смотри ЧСВ не сотри от радости ))
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #5

18. Сообщение от count0krsk (ok), 02-Апр-15, 09:35   –1 +/
Если каку не хвалить, копрофаги вымрут ))
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #8

19. Сообщение от тралливалли (?), 15-Апр-15, 05:57   +/
вероятно, подойдёт это
http://video.stackexchange.com/questions/12233/drop-similar-...
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #1 Ответы: #20

20. Сообщение от Аноним (-), 18-Май-15, 00:23   +/
It is actually quite easy using a videofilter with select.

This is quite sensitive to video changes:
-vf "select=gt(scene\,0.0098)"

whereas this is not so sensitive:
-vf "select=gt(scene\,0.3)"

EDIT (added your command)

so your command would look like:
ffmpeg -f video4linux2 -s 800x600 -r 15 -i /dev/video1 -maxrate 800k \
-minrate 1k -bt 800k -bufsize 2M -filter \
drawtext='text=%{localtime }:fontfile=/usr/share/fonts/truetype/DejaVuSans-Bold.ttf'  \
-vf "select=gt(scene\,0.3)" -shortest -c:v libx264 out.mp4 -y

P.S. You need to explicitly state the codec libx264 and not just tell it -f h264 and why on earth would you be using avi???

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #19


Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру