Браузерная часть
Основной компонент сервиса WebRTC сервер Janus. Из коробки он предоставляет простое API для подключения к серверу, и поддержки WebRTC протокола. Поэтому, браузерная часть получилось максимально простой, в виде обертки поверх Janus API.
Серверная часть
На стороне сервера используются dosbox, ffmpeg и Janus. Все они собраны вместе в docker контейнер.
Текущая версия сервиса использует:
- Последнюю версию dosbox
- Последнюю версию ffmpeg, скомпилированную с поддержкой кодеков vp9 и opus
- Последнюю версию janus с небольшими дополнениями (о них ниже)
Стриминг звука и видео
Когда docker стартует, супервизор запускает все три программы. Dosbox запускает игру и начинает непрерывно генерировать кадры и звуки. Эти данные перенаправляются в ffmpeg, который создает два RTP стрима (звук, видео). Плагин для стриминга Janus (стандартный компонент), слушает эти стримы и генерирует WebRTC данные для браузера.
{dosbox} --> {ffmpeg} --> {janus streaming plugin}
--> {browser}
Поддержка клавиатуры
Для поддержки игровых действий (нажатие кнопок) используются каналы данных WebRTC. Каждый раз когда игрок нажимает кнопку, срабатывает обработчик клавиатуры в браузере. Он отправляет текстовые команды через дата канал на сервер.
- pipe kdown когда кнопка нажата
- pipe kup когда кнопка отпущена
На сервере эти данные обрабатываются моим расширением (исходный код). Создается именованный пайп в который записываются поступающие команды. С другой стороны, dosbox постоянно читает этот пайп и добавляет события клавиатуры в очередь для обработки.
{browser} --> {janus data text channel} --> {pipe}
--> {dosbox}
Каналы данных работают в упорядоченном режиме, время жизни одного пакета 16 мс. Т.е. события клавиатуру будут доставлены в том же порядке в каком и были нажаты.
Инфраструктура
Сервис запущен на платформе Amazon. Для каждого клиента создается новая задача Fargate. После старта задача получает публичный IP, который отправляется в браузер. При получении IP браузер инициирует WebRTC соединение с Janus сервером. Когда dosbox заканчивает работу, задача Fargate автоматически останавливается. Технически нет никаких ограничений на количество одновременных игроков.
{browser} --> {+fargate} --> {ip} -->
{browser}
...
{browser} --> {stop} --> {-fargate}
Вместо заключения
Получилось достаточно поверхностно,
Получилось достаточно поверхностно, пока не понимаю про что написать подробнее. Вцелом архитектура показала себя вполне рабочей. Сервис работает в бесплатном режиме, попробовать можно здесь.
Обзорная статья: DOS Cloud Gaming