WebRTC ist eine neue Front im langen Krieg für ein offenes und unbelastetes Web.
Brendan Eich, Erfinder von JavaScript
Kommunikation in Echtzeit ohne Plug-ins
Stellen Sie sich eine Welt vor, in der Smartphone, Fernseher und Computer über eine gemeinsame Plattform kommunizieren könnten. Stellen Sie sich vor, es wäre ganz einfach, Videochats und Peer-to-Peer-Datenfreigabe zu Ihrer Webanwendung hinzuzufügen. Das ist die Vision von WebRTC.
Möchten Sie es einmal ausprobieren? WebRTC ist auf Desktop-Computern und Mobilgeräten in Google Chrome, Safari, Firefox und Opera verfügbar. Ein guter Ausgangspunkt ist die einfache App für Videoanrufe unter appr.tc:
- Öffnen Sie appr.tc in Ihrem Browser.
- Klicken Sie auf Beitreten, um einem Chatroom beizutreten und der App Zugriff auf Ihre Webcam zu gewähren.
- Öffnen Sie die URL, die am Ende der Seite angezeigt wird, in einem neuen Tab oder, noch besser, auf einem anderen Computer.
Schnelleinstieg
Haben Sie keine Zeit, diesen Artikel zu lesen, oder möchten Sie nur Code schreiben?
- Einen Überblick über WebRTC erhalten Sie im folgenden Google I/O-Video oder auf diesen Folien:
- Wenn Sie die
getUserMedia
API nicht verwendet haben, lesen Sie Audio und Video in HTML5 aufnehmen und simpl.info getUserMedia. - Weitere Informationen zur
RTCPeerConnection
API finden Sie im folgenden Beispiel und in 'simpl.info RTCPeerConnection'. - Informationen dazu, wie WebRTC Server für die Signalisierung und Firewall und NAT Traversal verwendet, finden Sie in den Code- und Konsolenprotokollen von appr.tc.
- Sie möchten WebRTC sofort ausprobieren? Probieren Sie einige der mehr als 20 Demos aus, bei denen die WebRTC JavaScript APIs eingesetzt werden.
- Haben Sie Probleme mit Ihrem Computer und WebRTC? Rufe die WebRTC-Fehlerbehebung auf.
Alternativ können Sie direkt mit dem WebRTC-Codelab fortfahren. In dieser detaillierten Anleitung erfahren Sie, wie Sie eine vollständige Videochat-App einschließlich eines einfachen Signalisierungsservers erstellen.
Eine sehr kurze Geschichte von WebRTC
Eine der letzten großen Herausforderungen für das Web besteht darin, die menschliche Kommunikation über Sprach- und Video-Chats zu ermöglichen: Echtzeitkommunikation, kurz RTC. RTC sollte in einer Webanwendung genauso natürlich sein wie die Eingabe von Text in eine Texteingabe. Ohne dieses Tool sind Sie in Ihrer Fähigkeit eingeschränkt, Innovationen zu entwickeln und neue Interaktionsmöglichkeiten für Menschen zu entwickeln.
In der Vergangenheit war RTC ein Unternehmen und war komplex, sodass teure Audio- und Videotechnologien intern lizenziert oder entwickelt werden mussten. Die Integration der RTC-Technologie in vorhandene Inhalte, Daten und Dienste war schwierig und zeitaufwendig, insbesondere im Web.
Der Videochat in Gmail wurde 2008 beliebt und 2011 führte Google Hangouts ein, in dem Talk verwendet wird (wie auch Gmail). Google hat GIPS erworben, ein Unternehmen, das viele für RTC erforderliche Komponenten entwickelt hat, z. B. Codecs und Echounterdrückungstechniken. Google stellte die von GIPS entwickelten Technologien als Open Source zur Verfügung und arbeitete mit relevanten Normungsgremien der Internet Engineering Task Force (IETF) und des World Wide Web Consortium (W3C) zusammen, um einen branchenweiten Konsens sicherzustellen. Im Mai 2011 entwickelte Ericsson die erste Implementierung von WebRTC.
WebRTC implementierte offene Standards für die Echtzeit-Video-, Audio- und Datenkommunikation ohne Plug-ins. Die Notwendigkeit war echt:
- Viele Webdienste verwendeten RTC, benötigten jedoch Downloads, systemeigene Apps oder Plug-ins. Dazu gehörten Skype, Facebook und Hangouts.
- Das Herunterladen, Installieren und Aktualisieren von Plug-ins ist komplex, fehleranfällig und lästig.
- Plug-ins sind schwierig zu implementieren, zu debuggen, zu beheben, zu testen und zu verwalten. Außerdem müssen sie möglicherweise lizenziert und in komplexe, teure Technologien integriert werden. Es ist oft schwierig, Nutzer davon zu überzeugen, Plug-ins zu installieren.
Die Grundprinzipien des WebRTC-Projekts sind, dass seine APIs Open Source, kostenlos, standardisiert, in Webbrowser eingebunden und effizienter als bestehende Technologien sein sollten.
Wo sind wir jetzt?
WebRTC wird in verschiedenen Apps verwendet, z. B. in Google Meet. WebRTC wurde auch in die nativen Apps von WebKitGTK+ und Qt integriert.
WebRTC implementiert diese drei APIs:
– MediaStream
(auch bekannt als getUserMedia
)
– RTCPeerConnection
– RTCDataChannel
Die APIs werden in diesen beiden Spezifikationen definiert:
Alle drei APIs werden auf Mobilgeräten und Computern von Chrome, Safari, Firefox, Edge und Opera unterstützt.
getUserMedia
: Demos und Code finden Sie in den WebRTC-Beispielen oder in den faszinierenden Beispielen von Chris Wilson, in denen getUserMedia
als Eingabe für Webaudio verwendet wird.
RTCPeerConnection
: Eine einfache Demo und eine voll funktionsfähige Videochat-App finden Sie in den WebRTC-Beispielen für Peer-Verbindung bzw. appr.tc. Für diese App wird adapter.js verwendet, ein JavaScript-Shim, der von Google in Zusammenarbeit mit der WebRTC-Community verwaltet wird. So werden Browserunterschiede und Spezifikationsänderungen abstrahiert.
RTCDataChannel
: In den WebRTC-Beispielen und einer der Datenkanal-Demos können Sie dies in Aktion sehen.
Im WebRTC-Codelab erfahren Sie, wie Sie mit allen drei APIs eine einfache App für Videoanrufe und Dateifreigaben erstellen.
Ihr erster WebRTC-
WebRTC-Apps müssen mehrere Schritte ausführen:
- Audio-, Video- oder andere Streamingdaten abrufen
- Sie können Netzwerkinformationen wie IP-Adressen und Ports abrufen und mit anderen WebRTC-Clients (sogenannten Peers) austauschen, um Verbindungen zu ermöglichen, auch über NATs und Firewalls.
- Koordinieren Sie die Kommunikation, um Fehler zu melden und Sitzungen zu starten oder zu beenden.
- Informationen zu Medien- und Clientfunktionen wie Auflösung und Codecs austauschen.
- Kommunikation von Audio-, Video- oder Datenstreams
Zum Erfassen und Kommunizieren von Streamingdaten implementiert WebRTC die folgenden APIs:
MediaStream
erhält Zugriff auf Datenstreams, z. B. von der Kamera und dem Mikrofon des Nutzers.RTCPeerConnection
ermöglicht Audio- und Videoanrufe mit Verschlüsselungs- und Bandbreitenverwaltung.RTCDataChannel
ermöglicht die Peer-to-Peer-Kommunikation allgemeiner Daten.
(Die Netzwerk- und Signalisierungsaspekte von WebRTC werden später noch ausführlich besprochen.)
MediaStream
API (auch getUserMedia
API genannt)
Die MediaStream
API stellt synchronisierte Medienstreams dar. Ein Stream von der Kamera- und Mikrofoneingabe enthält beispielsweise synchronisierte Video- und Audiotracks. Verwechseln Sie MediaStreamTrack
nicht mit dem <track>
-Element, das ganz anders ist.
Vermutlich ist es am einfachsten, die MediaStream
API zu verstehen, wenn man sie in der Praxis sieht:
- Rufen Sie in Ihrem Browser WebRTC-Beispiele
getUserMedia
auf. - Öffnen Sie die Konsole.
- Prüfen Sie die globale Variable
stream
.
Jede MediaStream
hat eine Eingabe, die eine von getUserMedia()
generierte MediaStream
sein kann, und eine Ausgabe, die an ein Videoelement oder ein RTCPeerConnection
übergeben werden kann.
Die Methode getUserMedia()
verwendet einen MediaStreamConstraints
-Objektparameter und gibt ein Promise
zurück, das in ein MediaStream
-Objekt aufgelöst wird.
Jedes MediaStream
hat eine label
, z. B. 'Xk7EuLhsuHKbnjLWkW4yYGNJJ8ONsgwHBvLQ'
. Von den Methoden getAudioTracks()
und getVideoTracks()
wird ein Array mit MediaStreamTrack
-Werten zurückgegeben.
Für das Beispiel getUserMedia
gibt stream.getAudioTracks()
ein leeres Array zurück, da kein Audio vorhanden ist. Unter der Annahme, dass eine funktionierende Webcam verbunden ist, gibt stream.getVideoTracks()
ein Array von MediaStreamTrack
zurück, das den Stream von der Webcam darstellt. Jede MediaStreamTrack
hat eine Art ('video'
oder 'audio'
) und eine label
(etwa 'FaceTime HD Camera (Built-in)'
) und repräsentiert einen oder mehrere Kanäle von Audio oder Video. In diesem Fall gibt es nur einen Videotrack und keinen Ton. Es ist jedoch gut vorstellbar, dass es mehr gibt, wie z. B. eine Chat-App, die Streams von der Frontkamera, der Rückkamera, dem Mikrofon und einer App mit Bildschirmfreigabe erhält.
Ein MediaStream
kann durch Festlegen des Attributs srcObject
an ein Videoelement angehängt werden. Bisher wurde dafür das Attribut src
auf eine Objekt-URL festgelegt, die mit URL.createObjectURL()
erstellt wurde. Diese Funktion wurde jedoch eingestellt.
getUserMedia
kann auch als Eingabeknoten für die Web Audio API verwendet werden:
// Cope with browser differences.
let audioContext;
if (typeof AudioContext === 'function') {
audioContext = new AudioContext();
} else if (typeof webkitAudioContext === 'function') {
audioContext = new webkitAudioContext(); // eslint-disable-line new-cap
} else {
console.log('Sorry! Web Audio not supported.');
}
// Create a filter node.
var filterNode = audioContext.createBiquadFilter();
// See https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#BiquadFilterNode-section
filterNode.type = 'highpass';
// Cutoff frequency. For highpass, audio is attenuated below this frequency.
filterNode.frequency.value = 10000;
// Create a gain node to change audio volume.
var gainNode = audioContext.createGain();
// Default is 1 (no change). Less than 1 means audio is attenuated
// and vice versa.
gainNode.gain.value = 0.5;
navigator.mediaDevices.getUserMedia({audio: true}, (stream) => {
// Create an AudioNode from the stream.
const mediaStreamSource =
audioContext.createMediaStreamSource(stream);
mediaStreamSource.connect(filterNode);
filterNode.connect(gainNode);
// Connect the gain node to the destination. For example, play the sound.
gainNode.connect(audioContext.destination);
});
Chromium-basierte Apps und Erweiterungen können ebenfalls getUserMedia
enthalten. Wenn du dem Manifest die Berechtigungen audioCapture
und/oder videoCapture
hinzufügst, kann die Berechtigung bei der Installation nur einmal angefordert und gewährt werden. Der Nutzer wird dann nicht mehr um Zugriff auf Kamera oder Mikrofon gebeten.
Die Berechtigung muss für getUserMedia()
nur einmal gewährt werden. Zum ersten Mal wird in der Infoleiste des Browsers die Schaltfläche „Zulassen“ angezeigt. Der HTTP-Zugriff für getUserMedia()
wurde Ende 2015 von Chrome eingestellt, da er als Leistungsstarke Funktion eingestuft wurde.
Damit ist geplant, eine MediaStream
für jede Streamingdatenquelle zu aktivieren, nicht nur für eine Kamera oder ein Mikrofon. Dies ermöglicht das Streaming von gespeicherten Daten oder beliebigen Datenquellen wie Sensoren oder anderen Eingängen.
getUserMedia()
wird durch die Kombination mit anderen JavaScript APIs und Bibliotheken zum Leben erweckt:
- Webcam Toy ist eine Fotobox-App, die mithilfe von WebGL skurrile und wunderbare Effekte auf Fotos hinzufügt, die dann geteilt oder lokal gespeichert werden können.
- FaceKat ist ein mit headtrackr.js entwickeltes Gesichtserkennungsspiel.
- Die ASCII-Kamera generiert ASCII-Bilder mithilfe der Canvas API.
Einschränkungen
Mit Einschränkungen können Werte für die Videoauflösung für getUserMedia()
festgelegt werden. Es werden auch andere Einschränkungen unterstützt, z. B. das Seitenverhältnis. Front- oder Rückkamera Framerate, Höhe und Breite, und eine applyConstraints()
-Methode.
Ein Beispiel findest du unter WebRTC-BeispielegetUserMedia
: Auflösung auswählen.
Wenn du einen unzulässigen Einschränkungswert festlegst, wird ein DOMException
oder ein OverconstrainedError
ausgegeben, wenn beispielsweise eine angeforderte Auflösung nicht verfügbar ist. Eine Demo findest du unter WebRTC-Beispiele getUserMedia
: Auflösung auswählen.
Bildschirm- und Tabaufnahme
In Chrome-Apps ist es auch möglich, ein Live-Video eines einzelnen Browsertabs oder des gesamten Desktops über chrome.tabCapture
und chrome.desktopCapture
APIs zu teilen. Eine Demo und weitere Informationen finden Sie unter Bildschirmfreigabe mit WebRTC. Der Artikel ist schon ein paar Jahre alt, aber trotzdem interessant.)
Es ist auch möglich, Bildschirmaufnahmen mithilfe der experimentellen Einschränkung chromeMediaSource
in Chrome als MediaStream
-Quelle zu verwenden. Hinweis: Für die Bildschirmaufnahme ist HTTPS erforderlich und sie sollte nur für die Entwicklung verwendet werden, da sie wie in diesem Beitrag erläutert über ein Befehlszeilen-Flag aktiviert wird.
Signalisierung: Sitzungssteuerung, Netzwerk- und Medieninformationen
WebRTC verwendet RTCPeerConnection
, um Streamingdaten zwischen Browsern (auch bekannt als Peers) zu kommunizieren, benötigt aber auch einen Mechanismus zur Koordination der Kommunikation und zum Senden von Kontrollnachrichten. Dieser Prozess wird als Signalisierung bezeichnet. Signalisierungsmethoden und -protokolle werden nicht durch WebRTC angegeben. Die Signalverarbeitung ist nicht Teil der RTCPeerConnection
API.
Stattdessen können WebRTC-App-Entwickler ein beliebiges Messaging-Protokoll wie SIP oder XMPP und einen beliebigen geeigneten Duplex-Kommunikationskanal (Zwei-Wege-Kommunikation) auswählen. Im Beispiel appr.tc werden XHR und die Channel API als Signalisierungsmechanismus verwendet. Im Codelab wird Socket.io auf einem Knotenserver ausgeführt.
Mithilfe von Signalen werden drei Arten von Informationen ausgetauscht:
- Sitzungssteuerungsmeldungen: zum Initialisieren oder Beenden der Kommunikation und zum Melden von Fehlern
- Netzwerkkonfiguration: Wie lauten die IP-Adresse und der Port Ihres Computers außerhalb der Welt?
- Medienfunktionen: Welche Codecs und Auflösungen können von deinem Browser und dem Browser verarbeitet werden, mit dem er kommunizieren möchte?
Der Austausch von Informationen über Signalisierung muss erfolgreich abgeschlossen sein, bevor das Peer-to-Peer-Streaming beginnen kann.
Stellen Sie sich zum Beispiel vor, Alice möchte mit Bob kommunizieren. Hier ist ein Codebeispiel aus der W3C WebRTC-Spezifikation, das den Signalisierungsprozess in Aktion zeigt. Bei dem Code wird davon ausgegangen, dass ein Signalisierungsmechanismus vorhanden ist, der in der Methode createSignalingChannel()
erstellt wurde. Beachten Sie außerdem, dass in Chrome und Opera derzeit RTCPeerConnection
vorangestellt wird.
// handles JSON.stringify/parse
const signaling = new SignalingChannel();
const constraints = {audio: true, video: true};
const configuration = {iceServers: [{urls: 'stun:stun.example.org'}]};
const pc = new RTCPeerConnection(configuration);
// Send any ice candidates to the other peer.
pc.onicecandidate = ({candidate}) => signaling.send({candidate});
// Let the "negotiationneeded" event trigger offer generation.
pc.onnegotiationneeded = async () => {
try {
await pc.setLocalDescription(await pc.createOffer());
// Send the offer to the other peer.
signaling.send({desc: pc.localDescription});
} catch (err) {
console.error(err);
}
};
// Once remote track media arrives, show it in remote video element.
pc.ontrack = (event) => {
// Don't set srcObject again if it is already set.
if (remoteView.srcObject) return;
remoteView.srcObject = event.streams[0];
};
// Call start() to initiate.
async function start() {
try {
// Get local stream, show it in self-view, and add it to be sent.
const stream =
await navigator.mediaDevices.getUserMedia(constraints);
stream.getTracks().forEach((track) =>
pc.addTrack(track, stream));
selfView.srcObject = stream;
} catch (err) {
console.error(err);
}
}
signaling.onmessage = async ({desc, candidate}) => {
try {
if (desc) {
// If you get an offer, you need to reply with an answer.
if (desc.type === 'offer') {
await pc.setRemoteDescription(desc);
const stream =
await navigator.mediaDevices.getUserMedia(constraints);
stream.getTracks().forEach((track) =>
pc.addTrack(track, stream));
await pc.setLocalDescription(await pc.createAnswer());
signaling.send({desc: pc.localDescription});
} else if (desc.type === 'answer') {
await pc.setRemoteDescription(desc);
} else {
console.log('Unsupported SDP type.');
}
} else if (candidate) {
await pc.addIceCandidate(candidate);
}
} catch (err) {
console.error(err);
}
};
Zuerst tauschen Alice und Bob Netzwerkinformationen aus. (Der Ausdruck Kandidaten finden bezieht sich auf den Vorgang, Netzwerkschnittstellen und Ports mit dem ICE-Framework zu finden.)
- Alice erstellt ein
RTCPeerConnection
-Objekt mit einemonicecandidate
-Handler, der ausgeführt wird, wenn Netzwerkkandidaten verfügbar sind. - Alice sendet serialisierte Kandidatendaten über den von ihr verwendeten Signalisierungskanal, z. B. WebSocket oder einen anderen Mechanismus, an Bob.
- Wenn Bob eine Kandidatennachricht von Alice erhält, ruft er
addIceCandidate
auf, um den Kandidaten der Beschreibung des Remote-Peers hinzuzufügen.
WebRTC-Clients (in diesem Beispiel auch als Peers oder Alice und Bob bezeichnet) müssen auch lokale und Remote-Audio- und Videomedieninformationen wie Auflösung und Codec-Funktionen ermitteln und austauschen. Das Signal zum Austausch von Konfigurationsinformationen für Medien erfolgt, indem mithilfe des Session Description Protocol (SDP) ein Angebot und eine Antwort ausgetauscht werden:
- Alice führt die
RTCPeerConnection
-MethodecreateOffer()
aus. Der Rückgabe wird eineRTCSessionDescription
übergeben: die Beschreibung der lokalen Sitzung von Anja. - Im Callback legt Alice die lokale Beschreibung mit
setLocalDescription()
fest und sendet diese Sitzungsbeschreibung dann über den Signalisierungskanal an Bob.RTCPeerConnection
beginnt erst mit dem Erfassen von Kandidaten, wennsetLocalDescription()
aufgerufen wird. Dies ist im IETF-Entwurf des JSEP kodifiziert. - Max legt die Beschreibung, die Alice gesendet hat, mit
setRemoteDescription()
als Remote-Beschreibung fest. - Bob führt die
RTCPeerConnection
createAnswer()
-Methode aus und übergibt ihr die Remote-Beschreibung, die er von Alice erhalten hat. So kann eine lokale Sitzung generiert werden, die mit ihrer kompatibel ist. DemcreateAnswer()
-Callback wird einRTCSessionDescription
übergeben. Bob legt dies als lokale Beschreibung fest und sendet sie an Alice. - Wenn Alice Roberts Sitzungsbeschreibung erhält, legt sie diese als Remote-Beschreibung mit
setRemoteDescription
fest. - Ping!
RTCSessionDescription
-Objekte sind Blobs, die dem Session Description Protocol (SDP) entsprechen. Serialisiert sieht ein SDP-Objekt wie folgt aus:
v=0
o=- 3883943731 1 IN IP4 127.0.0.1
s=
t=0 0
a=group:BUNDLE audio video
m=audio 1 RTP/SAVPF 103 104 0 8 106 105 13 126
// ...
a=ssrc:2223794119 label:H4fjnMzxy3dPIgQ7HxuCTLb4wLLLeRHnFxh810
Die Erfassung und der Austausch von Netzwerk- und Medieninformationen kann gleichzeitig erfolgen, aber beide Prozesse müssen abgeschlossen sein, bevor das Audio- und Videostreaming zwischen den Peers beginnen kann.
Die zuvor beschriebene Angebots-/Antwort-Architektur wird als JavaScript Session Setting Protocol (JSEP) bezeichnet. (Im Demovideo von Ericsson zur ersten WebRTC-Implementierung finden Sie eine hervorragende Animation, in der der Prozess der Signalisierung und des Streamings erklärt wird.)
<ph type="x-smartling-placeholder">Sobald der Signalisierungsprozess erfolgreich abgeschlossen ist, können die Daten direkt Peer-to-Peer-Verbindungen zwischen dem Aufrufer und dem Aufgerufenen oder, falls dies fehlschlägt, über einen zwischengeschalteten Relay-Server gestreamt werden (mehr dazu später). Streaming ist Aufgabe von RTCPeerConnection
.
RTCPeerConnection
RTCPeerConnection
ist die WebRTC-Komponente für eine stabile und effiziente Kommunikation von Streamingdaten zwischen Peers.
Das folgende WebRTC-Architekturdiagramm zeigt die Rolle von RTCPeerConnection
. Wie Sie sehen werden, sind die grünen Bereiche komplex!
Aus JavaScript-Perspektive geht es in diesem Diagramm vor allem darum, dass RTCPeerConnection
Webentwickler vor den unzähligen Komplexitäten schützt, die dahinter lauern. Die von WebRTC verwendeten Codecs und Protokolle leisten einen erheblichen Beitrag zur Echtzeitkommunikation selbst über unzuverlässige Netzwerke:
- Verbergen von Paketverlusten
- Echounterdrückung
- Bandbreitenanpassung
- Dynamischer Jitter-Zwischenspeicher
- Automatische Verstärkungsregelung
- Rauschunterdrückung und ‐unterdrückung
- Bildbereinigung
Der vorherige W3C-Code zeigt ein vereinfachtes Beispiel für WebRTC aus Signalisierungsperspektive. Im Folgenden finden Sie Anleitungen für zwei funktionierende WebRTC-Apps. Das erste ist ein einfaches Beispiel, um RTCPeerConnection
zu demonstrieren, und das zweite ist ein voll funktionsfähiger Videochat-Client.
RTCPeerConnection ohne Server
Der folgende Code stammt aus WebRTC-Beispielen für die Peer-Verbindung, die eine lokale und Remote-RTCPeerConnection
sowie ein lokales und Remote-Video auf einer Webseite enthält. Dies ist nicht besonders nützlich – Aufrufer und Aufgerufener befinden sich auf derselben Seite, macht aber die Funktionsweise der RTCPeerConnection
API ein wenig deutlicher, da die RTCPeerConnection
-Objekte auf der Seite Daten und Nachrichten direkt austauschen können, ohne zwischengeschaltete Signalisierungsmechanismen zu verwenden.
In diesem Beispiel steht pc1
für den lokalen Peer (Aufrufer) und pc2
für den Remote-Peer (Aufgerufene).
Anrufer
- Erstellen Sie einen neuen
RTCPeerConnection
und fügen Sie den Stream ausgetUserMedia()
hinzu: ```js // „Servers“ ist eine optionale Konfigurationsdatei. (Weitere Informationen finden Sie weiter unten im Abschnitt über TURN und STUN.) pc1 = new RTCPeerConnection(servers); // ... localStream.getTracks().forEach((track) => { pc1.addTrack(track, localStream); });
- Erstelle ein Angebot und lege es als lokale Beschreibung für
pc1
und als Remote-Beschreibung fürpc2
fest. Dies kann direkt im Code und ohne Verwendung von Signalen erfolgen, da sich Anrufer und Aufgerufener auf derselben Seite befinden:js pc1.setLocalDescription(desc).then(() => { onSetLocalSuccess(pc1); }, onSetSessionDescriptionError ); trace('pc2 setRemoteDescription start'); pc2.setRemoteDescription(desc).then(() => { onSetRemoteSuccess(pc2); }, onSetSessionDescriptionError );
Aufgerufener
- Erstellen Sie
pc2
. Wenn der Stream auspc1
hinzugefügt wird, zeigen Sie ihn in einem Videoelement an:js pc2 = new RTCPeerConnection(servers); pc2.ontrack = gotRemoteStream; //... function gotRemoteStream(e){ vid2.srcObject = e.stream; }
RTCPeerConnection
API plus Server
In der realen Welt benötigt WebRTC Server ganz einfach, sodass Folgendes passieren kann:
- Nutzer entdecken einander und tauschen Informationen aus der realen Welt aus, z. B. Namen.
- WebRTC-Client-Apps (Peers) tauschen Netzwerkinformationen aus.
- Die Kollegen tauschen Mediendaten wie Videoformat und -auflösung aus.
- WebRTC-Clientanwendungen durchqueren NAT-Gateways und Firewalls.
Mit anderen Worten, WebRTC benötigt vier Arten von serverseitigen Funktionen:
- Nutzererkennung und -kommunikation
- Signalisierung
- NAT/Firewalldurchlauf
- Relay-Server für den Fall, dass die Peer-to-Peer-Kommunikation fehlschlägt
NAT Traversal, Peer-to-Peer-Netzwerke und die Anforderungen zum Erstellen einer Server-App für die Nutzererkennung und Signalisierung werden in diesem Artikel nicht behandelt. Das STUN-Protokoll und seine Erweiterung TURN werden vom ICE-Framework verwendet, damit RTCPeerConnection
mit NAT Traversal und anderen Netzwerkabweichungen umgehen kann.
ICE ist ein Framework zum Vernetzen von Peers, z. B. zwei Videochat-Clients. Zunächst versucht ICE, Peers mit der geringstmöglichen Latenz direkt über UDP zu verbinden. Dabei haben STUN-Server eine einzige Aufgabe: einen Peer hinter einer NAT zu ermöglichen, um dessen öffentliche Adresse und seinen Port herauszufinden. Weitere Informationen zu STUN und TURN finden Sie unter Back-End-Dienste erstellen, die für eine WebRTC-App benötigt werden.
<ph type="x-smartling-placeholder">Wenn UDP fehlschlägt, versucht ICE, TCP zu verwenden. Wenn die direkte Verbindung fehlschlägt, insbesondere aufgrund von NAT-Traversal für Unternehmen und Firewalls, verwendet ICE einen zwischengeschalteten (Relay-)Turn-Server. Mit anderen Worten: ICE verwendet zuerst STUN mit UDP, um eine direkte Verbindung zu Peers herzustellen. Wenn dies fehlschlägt, greift ICE auf einen Turn-Relay-Server zurück. Der Ausdruck Kandidaten finden bezieht sich auf die Suche nach Netzwerkschnittstellen und Ports.
<ph type="x-smartling-placeholder">WebRTC-Entwickler Justin Uberti stellt in der Google I/O WebRTC-Präsentation 2013 weitere Informationen zu ICE, STUN und TURN zur Verfügung. Auf den Folien der Präsentation finden Sie Beispiele für die Implementierung der Server von TURN und STUN.
Ein einfacher Video-Chat-Client
Die Videochat-Demo unter appr.tc bietet sich an, wenn Sie WebRTC testen möchten – inklusive Signalisierung und NAT/Firewall-Durchlauf mit einem STUN-Server. Diese App verwendet adapter.js, einen Shim, um Apps von Spezifikationsänderungen und Unterschieden bei Präfixen zu isolieren.
Der Code für die Protokollierung ist absichtlich ausführlich. Sehen Sie sich die Konsole an, um sich ein Bild von der Reihenfolge der Ereignisse zu machen. Im Folgenden finden Sie eine detaillierte Anleitung für den Code.
Netzwerktopologien
WebRTC, wie derzeit implementiert, unterstützt nur die 1:1-Kommunikation, kann jedoch in komplexeren Netzwerkszenarien verwendet werden, z. B. bei mehreren Peers, die direkt miteinander oder über eine Multipoint Control Unit (MCU) kommunizieren, ein Server, der eine große Anzahl von Teilnehmern verarbeiten kann und selektive Streamweiterleitung sowie das Mischen oder Aufzeichnen von Audio und Video unterstützt.
<ph type="x-smartling-placeholder">Viele bestehende WebRTC-Anwendungen zeigen nur die Kommunikation zwischen Webbrowsern, aber Gatewayserver können eine WebRTC-App, die in einem Browser ausgeführt wird, für die Interaktion mit Geräten wie Telefonen (PSTN) und mit VOIP-Systemen aktivieren. Im Mai 2012 stellte Doubango Telecom als Open Source den sipml5 SIP-Client mit WebRTC und WebSocket zur Verfügung. Dieser Client ermöglicht unter anderem Videoanrufe zwischen Browsern und Apps unter iOS und Android. Bei der Google I/O zeigten Tethr und Tropo ein Framework für die Katastrophenkommunikation in einem Aktenkoffer mithilfe einer OpenBTS-Zelle, um die Kommunikation zwischen Feature-Phones und Computern über WebRTC zu ermöglichen. Telefonische Kommunikation ohne Mobilfunkanbieter.
<ph type="x-smartling-placeholder">RTCDataChannel
API
Neben Audio und Video unterstützt WebRTC die Echtzeitkommunikation für andere Datentypen.
Die RTCDataChannel
API ermöglicht den Peer-to-Peer-Austausch beliebiger Daten mit niedriger Latenz und hohem Durchsatz. Demos mit nur einer Seite und Informationen zum Erstellen einer einfachen App zur Dateiübertragung finden Sie in den WebRTC-Beispielen bzw. im WebRTC-Codelab.
Für die API gibt es viele potenzielle Anwendungsfälle, darunter:
- Gaming
- Remote Desktop Apps
- Echtzeit-Textchat
- Dateiübertragung
- Dezentrale Netzwerke
Die API bietet verschiedene Funktionen, um RTCPeerConnection
optimal zu nutzen und eine leistungsstarke und flexible Peer-to-Peer-Kommunikation zu ermöglichen:
- Einrichtung der
RTCPeerConnection
-Sitzung wird genutzt - Mehrere gleichzeitige Kanäle mit Priorisierung
- Zuverlässige und unzuverlässige Auslieferungssemantik
- Integrierte Sicherheit (DTLS) und Überlastungssteuerung
- Verwendung mit oder ohne Audio oder Video
Die Syntax ähnelt absichtlich der WebSocket-Methode mit einer send()
-Methode und einem message
-Ereignis:
const localConnection = new RTCPeerConnection(servers);
const remoteConnection = new RTCPeerConnection(servers);
const sendChannel =
localConnection.createDataChannel('sendDataChannel');
// ...
remoteConnection.ondatachannel = (event) => {
receiveChannel = event.channel;
receiveChannel.onmessage = onReceiveMessage;
receiveChannel.onopen = onReceiveChannelStateChange;
receiveChannel.onclose = onReceiveChannelStateChange;
};
function onReceiveMessage(event) {
document.querySelector("textarea#send").value = event.data;
}
document.querySelector("button#send").onclick = () => {
var data = document.querySelector("textarea#send").value;
sendChannel.send(data);
};
Die Kommunikation findet direkt zwischen den Browsern statt. Daher kann RTCDataChannel
viel schneller als WebSocket sein, selbst wenn ein Relay-Server (Turn-Server) erforderlich ist, wenn ein Hole-Punching zur Bewältigung von Firewalls und NATs erforderlich ist.
RTCDataChannel
ist für Chrome, Safari, Firefox, Opera und Samsung Internet verfügbar. Beim Cube Slam-Spiel wird die API verwendet, um den Spielstatus zu kommunizieren. Spiele einen Freund oder den Bären! Die innovative Plattform Sharefest ermöglichte das Teilen von Dateien über RTCDataChannel
und peerCDN boten einen Einblick, wie WebRTC eine Peer-to-Peer-Inhaltsverbreitung ermöglichen könnte.
Weitere Informationen zu RTCDataChannel
findest du in der Entwurfsprotokollspezifikation der IETF.
Sicherheit
Es gibt mehrere Möglichkeiten, wie Anwendungen oder Plug-ins für Echtzeitkommunikation die Sicherheit gefährden können. Beispiel:
- Unverschlüsselte Medien oder Daten können zwischen Browsern oder zwischen einem Browser und einem Server abgefangen werden.
- Eine App kann Video- oder Audioinhalte aufzeichnen und verbreiten, ohne dass der Nutzer davon weiß.
- Malware oder Viren können zusammen mit einem scheinbar harmlosen Plug-in oder einer scheinbar harmlosen App installiert werden.
WebRTC bietet mehrere Funktionen, um diese Probleme zu vermeiden:
- WebRTC-Implementierungen verwenden sichere Protokolle wie DTLS und SRTP.
- Die Verschlüsselung ist für alle WebRTC-Komponenten obligatorisch, einschließlich Signalisierungsmechanismen.
- WebRTC ist kein Plug-in. Die Komponenten werden in der Browser-Sandbox und nicht in einem separaten Prozess ausgeführt. Komponenten erfordern keine separate Installation und werden bei jeder Browseraktualisierung aktualisiert.
- Der Zugriff auf die Kamera und das Mikrofon muss explizit gewährt werden. Wenn die Kamera oder das Mikrofon eingeschaltet ist, ist dies in der Benutzeroberfläche deutlich erkennbar.
Eine umfassende Erörterung der Sicherheit bei Streaming Media ist in diesem Artikel nicht enthalten. Weitere Informationen finden Sie unter Vorgeschlagene WebRTC-Sicherheitsarchitektur, die von der IETF vorgeschlagen wurde.
Fazit
Mit den APIs und Standards von WebRTC lassen sich Tools für die Erstellung und Kommunikation von Inhalten allgemein zugänglich machen und dezentralisieren. Dazu gehören Telefonie, Gaming, Videoproduktion, Musikproduktion und Nachrichtensammlungen.
Technologie ist nicht viel störender als das.
Der Blogger Phil Edholm formulierte es so: „Potenziell könnten WebRTC und HTML5 die gleiche Transformation für die Echtzeitkommunikation ermöglichen wie der ursprüngliche Browser für Informationen.“
Entwicklertools
- WebRTC-Statistiken für eine laufende Sitzung finden Sie unter:
<ph type="x-smartling-placeholder">
- </ph>
- „about://webrtc-internals“ in Chrome
- Opera://webrtc-internals in Opera
- „about:webrtc“ in Firefox <ph type="x-smartling-placeholder">
- Browserübergreifende Interoperabilitätshinweise
- adapter.js ist ein JavaScript-Shim für WebRTC, das von Google mithilfe der WebRTC-Community verwaltet wird und Anbieterpräfixe, Browserunterschiede und Spezifikationsänderungen abstrahiert.
- Weitere Informationen zu WebRTC-Signalisierungsprozessen finden Sie in der appr.tc-Protokollausgabe in der Konsole.
- Wenn Ihnen das alles zu viel erscheint, sollten Sie lieber ein WebRTC-Framework oder sogar einen vollständigen WebRTC-Dienst verwenden.
- Fehlerberichte und Funktionsanfragen sind jederzeit willkommen: <ph type="x-smartling-placeholder">
Weitere Informationen
- Justin Ubertis WebRTC-Sitzung bei der Google I/O 2012
- Alex B. Johnston und Daniel C. Burnett bietet in seiner dritten Ausgabe ein WebRTC-Buch im Print- und E-Book-Format auf webrtcbook.com.
- Auf webrtc.org finden Sie alles, was WebRTC gehört, einschließlich Demos, Dokumentationen und Diskussionen.
- discuss-webrtc ist eine Google-Gruppe für technische WebRTC-Diskussionen.
- @webrtc
- In der Google Talk-Dokumentation für Entwickler finden Sie weitere Informationen zu NAT Traversal, STUN, Relay-Servern und Kandidatensammlungen.
- WebRTC auf GitHub
- Auf Stack Overflow können Sie nach Antworten suchen und Fragen zu WebRTC stellen.
Standards und Protokolle
- Entwurf des WebRTC W3C-Editors
- W3C-Entwurf der Redaktion: Medienerfassung und Streams (auch bekannt als
getUserMedia
) - Satzung der IETF-Arbeitsgruppe
- Entwurf für das IETF WebRTC Data Channel Protocol
- IETF-JSEP-Entwurf
- IETF-Standardvorschlag für ICE
- IETF RTCWEB Working Group Internetentwurf: Web Real-Time Communication Use-Fälle und Anforderungen
Zusammenfassung der WebRTC-Unterstützung
MediaStream
und getUserMedia
API
- Chrome Desktop 18.0.1008 und höher; Chrome für Android 29 und höher
- Opera 18 und höher Opera für Android 20 und höher
- Opera 12, Opera Mobile 12 (basierend auf der Presto-Engine)
- Firefox 17 und höher
- Microsoft Edge 16 und höher
- Safari 11.2 und höher unter iOS bzw. 11.1 und höher unter MacOS
- UC 11.8 und höher unter Android
- Samsung Internet 4 und höher
RTCPeerConnection
API
- Chrome Desktop 20 und höher; Chrome für Android 29 und höher (ohne Flaggen)
- Opera 18 und höher (standardmäßig aktiviert): Opera für Android 20 und höher (standardmäßig aktiviert)
- Firefox 22 und höher (standardmäßig aktiviert)
- Microsoft Edge 16 und höher
- Safari 11.2 und höher unter iOS bzw. 11.1 und höher unter MacOS
- Samsung Internet 4 und höher
RTCDataChannel
API
- Experimentelle Version in Chrome 25, aber stabiler (und mit Firefox-Interoperabilität) in Chrome 26 und höher Chrome für Android 29 und höher
- Stabile Version (und mit Firefox-Interoperabilität) in Opera 18 und höher Opera für Android 20 und höher
- Firefox 22 und höher (standardmäßig aktiviert)
Weitere Informationen zur plattformübergreifenden Unterstützung von APIs wie getUserMedia
und RTCPeerConnection
finden Sie unter caniuse.com und Chrome-Plattformstatus.
Native APIs für RTCPeerConnection
sind auch in der Dokumentation auf webrtc.org verfügbar.