Обзор и устройство Slyber SFU Server

Обновлено:

Slyber SFU Server представляет собой автономный сервер селективной маршрутизации видео, аудио и данных реального времени, написанный на языке Go на базе стека Pion WebRTC v4. Эта статья объясняет простым языком, какую задачу решает сервер, как внутри него движутся пакеты и как выбрать нужный режим работы для вашего приложения.

Зачем нужен SFU сервер и почему прямое соединение браузеров не масштабируется

Когда вы делаете видеозвонок между двумя людьми напрямую через браузер, используется схема точка точка (Peer to Peer). Первый участник отправляет видео второму, а второй первому. Проблема возникает, когда в комнату заходят пять, десять или пятьдесят человек. При прямом соединении браузер каждого человека обязан закодировать и отправить отдельную копию своего видео каждому участнику встречи. Если в звонке участвуют десять человек, ваш смартфон или ноутбук одновременно выгружает в сеть девять тяжелых видеопотоков. Из за этого быстро перегревается процессор, садится батарея и полностью забивается исходящий интернет канал.

Архитектура SFU (Selective Forwarding Unit) решает эту проблему за счет центрального узла коммутации. Каждый участник отправляет свое видео и звук на Slyber SFU Server всего один раз. Сервер принимает эти пакеты и мгновенно копирует их остальным зрителям в комнате. При этом сервер не занимается тяжелым декодированием и склеиванием видеокартинки на своем процессоре, поэтому одна серверная нода способна одновременно обслуживать до 5000 активных комнат с минимальной задержкой.

Почему серверу достаточно одного сетевого порта 4443

Традиционные WebRTC серверы открывают отдельный случайный сетевой порт под каждого участника. Администраторам приходится открывать в настройках файрвола огромные диапазоны портов (например от 10000 до 60000), что усложняет настройку сети и работу в контейнерах Docker.

В Slyber SFU Server применяется режим ICE-Lite и встроенные мультиплексоры ICEUDPMux и ICETCPMux. Весь медиатрафик всех комнат и участников проходит через единый порт 4443 по протоколам UDP и TCP. Когда браузер подключается к серверу, он присылает проверочный пакет STUN с уникальным именем сессии. Сервер запоминает сетевой адрес клиента и направляет его зашифрованные медиапакеты в нужную комнату. Если у пользователя на работе заблокирован протокол UDP, браузер автоматически переключится на протокол TCP (стандарт RFC 4571) через тот же самый порт 4443. А для обмена командами управления и статистикой используется отдельный HTTP и WebSocket порт 8090.

Как устроена комната внутри сервера

Чтобы легко ориентироваться в API сервера, достаточно понимать три базовых термина его внутреннего ядра.

  • UpTrack (входящий поток издателя). Когда участник включает камеру или микрофон, внутри комнаты создается объект UpTrack. Он принимает пакеты от отправителя, сохраняет последние видеопакеты в специальный кольцевой буфер памяти на случай потерь в сети и раздает пакеты всем подписанным зрителям.
  • DownTrack (исходящий поток для конкретного зрителя). Когда другой участник хочет смотреть это видео, сервер создает для него персональный канал DownTrack и прикрепляет его к UpTrack. Каждый DownTrack работает независимо. Одному зрителю с быстрым интернетом он пересылает видео в максимальном качестве 1080p, а другому зрителю с плохим мобильным интернетом отдает уменьшенную копию 270p.
  • SlyberPacket и работа без нагрузки на память. Чтобы сервер не тормозил при пересылке сотен тысяч пакетов в секунду, он не создает в оперативной памяти новые переменные под каждый пакет. Все пакеты берутся из заранее подготовленного пула памяти sync.Pool и возвращаются обратно сразу после отправки зрителям.

Как сервер подстраивается под плохой интернет

Участники видеозвонка находятся в разных условиях. Один сидит дома на домашнем оптоволокне, а другой едет в метро со слабым сигналом сотовой сети. Чтобы видео не зависало у второго участника, Slyber SFU Server поддерживает технологии Simulcast и SVC.

Браузер отправителя кодирует видео с камеры сразу в трех слоях качества. Слой 0 содержит легкую картинку для слабого интернета, слой 1 дает среднее разрешение, а слой 2 передает четкое видео высокой четкости. Модуль оценки канала SubscriberBWE внутри сервера постоянно следит за скоростью соединения и потерями пакетов каждого зрителя. Если у зрителя падает скорость, его персональный DownTrack автоматически переключается на слой 0, сохраняя плавный звук и видео. Подробное описание настройки слоев приведено в разделе Протокол сигналинга и управление качеством.

Пять готовых профилей комнат под разные продукты

Сервер поддерживает пять специализированных профилей комнат, которые задают оптимальное поведение маршрутизатора.

  • Профиль conference (групповые видеоконференции). Включает детектор активного спикера по заголовкам звука RFC 6464 и политику экономии трафика Last N. Сервер автоматически ставит на паузу видеокамеры молчащих участников и транслирует видео только от тех людей, которые говорят в данный момент.
  • Профиль roulette_1v1 (видеорулетки и чаты один на один). Ограничивает активное видео одним собеседником и включает функцию мгновенного переключения FastSwapRouletteTrack. При нажатии кнопки следующего собеседника сервер меняет источник видео за доли миллисекунды без повторного обмена SDP и без черных экранов.
  • Профиль broadcast (вебинары и прямые эфиры). Оптимизирован для приема потоков из студии OBS или браузера через протокол WHIP и одновременной раздачи сотням зрителей через WHEP и слои Simulcast.
  • Профиль gaming (стриминг с минимальной задержкой). Настраивает буферы ретрансляции на минимальное время отклика для интерактивных приложений.
  • Профиль ai_voice (голосовые диалоги с искусственным интеллектом). Активирует интеграцию со шлюзом /ai/ws, позволяя подключать в комнату одного или нескольких голосовых ИИ ботов через обычный WebSocket с поддержкой перебивания голосом человека.