WebRTC — це відкрита технологія для передачі аудіо, відео та даних у реальному часі між пристроями напряму, без проміжних серверів. За даними WebRTC Project (2026), стандарт підтримується всіма сучасними браузерами та мобільними платформами, забезпечуючи затримку менше 500 мс. WebRTC використовує протоколи ICE, STUN, TURN для встановлення з'єднання навіть за NAT та фаєрволами.
Головне
WebRTC (Web Real-Time Communication) — це проєкт з відкритим кодом, ініційований Google у 2011 році та стандартизований W3C (JavaScript API) та IETF (протоколи). Основне завдання — забезпечити низькозатримковий зв'язок між браузерами та додатками без встановлення плагінів або стороннього ПЗ.
На відміну від традиційних рішень (RTMP, HLS), де відео проходить через сервер, WebRTC використовує peer-to-peer архітектуру: дані передаються напряму між учасниками. Це дає затримку 200-500 мс проти 3-10 секунд у HLS — різниця, критична для голосових та відеодзвінків, стрімінгу ігор та віддаленої хірургії.
За даними Google WebRTC Team (2025), технологія використовується в додатках із загальною аудиторією понад 5 мільярдів встановлень: Google Meet, WhatsApp, Discord, Telegram, Zoom (частково). Понад 85% венчурних стартапів у сфері telehealth та edtech обирають WebRTC як базовий транспорт реального часу.
Мобільна розробка отримала повноцінний WebRTC у 2013 році з виходом libjingle_peerconnection — нативної реалізації для Android та iOS. Зараз обидві платформи мають стабільні SDK з підтримкою апаратного кодування H.264 та VP8, камери, мікрофона та динаміків пристрою.
Архітектура WebRTC складається з трьох рівнів. Верхній рівень — JavaScript API (або нативний API для мобільних платформ), середній — транспортні протоколи, нижній — кодеки та безпека. Кожен рівень вирішує своє завдання, але всі вони обов'язкові для встановлення з'єднання.
MediaStream (getUserMedia) — захоплення аудіо та відео з мікрофона та камери пристрою. RTCPeerConnection — керування P2P з'єднанням: кодування, транспорт, адаптація бітрейту. RTCDataChannel — передача довільних даних (текст, файли, двійкові повідомлення) по тому ж каналу.
// JavaScript API WebRTC (браузерний приклад)
const pc = new RTCPeerConnection({
iceServers: [
{ urls: "stun:stun.l.google.com:19302" }
]
});
pc.onicecandidate = (event) => {
if (event.candidate) {
sendToPeer(JSON.stringify(event.candidate));
}
};
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
WebRTC використовує SRTP (Secure Real-Time Transport Protocol) для аудіо та відео — захищена версія RTP з шифруванням AES-128. Керування сесією йде по SCTP (Stream Control Transmission Protocol) через DTLS. Кожен потік даних шифрується обов'язково: у WebRTC немає незахищеного режиму.
Головна технічна складність WebRTC — встановлення P2P-з'єднання між пристроями, які знаходяться за NAT (Network Address Translation). Без спеціальних механізмів пристрої не можуть напряму звернутися один до одного, тому що їх локальні IP-адреси не видно з інтернету.
STUN (Session Traversal Utilities for NAT) — сервер, який відповідає на питання «Яка моя публічна IP та порт?». Клієнт надсилає запит на STUN-сервер, сервер бачить його публічну адресу та повертає її клієнту. Google публічно підтримує STUN-сервер stun:stun.l.google.com:19302.
// WebRTC на iOS — налаштування ICE серверів
import WebRTC
let config = RTCConfiguration()
config.iceServers = [
RTCIceServer(
urlStrings: ["stun:stun.l.google.com:19302"]
),
RTCIceServer(
urlStrings: ["turn:turn.example.com:3478"],
username: "user",
credential: "password"
)
]
let pc = RTCPeerConnection(configuration: config)
TURN (Traversal Using Relays around NAT) — сервер-ретранслятор для випадків, коли STUN не допомагає (симетричний NAT або корпоративні фаєрволи). У цьому режимі всі дані проходять через TURN-сервер — це знижує швидкість та збільшує затримку, але гарантує з'єднання в 99% випадків.
TURN — найдорожчий компонент інфраструктури WebRTC, оскільки сервер пропускає через себе весь медіа-трафік. За даними Coturn Project (2025), типовий TURN-сервер на 8 vCPU та 16 ГБ RAM обробляє близько 200 одночасних аудіо-дзвінків або 40 відеодзвінків у HD-якості.
ICE збирає всі можливі кандидати (локальна IP, публічна IP через STUN, релейна через TURN) і намагається встановити з'єднання в порядку пріоритету. Як тільки хоча б одна пара кандидатів (локальний-віддалений) проходить перевірку connectivity check, з'єднання вважається встановленим.
Для мобільної розробки Google підтримує libWebRTC — нативну бібліотеку для Android (AAR) та iOS (XCFramework). Бібліотека включає весь стек протоколів, кодеки (VP8, VP9, H.264, AV1) та апаратне прискорення кодування/декодування.
Android SDK надає класи PeerConnectionFactory, PeerConnection, MediaStream. Додаток створює фабрику, налаштовує відео-кодеки, захоплює потік з камери через VideoCapturer та встановлює піринг через SDP offer/answer.
// Android WebRTC — ініціалізація
import org.webrtc.*;
PeerConnectionFactory.Initialize(PeerConnectionFactory.InitializationOptions
.builder(context)
.setFieldTrials("WebRTC-H264-HighProfile/Enabled/")
.createInitializationOptions());
PeerConnectionFactory factory =
PeerConnectionFactory.builder()
.setVideoDecoderFactory(new DefaultVideoDecoderFactory(eglBase))
.setVideoEncoderFactory(new DefaultVideoEncoderFactory(eglBase, true, true))
.createPeerConnectionFactory();
iOS SDK використовує Objective-C API з обгортками RTCPeerConnectionFactory, RTCCameraVideoCapturer, RTCVideoTrack. Апаратне кодування H.264 доступне через VideoToolbox. Для відображення відео використовується RTCMTLVideoView (Metal) або RTCVideoRenderer.
// iOS WebRTC — захоплення відео з камери
let factory = RTCPeerConnectionFactory()
let capturer = RTCCameraVideoCapturer(delegate: factory)
// Вибір камери (передня/задня)
guard let device = RTCCameraVideoCapturer
.captureDevices().first(where: {
$0.position == .front
}) else { return }
// Запуск захоплення з максимальним FPS
capturer.startCapture(
with: device,
format: RTCCameraVideoCapturer
.supportedFormats(for: device).last!,
fps: 30
)
Для відеодзвінків у production мобільні додатки зазвичай використовують SDK-обгортки над libWebRTC: Twilio Video, Agora, Daily.co. Ці SDK спрощують сигналізацію, керування кімнатами та надають готові UI-компоненти для відображення відео-сітки учасників.
WebRTC не специфікує протокол сигналізації — обмін SDP (Session Description Protocol) повідомленнями між пірами. Розробник сам обирає транспорт для сигналізації: WebSocket, MQTT, SIP, XMPP або REST API. Сигналізація доставляє offer, answer та ICE-кандидати від одного піра до іншого.
Процес починається зі створення offer (ініціатор описує свої медіа-можливості), передається через сигналізацію другому піру, який відповідає answer. Після обміну SDP кожен пір встановлює ICE та запускає DTLS-SRTP для шифрування потоку.
// Android — створення та відправка offer
private fun startCall(peerConnection: PeerConnection) {
val constraints = MediaConstraints().apply {
mandatory["OfferToReceiveAudio"] = "true"
mandatory["OfferToReceiveVideo"] = "true"
}
peerConnection.createOffer(object : SdpObserver {
override fun onCreateSuccess(sdp: SessionDescription) {
peerConnection.setLocalDescription(this, sdp)
// Надсилання sdp.description на сигналінг-сервер
sendSdpOffer(sdp.description)
}
}, constraints)
}
Для мобільних додатків найбільш популярна сигналізація через WebSocket — двоспрямований канал поверх TCP, який тримає постійне з'єднання з сервером. Сервер сигналізації — часто окремий мікросервіс (Node.js, Golang, Elixir), який маршрутизує повідомлення між учасниками кімнати.
Після завершення ICE та DTLS-SRTP сигналізація більше не бере участі в передачі даних — весь медіа-трафік йде напряму P2P (або через TURN-релей). Сервер сигналізації може бути вимкнений, не перериваючи активні дзвінки. Це ключова перевага децентралізованої архітектури WebRTC.
Часті запитання
RTMP та HLS — серверні протоколи із затримкою 3-10 секунд, де всі дані проходять через сервер. WebRTC — peer-to-peer із затримкою 200-500 мс. RTMP підходить для стрімінгу на велику аудиторію, WebRTC — для інтерактивних дзвінків та ігор.
Ні, TURN потрібен тільки для випадків, коли P2P не проходить (симетричний NAT, корпоративні фаєрволи). За статистикою Google, близько 15% з'єднань потребують TURN. Для production рекомендується мати TURN-сервер як fallback для 100% надійності.
Обов'язкові кодеки: VP8 (всі платформи) та H.264 (з апаратним прискоренням на iOS/Android). Опціонально: VP9 (краще стиснення, менший бітрейт) та AV1 (надефективний, але вимогливий до CPU). Аудіо: Opus (основний) та G.711 (PCMU/PCMA).
Так, через RTCDataChannel. Це повноцінний канал для передачі довільних даних: текст, файли, двійкові повідомлення. DataChannel працює поверх SCTP з налаштовуваною надійністю (частково надійна доставка для ігор, надійна для файлів).
Через MediaRecorder API на клієнті або через SFU (Selective Forwarding Unit) — сервер, який отримує всі потоки учасників і може їх записувати. Другий варіант надійніший, оскільки запис не залежить від пристрою учасника та не переривається при відключенні.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.