Разработчик представил более эффективный видеоплеер для терминала
Сравнение кадра из видеоплеера с роликом запуска Starship и культовым «telnet towel.blinkenlights.nl».
Разработчик под ником TheRealOrange опубликовал на GitHub исходный код своей версии видеоплеера tvp для терминала, который эффективно кодирует сразу от 4 до 11 пикселей видеопотока с помощь одного символа юникода. Правда пиксели все еще не являются независимыми, а каждый символ юникода при прорисовке по-прежнему ограничен двумя цветами. Также ему удалось оптимизировать свое решение для правильного изменения цвета текста или фона на видео, даже если несколько пикселей рядом достаточно похожи.
Автор выложил проект под открытой лицензией GPL-3.0. Код видеоплеера для терминала написан на С++ (440 строк).
Разработчик рекомендует для тестов использовать версию эмулятора терминала alacritty, так как там tvp работает с оптимальной производительностью. В своем проекте разработчик для декодирования видео использует не FFmpeg, а библиотеку OpenCV.
Автор tvp пояснил, что это не новая разработка. Но большинство терминальных видеоплееров, которые он видел, используют простое кодирование двух пикселей на символ юникода. Он же решил использовать весь потенциал доступной палитры юникода и использовать для кодирования нескольких пикселей символы четверти блока юникода, а также полублоки и другие доступные вариации.
Разработчик в итоге смог добиться увеличения эффективного разрешения в четыре раза по горизонтали и вдвое по вертикали по сравнению с вариантом кодирования двух пикселей на символ юникода. Видеоплеер tvp ограничен двумя цветами на пиксель. Его алгоритм можно подогнать под каждое видео с помощью оптимальной настройки вручную опции threshold [0–255] (по умолчания значение 10), которая минимизирует максимальную разницу между цветами, которые будут сделаны одинаковыми, а затем устанавливаем их цвет при отображении на средний. Более низкое значение опции threshold в большинстве случаев приводит к большему количеству перерисовок и в итоге видео становится более прерывистым.
Пользователи оценили задумку автора. «Хорошо работает на kitty (размер терминала 317×86, поэтому 640p), очень хорошо воспроизводит анимацию. Тестировал на Ghost in the Shell, иногда она производительность падала до 20 кадров в секунду, когда много чего происходит на виидео. Качество изображения лучше, чем у vlc в режиме caca», написал участник обсуждения этого проекта на Reddit.