Всё, что важно знать о медиасервере Kurento в 2023 году

Обзор Kurento простым языком для людей, не сильно разбирающихся в технике, и для бизнеса.
Представьте, к вам пришёл программист и говорит: для разработки нужен медиа-сервер, и он рекомендует Kurento. Как понять, что это действительно лучший выбор? Информации много, но разобраться сложно — она слишком техническая.
Постараемся дать всю информацию, чтобы помочь вам решить, стоит ли использовать Kurento в вашей видеопрограмме. Расскажем, зачем нужен медиасервер, о лицензии, архитектуре и основных функциях — модулях, которые можно реализовать с Kurento. Завершим выводом: когда лучше выбрать низкоуровневый медиасервер вроде Kurento, а когда — готовый коробочный продукт.
Зачем в WebRTC медиасервер
Kurento — это open-source WebRTC-медиасервер. WebRTC — это стандартизированный способ передачи данных между браузерами в реальном времени с низкой задержкой, без необходимости устанавливать сторонние плагины или расширения. WebRTC работает на стороне клиента, так зачем тогда нужен медиасервер?
Основная причина — высокая нагрузка на клиент при большом числе участников. Количество соединений между пользователями растёт в геометрической прогрессии, из-за чего ухудшается качество видео и возрастает нагрузка на трафик и ресурсы устройства. WebRTC можно использовать для прямой P2P-коммуникации между 2–6 пользователями (по нашему опыту). При большем количестве участников требуется медиасервер. Кроме того, возникают сложности, если нужно записывать видео в отдельный файл или обрабатывать его в реальном времени — всю работу в этом случае выполняет клиент.
Краткая история Kurento
Kurento разработали в 2010 году в Мадриде как отдельный open-source проект.
Основной язык программирования, на котором написан Kurento — C++. Он хорошо оптимизирует использование системных ресурсов.
У медиасервера больше 2500 звёзд на GitHub и несколько сотен форков — отдельных веток проекта, которые поддерживают разработчики из сообщества. В нём реализовано множество встроенных модулей — готовых функций для видеоконференций.
На момент написания статьи — сентябрь 2021 — команда разработки Kurento вошла в состав компании Twilio, а для самого Kurento продолжают выпускать версии с небольшими исправлениями.
Тип лицензии Kurento — Apache
Kurento выпущен под лицензией Apache. Лицензия Apache даёт полную свободу использовать и изменять код — достаточно указать, какие изменения вы внесли, и не забывать про авторство исходного кода.
Продукты, в которых используется ПО под лицензией Apache, можно применять в коммерческих проектах. Вы можете бесплатно использовать Kurento в своих продуктах и получать с них доход. Отчислять Kurento какую-либо часть прибыли не требуется.
С полным текстом можно ознакомиться здесь
Архитектура Kurento: сочетание MCU и SFU
Существует два основных типа архитектуры медиасерверов: MCU и SFU.
MCU (Multipoint Conferencing Unit) — это архитектура, похожая на коллаж из видео. У нас есть несколько видеопотоков от участников, которые объединяются в одну цельную картинку с фиксированным расположением каждого окна. При использовании MCU от каждого участника приходит отдельный видеопоток, а медиасервер объединяет их в один общий поток с заданной раскладкой. В результате, несмотря на большое число участников, каждый клиент получает только один поток. Это сильно снижает нагрузку на процессор и трафик на стороне устройства, но сильно нагружает сервер и ограничивает гибкость настройки видеораскладки. В MCU невозможно точно определить, кто именно сейчас на экране. Обработка и смешивание потоков требует много вычислительных ресурсов, что увеличивает расходы на сервер. Такая архитектура подходит в основном для больших совещаний (более 40 участников). MCU особенно полезна, если нужно транслировать видео на слабых устройствах, например, на телефонах, благодаря обработке на сервере.
SFU (Selective Forwarding Unit) — это архитектура, ставшая популярной в современных WebRTC-решениях. Она позволяет каждому участнику видеоконференции получать только те видеопотоки, которые ему нужны в данный момент. SFU похожа на мозаику: каждый элемент приходит отдельно, а как его использовать — решает клиент. При такой схеме каждый участник отправляет свой видеопоток на сервер, но получает от него только те потоки, которые выбрал. Это снижает нагрузку на сервер и клиент, а также даёт полный контроль над интерфейсом видеочата. В отличие от MCU, сервер SFU не декодирует и не перекодирует видео — он просто пересылает потоки. Благодаря этому нагрузка на процессор сервера значительно ниже. SFU отлично подходит для трансляции (один ко многим или стриминг одного человека), так как легко масштабируется в зависимости от числа участников. Однако такой подход требует от сервера большей исходящей пропускной способности, поскольку ему нужно передавать каждому клиенту несколько потоков.
Сравним эти два типа на примере видеоконференции из четырёх участников.
На клиенте:

На сервере c5 large:

Существуют также гибридные системы, использующие комбинированные архитектуры, что позволяет добиться наилучших результатов в зависимости от количества пользователей и потребностей клиента. Например, если клиент — слабое мобильное устройство, оно может получать один объединённый поток от медиасервера, как в MCU. Пользователи браузеров, в свою очередь, получают потоки отдельно, что позволяет гибко настраивать отображение, например, в виде сетки — как в SFU. Ещё один случай — взаимодействие с SIP-устройствами (в основном IP-телефония), где поддерживается только режим MCU. Некоторые гибридные решения способны автоматически переключаться с SFU на MCU, когда число участников достигает определённого порога.
Kurento — гибкое решение, которое поддерживает оба типа. По умолчанию Kurento использует архитектуру SFU с помощью элемента Compositor. Вы можете комбинировать SFU и MCU, чтобы получить гибридную модель. По умолчанию Kurento работает в режиме SFU.
Основные модули Kurento
Что такое модули: принципы дизайна Kurento
Kurento включает несколько основных модулей, которые работают не только с WebRTC. В него встроена поддержка записи видео, компьютерного зрения и AR-фильтров. Медиасервер Kurento — хороший выбор, если нужно работать с WebRTC напрямую, без дополнительных обёрток. Это особенно удобно при интеграции видеочата с нативными приложениями на Android и iOS. Сигнальный механизм в Kurento не предусмотрен — вы можете выбрать подходящий вариант сами, например websockets или что-то другое, в зависимости от задач проекта. Kurento — проект с открытым кодом, что снижает затраты на использование медиасервера.
В отличие от готовых платных медиасерверов, Kurento — это низкоуровневое решение, которое позволяет гибко настраивать взаимодействие модулей в пайплайне.
В отличие от Jitsi — готового решения с встроенным интерфейсом, с Kurento проще выбрать и реализовать нужный вам интерфейс. А ещё можно написать собственный модуль, чтобы расширить стандартные возможности медиасервера.
Основа архитектуры Kurento — модульность: каждый медиаэлемент представляет собой программный блок, выполняющий одну конкретную задачу и способный взаимодействовать с другими. В терминологии Kurento такие блоки называются Media Elements, а их совокупность — Media Pipeline. Медиаэлементы — это просто модули, которые соединяются внутри пайплайна. Разработчики сами определяют топологию пайплайна — она не обязана быть линейной.
Ниже — об основных модулях Kurento.
WebRTC видеоконференция
Основа Kurento для видеоконференции — WebRtcEndpoint. С его помощью можно передавать WebRTC-стримы, соединяя их между собой в одном пайплайне. В рамках видеоконференции пайплайн можно представить как отдельную комнату, изолированную от других. WebRtcEndpoint — это пользователь, который либо транслирует своё видео, либо смотрит чужое.
Запись видео и аудио
Для записи медиасервер использует RecorderEndpoint. Мы можем соединить WebRTC поток с рекордером, а он запишет результат в файловую систему. После соединения и начала видео просто вызовите метод record у рекордера. При записи можно указать ограничения: например, мы можем записывать только аудио или только видео.
Проигрывание стороннего медиа
В Kurento есть встроенный модуль PlayerEndpoint, который позволяет проигрывать сторонние аудио- и видеофайлы, а также стримы RTMP и RTSP. Это значит, что вы можете подключить поток с IP-камеры и транслировать его другим участникам видеоконференции. С помощью плеера можно воспроизводить музыку для пользователей — это удобно для музыкальных платформ, онлайн-занятий или даже text-to-speech. Благодаря гибкости пайплайна, медиа можно транслировать не всем участникам, а конкретному пользователю — в зависимости от ваших задач. Для этого создайте новый PlayerEndpoint и подключите его к нужному WebRtcEndpoint с помощью метода connect. Как только потребуется воспроизвести медиафайл, вызовите у плеера метод play.
Computer vision и фильтры
Медиасервер позволяет использовать множество фильтров. Например, ZBarFilter используется для распознавания QR кодов, FaceOverlayFilter способен распознавать лицо в видеопотоке и выделять его в реальном времени. А с помощью GStreamerFilter можно создать свой кастомный фильтр. Также, у Kurento есть несколько экспериментальных модулей, в т.ч. и фильтров, которые устанавливаются отдельно. Есть kms-crowddetector, который распознаёт толпу, есть kms-platedetector для определения автомобильного номера транспортного средства.
Нет поддержки мультистриминга с разными разрешениями
Поддержка Simulcast (отправка нескольких копий одного и того же потока в разном качестве) и SVC (отправка потока в низком качестве с возможностью добавления дополнительных слоёв, которые позволяют улучшить качество при необходимости) отсутствует.
Существует вариант решения с созданием нескольких стримов. Можно запрашивать видео с разными разрешениями и переключаться между ними при потере пакетов. Однако это решение далеко от оптимального — оно сильно нагружает сервер. Так что будем честны: «хорошего» решения тут нет.
Поддержка кодеков в Kurento
Для передачи потоков по сети компьютеры используют кодеки — программы, которые преобразуют данные или сигналы. Они позволяют сжать видео или аудио до размеров, удобных для передачи по сети и воспроизведения.
Kurento Media Server поддерживает кодеки H.264, VP8/9 для видео и OPUS для аудио. Они обеспечивают высокое сжатие видеопотока без потери качества. Эти кодеки — современные стандарты WebRTC. Поддержки AV1 и H.265 нет. Это самые новые стандарты, которые позволяют снизить битрейт при том же качестве по сравнению с более старыми форматами. Медиасервер сам сжимает поступающий видеопоток до уровня, соответствующего текущей пропускной способности канала до клиента, и при необходимости транскодирует его в нужный кодек.
API, документация, поддержка TypeScript
Взаимодействовать с Kurento API можно c помощью библиотеки kurento-client, а также с помощью различных дополнительных библиотек, например kurento-utils. На официальном сайте Kurento есть развёрнутая документация с описанием работы каждого модуля и примерами использования для Javacript и Java. На сайте есть информация не только по работе самого медиасервера, но также по смежным с WebRTC-темам. Например, по настройке TURN (Traversal Using Relay NAT) сервера, необходимого для обхода ограничения коммуникации пользователей, находящимися за симметричными NAT. TURN протокол позволяет получить IP адрес и порт, необходимые для установки WebRTC-соединения в условиях ограничений NAT. В симметричных NAT есть дополнительная защита от фальсификаций транспортных данных. В симметричной таблице NAT сохраняются еще 2 параметра — IP и порт удаленного узла. Пакеты из внешней сети отбрасываются, т.к. данные источника не совпадают с теми, что записаны в таблице. Клиентская библиотека имеет поддержку типов для Typescript.
Количество участников в видеоконференции
У разработчиков Kurento есть свой бенчмарк для определения максимального количества сессий на одной машине. Хотя он изначально создан для OpenVidu, его можно использовать и с Kurento. Ниже — таблица с результатами для разных машин на AWS.

Например, один инстанс AWS c5.large с двумя ядрами ЦПУ и 4 ГБ оперативной памяти может поддерживать 4 групповых митинга по 7 участников. В каждом митинге пользователи одновременно передают и просматривают видео- и аудиопотоки друг друга (режим «многие ко многим»).
OpenVidu — готовый медиасервер на базе Kurento
На основе Kurento создан фреймворк OpenVidu, который упрощает разработку — он подходит, если вам нужны только базовые видеоконференции.
Для общения с фреймворком не обязательно использовать сервер — достаточно подключить клиентскую библиотеку. У неё есть множество обёрток для популярных фронтенд-фреймворков, а также для Android и iOS.
OpenVidu — бесплатное решение, но есть и платная версия, которая добавляет возможности для мониторинга и масштабирования WebRTC-платформы. В будущем планируется поддержка Simulcast и SVC, а также автоматическое переключение на P2P-сессии для случаев 1 на 1.
Когда использовать низкоуровневый медиасервер, а когда готовый
Кроме OpenVidu существуют и другие готовые медиа-серверы. Их главный минус — не все функции уже реализованы. Позже вам может понадобиться добавить какую-то возможность в свой продукт, а в готовом решении её просто нет.
Как принять решение об использовании:
- перечислите все функции, которые нужны вам в продукте
- проверьте, что все они присутствуют в выбранном коробочном продукте
- если знаете, что позже может понадобиться множество функций, о которых сейчас не знаете — используйте низкоуровневый медиасервер
Выводы: когда подойдёт Kurento?
- для платформы с групповыми видеоконференциями
- для интеграции с AR
- для записи видео
- для проигрывания медиафайлов для участников конференции
- для работы с чистым RTP, например, для трансляции в прямом эфире
Kurento — низкоуровневый медиасервер. Если вы используете его, разработка может занять больше времени, чем с готовыми решениями, особенно если ваш разработчик не специализируется на Kurento.
Зато с Kurento можно реализовать любые функции. В коробочных решениях часто бывает, что заказчик просит добавить что-то ещё, а такой функционал в системе не предусмотрен.
