Документация
ОС Аврора 5.1.1

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

Архитектура 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.

Звонок из браузера ПК на телефон

  1. Запустить пример WebRTC на телефоне с ОС Аврора.

  2. Открыть файл signaling_server/server_test.html в браузере.

  3. Установить адрес сервера как ws://192.168.2.15:8881 и нажать на переключатель «Подключиться»:

    Подключение

    В результате кнопка «Вызов» станет зелёной:

    Вызов

  4. Нажать кнопку «Вызов».

Сборка примера

  • Пакет 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.

Для сборки примера WebRTC API для Аврора 5.1.0-5.1.4 существует два способа.

Первый способ: явно присвоить параметру DCMAKE_СХХ_FLAGS_RELEASE значение -O2 вместо -O3. Например, в CMakeLists.txt проекта можно добавить строку:

STRING(REPLACE "-O3" "-O2" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")

Примечание: WebRTC — это очень большая и сложная библиотека. Агрессивная оптимизация компилятора (-O3) в некоторых версиях GCC/Clang для специфичных ARM-архитектур может приводить к ошибкам компиляции, сегментационным ошибкам (segfault) или некорректной работе алгоритмов обработки аудиосигналов. Снижение уровня оптимизации до -O2 обеспечивает необходимый баланс между производительностью и стабильностью работы бинарного файла.

Второй способ:

  1. Перейти в настройки проекта и выбрать конфигурацию сборки Выпуск:

  2. В поле Конфигурация CMake добавить переменную CMAKE_CXX_FLAGS_RELEASE со значением -O2:

Зависимости примера

  • GNU make;
  • libwebrtc;
  • Модули Qt: Qt5Quick, Qt5Gui, Qt5Qml, Qt5Network, Qt5Core, Qt5WebSockets;
  • libpulse;
  • streamcamera и streamcamera-qt5 для сборки для ОС Аврора.

Рекомендации

При интеграции и использовании WebRTC API в приложениях для ОС Аврора рекомендуется учитывать следующие нюансы:

  1. Управление памятью и многопоточность Нативный C++ API WebRTC предъявляет строгие требования к многопоточности и управлению памятью. Библиотека использует собственные выделенные потоки (Signaling thread, Worker thread, Network thread). Все вызовы методов PeerConnection должны выполняться исключительно в потоке сигнализации (Signaling thread). Использование подсчета ссылок (ref-counted pointers) обязательно: преждевременное освобождение объектов или их утечки неизбежно приводят к падению приложения.

  2. Надежность сигнального сервера Хотя сигнальный сервер передает только небольшие текстовые сообщения (JSON с SDP и ICE-кандидатами) и не участвует в передаче самих медиаданных, его доступность критична для установки соединения. В продакшен-среде следует использовать надежные решения на базе WebSocket с поддержкой TLS (wss://) и механизмами аутентификации, чтобы исключить возможность перехвата служебных сообщений и несанкционированного доступа к сессиям.

  3. Обход NAT и использование TURN-серверов В примерах часто используется прямое соединение в локальной сети, однако в реальных условиях устройства почти всегда находятся за NAT. Для успешного установления соединения в глобальной сети обязательно следует конфигурировать ICE-агента с использованием STUN-серверов (для определения публичного IP) и TURN-серверов (для ретрансляции трафика, если P2P-соединение блокируется файрволами). Отсутствие TURN-сервера приведет к тому, что часть пользователей не сможет совершать звонки в строгих корпоративных или мобильных сетях.

  4. Обработка состояний ICE и медиа Соединение WebRTC не является статичным. Сетевые условия могут меняться, что приводит к переподключениям или изменению качества связи. Необходимо подписываться на события изменения состояния ICE-агента (IceConnectionState) и состояния соединения (PeerConnectionState), чтобы корректно информировать пользователя о проблемах со связью, пытаться восстановить соединение или штатно завершать звонок при окончательном разрыве.

Мы используем cookies для персонализации сайта и его более удобного использования. Вы можете запретить cookies в настройках браузера.

Пожалуйста ознакомьтесь с политикой использования файлов cookies.