WebRTC to otwarta technologia do przesyłania audio, wideo i danych w czasie rzeczywistym między urządzeniami bezpośrednio, bez pośredniczących serwerów. Według WebRTC Project (2026), standard jest wspierany przez wszystkie nowoczesne przeglądarki i platformy mobilne, zapewniając latency poniżej 500 ms. WebRTC wykorzystuje protokoły ICE, STUN, TURN do nawiązywania połączeń nawet za NAT i firewallem.
Najważniejsze
WebRTC (Web Real-Time Communication) — to projekt o otwartym kodzie źródłowym, zainicjowany przez Google w 2011 roku i standaryzowany przez W3C (JavaScript API) oraz IETF (protokoły). Głównym zadaniem jest zapewnienie niskolatencyjnej komunikacji między przeglądarkami i aplikacjami bez instalowania wtyczek lub dodatkowego oprogramowania.
W przeciwieństwie do tradycyjnych rozwiązań (RTMP, HLS), gdzie wideo przechodzi przez serwer, WebRTC wykorzystuje architekturę peer-to-peer: dane są przesyłane bezpośrednio między uczestnikami. Zapewnia to opóźnienie 200-500 ms wobec 3-10 sekund u HLS — różnica krytyczna dla połączeń głosowych i wideo, streamingu gier i zdalnej chirurgii.
Według Google WebRTC Team (2025), technologia jest używana w aplikacjach z łączną liczbą ponad 5 miliardów instalacji: Google Meet, WhatsApp, Discord, Telegram, Zoom (częściowo). Ponad 85% startupów venture capital w obszarach telehealth i edtech wybiera WebRTC jako podstawowy transport czasu rzeczywistego.
Rozwój mobilny otrzymał w pełni funkcjonalny WebRTC w 2013 roku wraz z wydaniem libjingle_peerconnection — natywnej implementacji dla Android i iOS. Obecnie obie platformy mają stabilne SDK z obsługą sprzętowego kodowania H.264 i VP8, kamery, mikrofonu i głośników urządzenia.
Architektura WebRTC składa się z trzech poziomów. Górny poziom to JavaScript API (lub natywne API dla platform mobilnych), środkowy — protokoły transportowe, dolny — kodeki i bezpieczeństwo. Każdy poziom rozwiązuje swoje zadanie, ale wszystkie są niezbędne do nawiązania połączenia.
MediaStream (getUserMedia) — przechwytywanie audio i wideo z mikrofonu i kamery urządzenia. RTCPeerConnection — zarządzanie połączeniem P2P: kodowanie, transport, adaptacja przepływności. RTCDataChannel — przesyłanie dowolnych danych (tekst, pliki, komunikaty binarne) tym samym kanałem.
// JavaScript API WebRTC (przykład przeglądarkowy)
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 wykorzystuje SRTP (Secure Real-Time Transport Protocol) dla audio i wideo — zabezpieczoną wersję RTP z szyfrowaniem AES-128. Zarządzanie sesją odbywa się przez SCTP (Stream Control Transmission Protocol) przez DTLS. Każdy strumień danych jest obowiązkowo szyfrowany: w WebRTC nie ma niezabezpieczonego trybu.
Główną trudnością techniczną WebRTC jest nawiązanie połączenia P2P między urządzeniami znajdującymi się za NAT (Network Address Translation). Bez specjalnych mechanizmów urządzenia nie mogą bezpośrednio się do siebie zwrócić, ponieważ ich lokalne adresy IP nie są widoczne z Internetu.
STUN (Session Traversal Utilities for NAT) — serwer, który odpowiada na pytanie „jaki jest mój publiczny IP i port?”. Klient wysyła zapytanie do serwera STUN, serwer widzi jego publiczny adres i zwraca go klientowi. Google publicznie utrzymuje serwer STUN stun:stun.l.google.com:19302.
// WebRTC na iOS — konfiguracja serwerów 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) — serwer retransmisyjny dla przypadków, gdy STUN nie pomaga (symetryczny NAT lub firmowe firewalle). W tym trybie wszystkie dane przechodzą przez serwer TURN — zmniejsza to prędkość i zwiększa opóźnienie, ale gwarantuje połączenie w 99% przypadków.
TURN — najdroższy komponent infrastruktury WebRTC, ponieważ serwer przepuszcza przez siebie cały ruch medialny. Według Coturn Project (2025), typowy serwer TURN na 8 vCPU i 16 GB RAM obsługuje około 200 jednoczesnych połączeń audio lub 40 połączeń wideo w jakości HD.
ICE zbiera wszystkie możliwe kandydatury (lokalny IP, publiczny IP przez STUN, przekaźnikowy przez TURN) i próbuje nawiązać połączenie według priorytetu. Gdy tylko choć jedna para kandydatów (lokalny-zdalny) przejdzie test łączności connectivity check, połączenie uważa się za nawiązane.
Do rozwoju mobilnego Google utrzymuje libWebRTC — natywną bibliotekę dla Android (AAR) i iOS (XCFramework). Biblioteka zawiera cały stos protokołów, kodeki (VP8, VP9, H.264, AV1) oraz sprzętowe przyspieszenie kodowania/dekodowania.
Android SDK udostępnia klasy PeerConnectionFactory, PeerConnection, MediaStream. Aplikacja tworzy fabrykę, konfiguruje kodeki wideo, przechwytuje strumień z kamery przez VideoCapturer i nawiązuje połączenie peer-to-peer przez SDP offer/answer.
// Android WebRTC — inicjalizacja
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 wykorzystuje Objective-C API z wrapperami RTCPeerConnectionFactory, RTCCameraVideoCapturer, RTCVideoTrack. Sprzętowe kodowanie H.264 jest dostępne przez VideoToolbox. Do wyświetlania wideo używany jest RTCMTLVideoView (Metal) lub RTCVideoRenderer.
// iOS WebRTC — przechwytywanie wideo z kamery
let factory = RTCPeerConnectionFactory()
let capturer = RTCCameraVideoCapturer(delegate: factory)
// Wybór kamery (przód/tył)
guard let device = RTCCameraVideoCapturer
.captureDevices().first(where: {
$0.position == .front
}) else { return }
// Uruchomienie przechwytywania z maksymalnym FPS
capturer.startCapture(
with: device,
format: RTCCameraVideoCapturer
.supportedFormats(for: device).last!,
fps: 30
)
W przypadku połączeń wideo w produkcji aplikacje mobilne zwykle korzystają z nakładek SDK na libWebRTC: Twilio Video, Agora, Daily.co. SDK te upraszczają sygnalizację, zarządzanie pokojami i udostępniają gotowe komponenty UI do wyświetlania siatki wideo uczestników.
WebRTC nie specyfikuje protokołu sygnalizacji — wymiany wiadomości SDP (Session Description Protocol) między peerami. Deweloper sam wybiera transport do sygnalizacji: WebSocket, MQTT, SIP, XMPP lub REST API. Sygnalizacja dostarcza offer, answer i kandydatów ICE od jednego peera do drugiego.
Proces rozpoczyna się od utworzenia offer (inicjator opisuje swoje możliwości medialne), jest przekazywany przez sygnalizację do drugiego peera, który odpowiada answer. Po wymianie SDP każdy peer uruchamia ICE i rozpoczyna DTLS-SRTP do szyfrowania strumienia.
// Android — tworzenie i wysyłanie 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)
// Wysyłanie sdp.description do serwera sygnalizacji
sendSdpOffer(sdp.description)
}
}, constraints)
}
W aplikacjach mobilnych najpopularniejsza jest sygnalizacja przez WebSocket — dwukierunkowy kanał przez TCP, który utrzymuje stałe połączenie z serwerem. Serwer sygnalizacji to często osobny mikrousługa (Node.js, Golang, Elixir), który routuje wiadomości między uczestnikami pokoju.
Po zakończeniu ICE i DTLS-SRTP sygnalizacja nie uczestniczy już w przesyłaniu danych — cały ruch medialny odbywa się bezpośrednio P2P (lub przez przekaźnik TURN). Serwer sygnalizacji może być wyłączony bez przerywania aktywnych połączeń. To kluczowa zaleta zdecentralizowanej architektury WebRTC.
Często zadawane pytania
RTMP i HLS — protokoły serwerowe z opóźnieniem 3-10 sekund, gdzie wszystkie dane przechodzą przez serwer. WebRTC — peer-to-peer z opóźnieniem 200-500 ms. RTMP nadaje się do streamingu dla dużej publiczności, WebRTC — do interaktywnych połączeń i gier.
Nie, TURN jest potrzebny tylko w przypadkach, gdy P2P nie działa (symetryczny NAT, firmowe firewalle). Według statystyk Google około 15% połączeń wymaga TURN. Do produkcji zaleca się posiadanie serwera TURN jako fallback dla 100% niezawodności.
Obowiązkowe kodeki: VP8 (wszystkie platformy) i H.264 (ze sprzętowym przyspieszeniem na iOS/Android). Opcjonalnie: VP9 (lepsza kompresja, mniejszy bitrate) i AV1 (superwydajny, ale wymagający dla CPU). Audio: Opus (główny) i G.711 (PCMU/PCMA).
Tak, przez RTCDataChannel. Jest to w pełni funkcjonalny kanał do przesyłania dowolnych danych: tekst, pliki, komunikaty binarne. DataChannel działa przez SCTP z konfigurowalną niezawodnością (częściowo niezawodne dostarczanie dla gier, niezawodne dla plików).
Przez MediaRecorder API na kliencie lub przez SFU (Selective Forwarding Unit) — serwer, który otrzymuje wszystkie strumienie uczestników i może je nagrywać. Druga opcja jest bardziej niezawodna, ponieważ nagrywanie nie zależy od urządzenia uczestnika i nie przerywa się przy rozłączeniu.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.