Профессии в действии¶
Интерактивный видеосценарий на LED-экране. Система показывает видеоролики о профессиях с точками голосования, где зрители выбирают вариант продолжения.
Получение состояния¶
LED-экран подключается к WebSocket ws://host/api/v1/interactive-video/sessions/{id}/ws для получения уведомлений об изменениях:
- phase_changed — сменилась фаза (playing → voting → result)
- votes_updated — поступил новый голос
- scenario_finished — сценарий завершён
- session_finished — показ завершён
При получении события LED загружает актуальное состояние через REST GET /interactive-video/sessions/{id}/state.
Пример работы¶
- LED подключается к WebSocket
- Загружает начальное состояние:
GET /state - Получает событие
{ "type": "votes_updated" } - Загружает обновлённое состояние:
GET /state - Обновляет отображение
Фазы показа¶
| Фаза | Описание |
|---|---|
playing |
Проигрывание ролика. В углу отображается QR-код для подключения зрителей |
waiting |
Точка голосования. Видео приостановлено, показаны варианты выбора и таймер |
result |
Показ результата голосования. Победивший вариант подсвечен |
Таймер¶
Таймер синхронизируется через абсолютный timestamp ends_at (UNIX, мс). Клиент вычисляет оставшееся время: remaining = ends_at - Date.now(). Это решает проблему рассинхронизации при задержках сети.
Воспроизведение видео¶
Видео занимает весь экран. В углу постоянно отображается QR-код — зрители могут подключиться в любой момент и проголосовать в следующей точке выбора.
Формат QR-кода¶
QR-код содержит ссылку для подключения мобильного клиента:
https://app.example.com/join?session_id={sessionId}&device_id={deviceId}
Где:
- sessionId — идентификатор текущей сессии показа
- deviceId — идентификатор LED-устройства
Мобильный клиент сканирует QR, открывает ссылку и подключается к сессии через POST /interactive-video/sessions/{sessionId}/join.
В начале ролика отображается название профессии (из поля profession_name в current_branch).
Точка голосования¶
В определённые моменты видео приостанавливается. На экране появляются:
Появление (фаза waiting)¶
Видео останавливается, поверх затемнённого фона:
| Элемент | Расположение | Описание |
|---|---|---|
| Вопрос / ситуация | Верхняя часть экрана | Текст вопроса из поля prompt (например, «Что сделает разработчик в этой ситуации?») |
| Варианты продолжения | Центр экрана | 2–4 карточки с текстом варианта (text дочерних веток), расположены горизонтально |
| Таймер | Под вариантами или рядом | Крупный обратный отсчёт |
| QR-код | Угол экрана | Остаётся видимым для подключения новых зрителей |
Варианты продолжения¶
Каждый вариант — карточка с текстом. Пока голосование идёт — карточки нейтральные, без индикации лидерства.
Голосование¶
Зрители выбирают вариант на мобильных устройствах. На LED-экране:
- Таймер отсчитывает оставшееся время (из
voting_point.timer.remaining) - Счётчик голосов обновляется в реальном времени (общее количество проголосовавших —
voting_point.total_voters) - Сами варианты не раскрывают промежуточные результаты — только общее число голосов
Завершение голосования (фаза result)¶
Таймер достигает нуля. На экране:
Результат¶
| Элемент | Описание |
|---|---|
| Варианты | Карточки вариантов, победивший подсвечен (winner_branch_id) |
| Количество голосов | Число голосов за каждый вариант (из voting_point.votes) |
| Победитель | Подсветка + текст «Выбрано: ...» |
Результат показывается result_display_duration секунд, затем — переход к продолжению видео.
Продолжение¶
Видео возобновляется с того фрагмента, который соответствует победившему варианту. QR-код снова виден в углу — зрители могут подключиться к следующей точке голосования.
Если никто не голосовал¶
Если таймер истёк и голосов нет — система выбирает вариант автоматически. На экране отображается пометка «Автоматический выбор», затем видео продолжается.
Завершение показа¶
После прохождения всех точек выбора в видеосценарии LED автоматически переходит к следующему сценарию (если есть). После завершения всех сценариев — фаза finished, возврат в режим заставки.
Оператор может завершить показ досрочно через панель управления.
Связанные разделы¶
- Подсистема: Профессии в действии
- Панель оператора: Профессии в действии
- Мобильный клиент: Голосование
- CMS: Управление видеосценариями