Перейти к содержанию

Профессии в действии

Интерактивный видеосценарий на 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.

Пример работы

  1. LED подключается к WebSocket
  2. Загружает начальное состояние: GET /state
  3. Получает событие { "type": "votes_updated" }
  4. Загружает обновлённое состояние: GET /state
  5. Обновляет отображение

Фазы показа

Фаза Описание
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, возврат в режим заставки.

Оператор может завершить показ досрочно через панель управления.


Связанные разделы