Титры без лишней магии.
Эфирные титры и анимированная графика на веб-технологиях. Открытая замена GT от vMix, построенная на NodeCG. Панель ниже работает: щёлкните переключателем, поменяйте имя.
Живая демонстрация: панель Control и out
В эфире ничего нет
Main
1920×1080Данные
What should we show first?
- Multiple outs30%
- Code titles48%
- REST API22%
140 votes
GT зачёркнут, значит заменён.
notGT делает работу редактора титров и их проигрывателя. Три вещи с собой не взяли.
-
Редактор под Windows
Редактор — вкладка браузера на любой машине в сети.
-
Покупка лицензии
MIT, как у NodeCG. Исходники можно читать и менять.
-
Свой формат файлов
Титр — это веб-страница. Всё, что умеет веб, умеет титр.
Нарисуйте. Или напишите.
// Данные только раскладывают текст, поэтому опечатка,
// исправленная в эфире, не проигрывает появление заново.
onData(() => {
$("name").textContent = vars("speaker.name", "First Last");
$("role").textContent = vars("speaker.role", "Role");
});
onShow(() => {
plate.animate(WIPE_IN, { duration: 520, easing: OUT });
});
// Уход занимает EXIT мс. notGT читает это число здесь и начинает
// уход настолько раньше, чем закончится показ.
const EXIT = 480;
onHide(() => {
plate.animate(WIPE_OUT, { duration: EXIT, fill: "forwards" });
}, EXIT);
vars, onData, onShow, onHide) и живым превью рядом с кодом. Или лежать файлом в каталоге, если удобнее писать в своём редакторе.- Видео с альфой
- Бросьте в редактор ролик ProRes или HEVC с прозрачностью — он конвертируется через ffmpeg в то, что умеет проигрывать браузер.
- Одиннадцать титров для старта
- Плашки с именем, счёт матча, гость из списка, тема выпуска, логотип, опрос, бегущая строка, обратный отсчёт, часы и карточка погоды — в одном стиле.
- Или попросите модель
- В репозитории лежит промпт, который уже знает контракт рантайма. Опишите титр — получите html, css и js анимации на коде.
Меняйте значение, а не титр.
Имена, счёт и подписи живут в одном хранилище данных. Меняете значение — оно меняется в эфире, не проигрывая появление заново. Выбираете строку списка — в эфир идёт этот гость.
- Excel как данные
- Бросьте книгу на панель Data или следите за книгой на сервере. Каждый лист становится списком, файл перечитывается при сохранении, а правка в дашборде записывается обратно в него.
- По времени или до выключения
- Титр проигрывается один раз и уходит сам либо стоит, пока его не выключат. Таймеры идут на сервере, поэтому все out'ы и все дашборды согласованы.
- Сколько угодно out'ов
- Каждый out — одна прозрачная страница своего размера и один Browser Source. Что и на каком out'е сейчас в эфире, всегда видно — жёлтым Lemon.
В одном запросе от эфира.
Всё, что делает дашборд, может сделать скрипт: показать, убрать, переключить и проиграть титр, записать переменные, управлять out'ами и библиотекой.
# показать титр
curl -X POST http://localhost:9090/api/titles/lower-third/show
# поменять текст, пока он в эфире
curl -X POST 'http://localhost:9090/api/data?mode=merge' \
-H 'content-type: application/json' \
-d '{"speaker": {"name": "Anna Reed", "role": "Expert"}}'
# проиграть один раз: уйдёт сам
curl -X POST http://localhost:9090/api/titles/lower-third/trigger
# убрать
curl -X POST http://localhost:9090/api/titles/hide
ws://<host>/api/ws
server → {"type":"hello","protocol":1,"bundle":"notGT","version":"0.8.0", …}
client → {"type":"login","id":1,"token":"<wsToken>"}
server → {"type":"reply","id":1,"command":"login","ok":true, …}
server → {"type":"state","state":{ … }}
client → {"type":"show","id":2,"templateId":"lower-third","out":"main"}
server → {"type":"reply","id":2,"command":"show","ok":true, …}
server → {"type":"state","state":{ … "activeVisible":true … }}
# подключение: Generic HTTP Requests
Base URL http://<host>
Header X-API-Token: <token>
# кнопка, которая ставит титр в эфир и убирает его
POST /api/titles/lower-third/toggle
# что подсвечивает кнопку
GET /api/state
out.html?out=mainНастоящий дашборд за 22 секунды.
- Вход по паролю
- Панель спрашивает имя и пароль, и API не открыт всей сети. Для закрытой сети площадки вход можно выключить.
- Команда
- Администратор добавляет пользователей и распределяет их по группам: VJ, стример 1, стример 2. У группы свои out'ы и свои ключи WebSocket, а у каждого out'а одна ссылка для OBS, которая открывает только его.
- Читается как удобно
- Интерфейс на английском и русском, в тёмной и светлой теме.
В эфир за три шага.
-
Запустите сервер
git clone https://github.com/fursyt12/notGT.git cd notGT docker compose up --build -dОткройте
http://localhost:9090/dashboard/и войдите какadmin/admin. Сразу смените пароль во вкладке «Команда». Ни обратный прокси, ни.envне нужны.Возьмите портативную сборку в Releases, распакуйте и запустите
Скачать сборку для WindowsnotGT Launcher.exe. Устанавливать ничего не нужно: Node.js идёт в комплекте. Лаунчер выбирает сетевой интерфейс и порт, запускает сервер и открывает дашборд.npm ci npm run build cd bundles/notGT && npm install && npm run build && cd ../.. node index.jsНужен Node.js 22. Бандл не входит в npm workspaces монорепозитория, поэтому устанавливается и собирается отдельно.
-
Добавьте out в OBS или vMix
Browser Source в OBS или вход Web Browser в vMix, по размеру out'а.
http://<host>:9090/bundles/notGT/graphics/out.html?out=main -
Покажите титр
Из панели Control, с кнопки Companion или откуда угодно ещё.
curl -X POST http://localhost:9090/api/titles/lower-third/show