WebRTC API
Библиотека WebRTC обеспечивает передачу аудио и видео данных (звонков) между браузерами. Стандарт WebRTC определяет набор ECMAScript API, позволяющих обмениваться медиа и произвольными данными с другим браузером или устройством, поддерживающим соответствующий набор протоколов реального времени.
Подробное описание
WebRTC (Web Real-Time Communication) — это проект с открытым исходным кодом, предоставляющий веб-браузерам и мобильным приложениям возможности для организации связи в реальном времени по простому API. В контексте ОС Аврора нативная C++-библиотека libwebrtc позволяет встраивать функционал видеозвонков, голосовой связи и передачи произвольных данных (Data Channels) непосредственно в приложения, минуя необходимость использования веб-браузера как прослойки. Это критически важно для разработки корпоративных мессенджеров, систем удаленной поддержки, телемедицинских решений и приложений для Интернета вещей (IoT), где требуются минимальные задержки, сквозное шифрование и прямое P2P-соединение между устройствами.
Для использования WebRTC в проекте её следует подключить по имени libwebrtc
в конфигурационном файле,
а также в spec-файле:
BuildRequires: pkgconfig(libwebrtc)
BuildRequires: pkgconfig(openssl)
Примечание: Зависимость от openssl является критической, так как WebRTC использует библиотеки OpenSSL (или BoringSSL) для реализации протоколов шифрования DTLS (Datagram Transport Layer Security) и SRTP (Secure Real-time Transport Protocol), обеспечивающих сквозное шифрование аудио-, видеопотоков и передаваемых данных.
Если в проекте присутствует система сборки qmake, нужно указать сторонние библиотеки, используемые в проекте:
LIBS += libwebrtc libopenssl
Далее библиотеку можно подключать в C++-код, указывая необходимые классы и их модули. Например:
#include "media/engine/webrtc_media_engine.h"
Подробнее WebRTC API можно изучить в документации.
Архитектура WebRTC

Архитектура WebRTC состоит из нескольких ключевых компонентов, взаимодействующих друг с другом для установки и поддержания соединения:
- PeerConnection — центральный объект, который управляет всем жизненным циклом соединения: от сбора локальных медиапотоков и генерации SDP (Session Description Protocol) до отслеживания состояния ICE-агента.
- MediaStream и MediaStreamTrack — абстракции, представляющие потоки аудио и видео. Каждый поток может содержать несколько дорожек (треков), например, одну видео дорожку с камеры и одну аудио дорожку с микрофона.
- ICE (Interactive Connectivity Establishment) — фреймворк, отвечающий за преодоление NAT (трансляции сетевых адресов) и файрволов. Он собирает все возможные IP-адреса и порты (кандидаты) для соединения и проверяет их доступность.
- STUN/TURN серверы — вспомогательные серверы, необходимые для работы ICE. STUN помогает устройству узнать свой публичный IP-адрес, а TURN выступает в роли ретранслятора трафика, если прямое P2P-соединение установить невозможно (например, из-за строгих корпоративных файрволов).
- Signaling (Сигнализация) — механизм обмена служебными сообщениями (SDP-offer/answer и ICE-кандидатами) между пирами. Сам стандарт WebRTC не регламентирует протокол сигнализации, поэтому разработчики могут использовать WebSocket, XMPP, SIP или любые другие каналы связи.
Пример работы с WebRTC
Для ОС Аврора доступен пример WebRTC.
Приложение демонстрирует:
- локальное видео, снятое с камеры (или записанное ранее видео, если камера недоступна) и видео с подключённого удалённого узла;
- захват и воспроизведение звука с помощью устройства PulseAudio по умолчанию;
- встроенный сервер для обмена сигнальными сообщениями через веб-сокет.
Приложение имеет следующую функциональность:
- Без включённого переключателя «Подключиться» ожидается входящее соединение через веб-сокет, порт
8881. - С включённым переключателем «Подключиться» устанавливается подключение через веб-сокет к сигнальному серверу через порт
IP 127.0.0.1 8881.
Следует использовать поля ввода «Сервер» и «Порт» для переопределения значений по умолчанию.
Предполагается, что телефон с ОС Аврора имеет IP-адрес 192.168.2.15.
Звонок из браузера ПК на телефон
-
Запустить пример WebRTC на телефоне с ОС Аврора.
-
Открыть файл
signaling_server/server_test.htmlв браузере. -
Установить адрес сервера как
ws://192.168.2.15:8881и нажать на переключатель «Подключиться»:
В результате кнопка «Вызов» станет зелёной:

-
Нажать кнопку «Вызов».
Сборка примера
- Пакет rpm собирается с помощью Аврора SDK, см. spec-файл.
- peerconnection_client можно собрать с помощью meson.
meson setup build
meson compile -C build
- peerconnection_client можно собрать с помощью GNU make, см. build_for_host.sh и build_for_phone.sh.
Зависимости примера
- GNU make;
- libwebrtc;
- Модули Qt: Qt5Quick, Qt5Gui, Qt5Qml, Qt5Network, Qt5Core, Qt5WebSockets;
- libpulse;
- streamcamera и streamcamera-qt5 для сборки для ОС Аврора.
Рекомендации
При интеграции и использовании WebRTC API в приложениях для ОС Аврора рекомендуется учитывать следующие нюансы:
-
Управление памятью и многопоточность Нативный C++ API WebRTC предъявляет строгие требования к многопоточности и управлению памятью. Библиотека использует собственные выделенные потоки (Signaling thread, Worker thread, Network thread). Все вызовы методов
PeerConnectionдолжны выполняться исключительно в потоке сигнализации (Signaling thread). Использование подсчета ссылок (ref-counted pointers) обязательно: преждевременное освобождение объектов или их утечки неизбежно приводят к падению приложения. -
Надежность сигнального сервера Хотя сигнальный сервер передает только небольшие текстовые сообщения (JSON с SDP и ICE-кандидатами) и не участвует в передаче самих медиаданных, его доступность критична для установки соединения. В продакшен-среде следует использовать надежные решения на базе WebSocket с поддержкой TLS (
wss://) и механизмами аутентификации, чтобы исключить возможность перехвата служебных сообщений и несанкционированного доступа к сессиям. -
Обход NAT и использование TURN-серверов В примерах часто используется прямое соединение в локальной сети, однако в реальных условиях устройства почти всегда находятся за NAT. Для успешного установления соединения в глобальной сети обязательно следует конфигурировать ICE-агента с использованием STUN-серверов (для определения публичного IP) и TURN-серверов (для ретрансляции трафика, если P2P-соединение блокируется файрволами). Отсутствие TURN-сервера приведет к тому, что часть пользователей не сможет совершать звонки в строгих корпоративных или мобильных сетях.
-
Обработка состояний ICE и медиа Соединение WebRTC не является статичным. Сетевые условия могут меняться, что приводит к переподключениям или изменению качества связи. Необходимо подписываться на события изменения состояния ICE-агента (
IceConnectionState) и состояния соединения (PeerConnectionState), чтобы корректно информировать пользователя о проблемах со связью, пытаться восстановить соединение или штатно завершать звонок при окончательном разрыве.