ASCILINE — это высокопроизводительный движок для рендеринга видео в ASCII-графику в реальном времени. Он работает на Windows, macOS и Linux, использует HTML5 Canvas для отрисовки и превращает видеопоток не в медиафайл, а в обычный текст на полотне. К такому тексту можно применять любые CSS-фильтры — неоновое свечение, тени, анимации.
С архитектурой всё хитро. Бэкенд написан на Python с FastAPI, декодирует видео через OpenCV, перегоняет пиксели в символы с помощью NumPy и отправляет бинарные данные по WebSocket. Фронтенд на Vanilla JS принимает эти кадры в виде Uint8Array, буферизирует их и рисует на Canvas’е. Аудио выступает главным тактовым генератором — по нему синхронизируется картинка, чтобы звук не обгонял видео.
В движке несколько цветовых режимов: от чёрно-белого до 16 миллионов цветов (Mode 5). Есть два основных режима отображения — ASCII Mode (символы) и PIXEL Mode (цветные блоки, приближающиеся к качеству 360p). Для Pixel Mode рекомендуется ширина от 600 до 900 колонок, для ASCII — 200–240. Если не указывать ширину, движок сам ставит 450 для пиксельного режима и 200 для текстового.
Отдельная фишка — опциональный адаптивный кодек. Вместо того чтобы каждый раз гонять полный кадр, он выбирает наилучшее сжатие из трёх вариантов: RAW (без сжатия), ZLIB (сжатие всего кадра) и DELTA (только изменившиеся ячейки). Клиент подключается с флагом /ws?codec=adaptive, иначе работает старый протокол. На тестах с разрешением 200×80 и режимом 5 экономия трафика составила от 11,6% в пиксельном режиме до 0,3% на статичных слайдах (то есть в 375 раз меньше). Для сложных сцен — 63%, и никогда не хуже обычного протокола.
Есть и lossy-режим: флаг --quality с уровнями от lossless до low. Цветовая ячейка отправляется заново, только если её значение отклонилось от того, что уже есть у зрителя. Это режет трафик ещё на 15–30% почти незаметно для глаза.
Для отслеживания реальной экономии можно запустить сервер с флагом --debug — в терминале будет прямая сравнительная таблица RAW vs WIRE байтов.
Видео можно стримить по локальной сети через --host 0.0.0.0. Плейлисты задаются в JSON с индивидуальными настройками режима, громкости и ширины для каждого ролика. Есть режим папки — все файлы из videos/ проигрываются в порядке файловой системы. Аудио обрабатывается через FFmpeg (нужен отдельно), громкость регулируется флагом --vol от 0 (полное отключение аудио) до 5 (двойная громкость).
Весь код распространяется под лицензией MIT с дополнительной антирекламной оговоркой. Проект доступен на GitHub, а живое демо — на asciline.dev.