Premiers pas avec WebRTC

WebRTC est un nouveau front dans la longue guerre pour un Web ouvert et sans encombrement.

Brendan Eich, inventeur de JavaScript

Imaginez un monde dans lequel votre téléphone, votre télévision et votre ordinateur pourraient communiquer sur une plate-forme commune. Imaginez qu'il soit facile d'ajouter le chat vidéo et le partage de données peer-to-peer à votre application Web. C'est la vision de WebRTC.

Pour essayer, WebRTC est disponible sur ordinateur et mobile dans Google Chrome, Safari, Firefox et Opera. Vous pouvez commencer par utiliser l'application de chat vidéo simple sur appr.tc:

  1. Ouvrez appr.tc dans votre navigateur.
  2. Cliquez sur Rejoindre pour rejoindre un salon de chat et permettre à l'application d'utiliser votre webcam.
  3. Ouvrez l'URL affichée au bas de la page dans un nouvel onglet ou, mieux encore, sur un autre ordinateur.

Démarrage rapide

Vous n'avez pas le temps de lire cet article ou vous souhaitez simplement lire du code ?

  • Pour en savoir plus sur WebRTC, regardez la vidéo Google I/O suivante ou consultez ces diapositives:
  • Si vous n'avez pas utilisé l'API getUserMedia, consultez les sections Capture audio and video in HTML5 et simpl.info getUserMedia.
  • Pour en savoir plus sur l'API RTCPeerConnection, consultez l'exemple suivant et 'simpl.info RTCPeerConnection'.
  • Pour savoir comment WebRTC utilise les serveurs pour la signalisation, ainsi que le pare-feu et le NAT-travers, consultez le code et les journaux de la console du fichier appr.tc.
  • Vous ne pouvez pas attendre et vous voulez simplement essayer WebRTC tout de suite ? Essayez quelques-unes des plus de 20 démonstrations concernant les API JavaScript WebRTC.
  • Vous rencontrez des problèmes avec votre ordinateur et WebRTC ? Accédez à l'outil de dépannage WebRTC.

Vous pouvez également accéder directement à l'atelier de programmation WebRTC, un guide par étapes qui explique comment créer une application de chat vidéo complète, incluant un simple serveur de signalement.

Historique très court de WebRTC

L'un des derniers défis majeurs du Web est de permettre la communication vocale et vidéo grâce à la communication en temps réel (RTC, en abrégé). La fonctionnalité RTC doit être aussi naturelle dans une application Web que la saisie de texte. Sans cela, votre capacité à innover et à développer de nouvelles façons d'interagir est limitée.

Par le passé, la RTC était une entreprise complexe et complexe, nécessitant des technologies audio et vidéo coûteuses à concéder sous licence ou à être développées en interne. L'intégration de la technologie RTC aux contenus, données et services existants s'est avérée difficile et chronophage, en particulier sur le Web.

Le chat vidéo dans Gmail est devenu populaire en 2008 et, en 2011, Google a lancé Hangouts, qui utilise Talk (tout comme Gmail). Google a racheté GIPS, une entreprise qui développait de nombreux composants requis pour la fonctionnalité RTC, tels que les codecs et les techniques d'annulation de l'écho. Google a partagé en Open Source les technologies développées par GIPS et a collaboré avec les organismes de normalisation compétents de l'Internet Engineering Task Force (IETF) et du World Wide Web Consortium (W3C) afin d'établir un consensus dans le secteur. En mai 2011, Ericsson a créé la première mise en œuvre de WebRTC.

WebRTC a implémenté des normes ouvertes pour la communication de données, audio et vidéo en temps réel sans plug-in. Le besoin était réel:

  • De nombreux services Web utilisaient la fonctionnalité RTC, mais nécessitaient des téléchargements, des applications natives ou des plug-ins. Il s'agissait notamment de Skype, Facebook et Hangouts.
  • Le téléchargement, l'installation et la mise à jour de plug-ins sont complexes, sources d'erreurs et agaçants.
  • Les plug-ins sont difficiles à déployer, déboguer, dépanner, tester et gérer. Ils peuvent nécessiter des licences et être intégrés à des technologies complexes et coûteuses. Il est souvent difficile de persuader d'abord les utilisateurs d'installer des plug-ins !

Les principes directeurs du projet WebRTC sont que ses API doivent être Open Source, sans frais, standardisées, intégrées aux navigateurs Web et plus efficaces que les technologies existantes.

Où en sommes-nous maintenant ?

WebRTC est utilisé dans diverses applications, telles que Google Meet. WebRTC a également été intégré aux applications natives WebKitGTK+ et Qt.

WebRTC implémente ces trois API: - MediaStream (également appelé getUserMedia) – RTCPeerConnectionRTCDataChannel

Les API sont définies dans les deux spécifications suivantes:

Ces trois API sont compatibles avec Chrome, Safari, Firefox, Edge et Opera sur les appareils mobiles et les ordinateurs.

getUserMedia: pour obtenir des démonstrations et du code, consultez les exemples WebRTC ou essayez les exemples étonnants de Chris Wilson qui utilisent getUserMedia comme entrée pour le contenu audio Web.

RTCPeerConnection : pour obtenir une démonstration simple et une application de chat vidéo entièrement fonctionnelle, consultez respectivement Exemples de test WebRTC : Connexion au pair et appr.tc. Cette application utilise adapter.js, un shim JavaScript géré par Google avec l'aide de la communauté WebRTC, pour éliminer les différences entre les navigateurs et les modifications des spécifications.

RTCDataChannel: pour voir comment cela fonctionne, consultez les exemples WebRTC afin de visionner l'une des démonstrations de canaux de données.

L'atelier de programmation WebRTC vous montre comment utiliser les trois API pour créer une application simple de chat vidéo et de partage de fichiers.

Votre premier WebRTC

Les applications WebRTC doivent effectuer plusieurs opérations:

  • Profitez de contenus audio, vidéo ou d'autres contenus en streaming.
  • Obtenez des informations réseau, telles que les adresses IP et les ports, et échangez-les avec d'autres clients WebRTC (appelés pairs) pour permettre la connexion, même via des NAT et des pare-feu.
  • Coordonnez la communication de signalement pour signaler les erreurs et lancer ou fermer des sessions.
  • Échangez des informations sur les fonctionnalités multimédias et client, telles que la résolution et les codecs.
  • Communiquer des données audio, vidéo ou de données en streaming

Pour acquérir et communiquer des flux de données, WebRTC implémente les API suivantes:

  • MediaStream a accès aux flux de données, comme ceux provenant de la caméra et du micro de l'utilisateur.
  • RTCPeerConnection permet de passer des appels audio ou vidéo avec des fonctionnalités de chiffrement et de gestion de la bande passante.
  • RTCDataChannel permet la communication peer-to-peer de données génériques.

(Une discussion détaillée sur le réseau et les aspects de WebRTC seront détaillés plus tard.)

API MediaStream (également appelée API getUserMedia)

L'API MediaStream représente les flux multimédias synchronisés. Par exemple, un flux issu de l'entrée d'une caméra et d'un micro comporte des pistes audio et vidéo synchronisées. (Ne confondez pas MediaStreamTrack avec l'élément <track>, qui est entièrement différent.)

Le moyen le plus simple de comprendre l'API MediaStream est sans doute de l'examiner telle quelle:

  1. Dans votre navigateur, accédez à Exemples de code WebRTC getUserMedia.
  2. Ouvrez la console.
  3. Inspectez la variable stream, qui se trouve dans le champ d'application global.

Chaque MediaStream comporte une entrée, qui peut être une MediaStream générée par getUserMedia(), et une sortie, qui peut être transmise à un élément vidéo ou à un élément RTCPeerConnection.

La méthode getUserMedia() utilise un paramètre d'objet MediaStreamConstraints et renvoie un Promise qui renvoie vers un objet MediaStream.

Chaque MediaStream possède un label, tel que 'Xk7EuLhsuHKbnjLWkW4yYGNJJ8ONsgwHBvLQ'. Un tableau de MediaStreamTrack est renvoyé par les méthodes getAudioTracks() et getVideoTracks().

Pour l'exemple getUserMedia, stream.getAudioTracks() renvoie un tableau vide (car l'audio n'est pas présent) et, en supposant qu'une webcam fonctionnelle est connectée, stream.getVideoTracks() renvoie un tableau d'un MediaStreamTrack représentant le flux de la webcam. Chaque MediaStreamTrack a un genre ('video' ou 'audio'), un label (quelque chose comme 'FaceTime HD Camera (Built-in)') et représente un ou plusieurs canaux audio ou vidéo. Dans ce cas, il n'y a qu'une seule piste vidéo et pas de son, mais il est facile d'imaginer des cas d'utilisation où il y en a plus, comme une application de chat qui reçoit les flux de la caméra avant, de la caméra arrière et du micro, et une application qui partage son écran.

Vous pouvez associer un MediaStream à un élément vidéo en définissant l'attribut srcObject. Auparavant, pour ce faire, vous définissiez l'attribut src sur une URL d'objet créée avec URL.createObjectURL(), mais cette fonctionnalité est désormais obsolète.

getUserMedia peut également être utilisé comme nœud d'entrée pour l'API Web Audio:

// 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);
});

Les applications et extensions basées sur Chromium peuvent également intégrer getUserMedia. L'ajout des autorisations audioCapture et/ou videoCapture au fichier manifeste ne permet de demander et d'accorder l'autorisation qu'une seule fois lors de l'installation. Par la suite, l'utilisateur n'est plus invité à autoriser l'accès à l'appareil photo ou au micro.

L'autorisation ne doit être accordée qu'une seule fois pour getUserMedia(). La première fois, un bouton "Autoriser" s'affiche dans la barre d'informations du navigateur. L'accès HTTP pour getUserMedia() a été abandonné par Chrome à la fin de l'année 2015, car il était classé dans la catégorie Fonctionnalité puissante.

L'objectif est potentiellement d'activer un MediaStream pour n'importe quelle source de flux de données, pas seulement une caméra ou un micro. Cela permettrait de diffuser des flux de données stockées ou de sources de données arbitraires, telles que des capteurs ou d'autres entrées.

getUserMedia() prend réellement vie en combinaison avec d'autres API et bibliothèques JavaScript:

  • Webcam Toy est une application pour photomatons qui utilise WebGL pour ajouter des effets étranges et merveilleux aux photos. Vous pouvez ensuite les partager ou les enregistrer localement.
  • FaceKat est un jeu de suivi des visages créé à l'aide de headtrackr.js.
  • La caméra ASCII utilise l'API Canvas pour générer des images ASCII.
<ph type="x-smartling-placeholder">
</ph> Image ASCII générée par idevelop.ro/ascii-camera
de l'art ASCII gUM !

Contraintes

Vous pouvez utiliser des contraintes pour définir des valeurs de résolution vidéo pour getUserMedia(). Cela permet également la prise en charge d'autres contraintes, telles que le format. mode de face (caméra avant ou arrière) La fréquence d'images, la hauteur et la largeur et une méthode applyConstraints().

Pour obtenir un exemple, consultez Exemples de WebRTC getUserMedia: sélectionner la résolution.

La définition d'une valeur de contrainte non autorisée génère une DOMException ou une OverconstrainedError si, par exemple, une résolution demandée n'est pas disponible. Pour voir comment cela fonctionne, consultez la section Exemples de WebRTC getUserMedia: sélectionner la résolution pour une démonstration.

Captures d'écran et d'onglets

Les applications Chrome permettent également de partager la vidéo en direct d'un onglet du navigateur ou de l'intégralité du bureau via les API chrome.tabCapture et chrome.desktopCapture. Pour obtenir une démonstration et obtenir davantage d'informations, consultez la section Partager l'écran avec WebRTC. Cet article date de quelques années, mais il est toujours intéressant.)

Il est également possible d'utiliser la capture d'écran en tant que source MediaStream dans Chrome à l'aide de la contrainte chromeMediaSource expérimentale. Notez que la capture d'écran nécessite HTTPS et ne doit être utilisée qu'à des fins de développement, car elle est activée via un indicateur de ligne de commande, comme expliqué dans cet article.

Signalisation: contrôle de session, informations sur le réseau et les contenus multimédias

WebRTC utilise RTCPeerConnection pour communiquer des flux de données entre les navigateurs (également appelés pairs), mais a également besoin d'un mécanisme pour coordonner la communication et envoyer des messages de contrôle, un processus appelé "signalement". Les méthodes et protocoles de signalisation ne sont pas spécifiés par WebRTC. La signalisation ne fait pas partie de l'API RTCPeerConnection.

Au lieu de cela, les développeurs d'applications WebRTC peuvent choisir le protocole de messagerie qu'ils préfèrent, tel que SIP ou XMPP, et tout canal de communication duplex (bidirectionnel) approprié. L'exemple appr.tc utilise XHR et l'API Channel comme mécanisme de signalement. L'atelier de programmation utilise Socket.io qui s'exécute sur un serveur Node.

La signalisation permet d'échanger trois types d'informations:

  • Messages de contrôle de session: pour initialiser ou fermer la communication et signaler des erreurs.
  • Configuration du réseau: au monde extérieur, quels sont l'adresse IP et le port de votre ordinateur ?
  • Fonctionnalités multimédias: quels codecs et résolutions peuvent être gérés par votre navigateur et le navigateur avec lequel il souhaite communiquer ?

L'échange d'informations via la signalisation doit s'effectuer correctement pour que la diffusion peer-to-peer puisse commencer.

Par exemple, imaginez qu'Alice souhaite communiquer avec Bob. Voici un exemple de code issu de la spécification WebRTC du W3C, qui illustre le processus de signalement en action. Le code suppose l'existence d'un mécanisme de signalement créé dans la méthode createSignalingChannel(). Notez également que dans Chrome et Opera, RTCPeerConnection a actuellement le préfixe.

// 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);
  }
};

Tout d'abord, Alice et Bob échangent des informations sur le réseau. (L'expression rechercher des candidats fait référence au processus de recherche des interfaces réseau et des ports réseau à l'aide du framework ICE.)

  1. Alice crée un objet RTCPeerConnection avec un gestionnaire onicecandidate, qui s'exécute lorsque des candidats du réseau deviennent disponibles.
  2. Alice envoie des données candidates sérialisées à Bob via le canal de signalisation qu'il utilise, tel que WebSocket ou un autre mécanisme.
  3. Lorsque Bob reçoit un message d'Alice sur un candidat, il appelle addIceCandidate pour ajouter le candidat à la description du pair distant.

Les clients WebRTC (également appelés pairs ou Alice et Bob dans cet exemple) doivent également vérifier et échanger des informations sur les médias audio et vidéo locaux et distants, telles que la résolution et les capacités de codec. La signalisation pour échanger des informations de configuration multimédias s'effectue par l'échange d'une offre et d'une réponse à l'aide du protocole de description de session (SDP, Session Description Protocol).

  1. Alice exécute la méthode createOffer() RTCPeerConnection. Le résultat est transmis sous RTCSessionDescription (description de la session locale d'Alice).
  2. Dans le rappel, Alice définit la description locale à l'aide de setLocalDescription(), puis envoie cette description de session à Bob via son canal de signalement. Notez que RTCPeerConnection ne commence pas à rassembler des candidats tant que setLocalDescription() n'est pas appelé. Ces informations sont codifiées dans le projet JSEP IETF.
  3. Bob définit la description qu'Alice lui a envoyée comme description distante à l'aide de setRemoteDescription().
  4. Bob exécute la méthode createAnswer() RTCPeerConnection, en lui transmettant la description à distance qu'Alice lui a fournie afin qu'une session locale compatible avec la sienne puisse être générée. Le rappel createAnswer() reçoit un RTCSessionDescription. Bob la définit comme description locale et l'envoie à Alice.
  5. Lorsque Alice reçoit la description de la session de Bob, elle la définit comme description distante avec setRemoteDescription.
  6. Ding !

Les objets RTCSessionDescription sont des blobs conformes au protocole de description de session (SDP). Sérialisé, un objet SDP se présente comme suit:

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

L'acquisition et l'échange d'informations sur le réseau et les médias peuvent être effectués simultanément, mais les deux processus doivent être terminés pour que la diffusion audio et vidéo entre pairs puisse commencer.

L'architecture d'offre et de réponse décrite précédemment est appelée JavaScript Session Establishment Protocol (protocole d'établissement de session JavaScript). (La vidéo de démonstration d'Ericsson pour sa première implémentation WebRTC présente une excellente animation expliquant le processus de signalement et de diffusion en streaming.)

<ph type="x-smartling-placeholder">
</ph> Schéma de l&#39;architecture JSEP
Architecture JSEP
.

Une fois le processus de signalement terminé, les données peuvent être diffusées directement peer-to-peer, entre l'appelant et l'appelé, ou, en cas d'échec, via un serveur relais intermédiaire (nous y reviendrons plus tard). Le streaming est la tâche de RTCPeerConnection.

RTCPeerConnection

RTCPeerConnection est le composant WebRTC qui gère une communication stable et efficace de flux de données entre pairs.

Voici un schéma d'architecture WebRTC montrant le rôle de RTCPeerConnection. Comme vous le remarquerez, les parties vertes sont complexes !

<ph type="x-smartling-placeholder">
</ph> Schéma de l&#39;architecture WebRTC
Architecture WebRTC (provenant de webrtc.org)

Du point de vue de JavaScript, la principale chose à comprendre dans ce diagramme est que RTCPeerConnection protège les développeurs Web des innombrables complexités qui se cachent derrière. Les codecs et les protocoles utilisés par WebRTC effectuent un travail considérable pour permettre la communication en temps réel, même sur des réseaux peu fiables:

  • Dissimulation de la perte de paquets
  • Suppression de l'écho
  • Adaptabilité de la bande passante
  • Mise en mémoire tampon dynamique de la gigue
  • Contrôle automatique du gain
  • Réduction et suppression du bruit
  • Nettoyage d'images

Le code W3C précédent montre un exemple simplifié de WebRTC du point de vue de la signalisation. Voici des tutoriels sur deux applications WebRTC fonctionnelles. Le premier est un exemple simple illustrant RTCPeerConnection, et le second est un client de chat vidéo entièrement opérationnel.

RTCPeerConnection sans serveur

Le code suivant est issu des exemples de connexion WebRTC d'un pair, qui contient des RTCPeerConnection locaux et distants (ainsi que des vidéos locales et distantes) sur une même page Web. Cela n'a rien d'utile (l'appelant et l'appelé se trouvent sur la même page), mais cela permet de clarifier le fonctionnement de l'API RTCPeerConnection, car les objets RTCPeerConnection sur la page peuvent échanger des données et des messages directement sans avoir à utiliser de mécanismes de signalement intermédiaires.

Dans cet exemple, pc1 représente le pair local (appelant) et pc2 représente le pair distant (appelé).

Appelant

  1. Créez un RTCPeerConnection et ajoutez le flux depuis getUserMedia(): ```js // Servers est un fichier de configuration facultatif. (Voir la discussion sur TURN et STUN ultérieurement.) pc1 = nouvelle RTCPeerConnection(servers); // ... localStream.getTracks().forEach((track) =&gt; { pc1.addTrack(track, localStream); });
  1. Créez une offre et définissez-la comme description locale pour pc1 et comme description distante pour pc2. Cela peut être fait directement dans le code sans utiliser de signal, car l'appelant et l'appelé se trouvent sur la même page: js pc1.setLocalDescription(desc).then(() => { onSetLocalSuccess(pc1); }, onSetSessionDescriptionError ); trace('pc2 setRemoteDescription start'); pc2.setRemoteDescription(desc).then(() => { onSetRemoteSuccess(pc2); }, onSetSessionDescriptionError );

Appelé

  1. Créez pc2 et, lorsque le flux de pc1 est ajouté, affichez-le dans un élément vidéo: js pc2 = new RTCPeerConnection(servers); pc2.ontrack = gotRemoteStream; //... function gotRemoteStream(e){ vid2.srcObject = e.stream; }

RTCPeerConnection API et serveurs

Dans le monde réel, WebRTC a besoin de serveurs, aussi simples que simples, et voici ce qui peut se produire:

  • Les utilisateurs se découvrent et échangent des détails concrets, tels que des noms.
  • Les applications clientes (pairs) WebRTC échangent des informations sur le réseau.
  • Les pairs échangent des données sur les médias, comme le format et la résolution de la vidéo.
  • Les applications clientes WebRTC traversent les passerelles NAT et les pare-feu.

En d'autres termes, WebRTC a besoin de quatre types de fonctionnalités côté serveur:

  • Découverte et communication des utilisateurs
  • Serveur de signalement
  • Traversée de pare-feu/NAT
  • Serveurs relais en cas d'échec de la communication peer-to-peer

Le balayage NAT, la mise en réseau peer-to-peer et les exigences liées à la création d'une application serveur pour la découverte et la signalisation des utilisateurs sortent du cadre de cet article. Il suffit de dire que le protocole ICE utilise le protocole STUN et son extension, TURN, pour permettre à RTCPeerConnection de gérer la traversée NAT et les autres aléas du réseau.

ICE est un framework permettant de mettre en relation des pairs, comme deux clients de chat vidéo. Dans un premier temps, ICE tente de connecter directement les pairs avec la latence la plus faible possible via UDP. Dans ce processus, les serveurs STUN n'ont qu'une seule tâche: permettre à un pair derrière une NAT d'identifier son adresse publique et son port. (Pour en savoir plus sur STUN et TURN, consultez la section Créer les services de backend requis pour une application WebRTC.)

<ph type="x-smartling-placeholder">
</ph> Rechercher des connexions candidates
Rechercher des contacts potentiels
.

En cas d'échec UDP, ICE tente d'exécuter le protocole TCP. En cas d'échec de la connexion directe, en particulier en raison du passage de la NAT et des pare-feu à l'entreprise, ICE utilise un serveur TURN intermédiaire (relais). En d'autres termes, ICE utilise d'abord STUN avec UDP pour connecter directement les pairs et, en cas d'échec, revient à un serveur relais TURN. L'expression recherche de candidats fait référence au processus de recherche d'interfaces et de ports réseau.

<ph type="x-smartling-placeholder">
</ph> Chemins de données WebRTC
Chemins de données WebRTC
.

Justin Uberti, ingénieur WebRTC, fournit plus d'informations sur ICE, STUN et TURN dans la présentation WebRTC de Google I/O 2013. (Les diapositives de présentation donnent des exemples d'implémentations de serveurs TURN et STUN.)

Un client de chat vidéo simple

La démo de chat vidéo sur appr.tc est un bon endroit pour essayer WebRTC, avec la signalisation et le NAT/la traversée de pare-feu à l'aide d'un serveur STUN. Cette application utilise adapter.js, un shim pour isoler les applications des modifications des spécifications et des différences de préfixe.

Le code est délibérément détaillé dans sa journalisation. Consultez la console pour comprendre l'ordre des événements. Voici un tutoriel détaillé du code.

Topologies de réseaux

WebRTC, tel qu'il est actuellement implémenté, n'accepte que la communication un à un, mais peut être utilisé dans des scénarios réseau plus complexes, par exemple lorsque plusieurs pairs communiquent entre eux directement ou via un MCU (Multipoint Control Unit), un serveur capable de gérer un grand nombre de participants et d'effectuer un transfert de flux sélectif, ainsi que le mixage ou l'enregistrement de l'audio et de la vidéo.

<ph type="x-smartling-placeholder">
</ph> Schéma de la topologie de l&#39;unité de contrôle multipoint
Exemple de topologie d'unité de contrôle multipoint
.

De nombreuses applications WebRTC existantes ne montrent que la communication entre les navigateurs Web, mais les serveurs de passerelle peuvent permettre à une application WebRTC exécutée sur un navigateur d'interagir avec des appareils tels que des téléphones (également appelés PSTN) et des systèmes VOIP. En mai 2012, Doubango Telecom a mis au point le client SIP sipml5 en Open Source, conçu avec WebRTC et WebSocket, qui permet (entre autres utilisations potentielles) de passer des appels vidéo entre des navigateurs et des applications fonctionnant sous iOS et Android. Lors de la conférence Google I/O, Tethr et Tropo ont présenté un cadre de communication en cas de catastrophe dans une mallette utilisant une cellule OpenBTS pour permettre la communication entre les feature phones et les ordinateurs via WebRTC. La communication téléphonique sans opérateur !

<ph type="x-smartling-placeholder">
</ph> Démonstration de Tethr/Tropo lors de la conférence Google I/O 2012
Tethr/Tropo: communications en cas de catastrophe dans une mallette
.

API RTCDataChannel<

En plus de l'audio et de la vidéo, WebRTC prend en charge la communication en temps réel pour d'autres types de données.

L'API RTCDataChannel permet l'échange de données arbitraires pair à pair avec une faible latence et un débit élevé. Pour accéder à des démonstrations sur une seule page et découvrir comment créer une application de transfert de fichiers simple, consultez respectivement les exemples WebRTC et l'atelier de programmation WebRTC.

Il existe de nombreux cas d'utilisation potentiels de l'API, par exemple:

  • Jeux vidéo
  • Applications Bureau à distance
  • Chat textuel en temps réel
  • Transfert de fichiers
  • Réseaux décentralisés

L'API dispose de plusieurs fonctionnalités pour exploiter pleinement RTCPeerConnection et permettre une communication peer-to-peer puissante et flexible:

  • Configuration de la session RTCPeerConnection
  • Plusieurs canaux simultanés avec hiérarchisation
  • Sémantique de livraison fiable et non fiable
  • Sécurité intégrée (DTLS) et contrôle de la congestion
  • Possibilité d'utiliser avec ou sans audio ou vidéo

La syntaxe est délibérément semblable à WebSocket, avec une méthode send() et un événement message:

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);
};

La communication a lieu directement entre les navigateurs. Par conséquent, RTCDataChannel peut être beaucoup plus rapide que WebSocket, même si un serveur relais (TURN) est requis en cas d'échec du poinçon pour gérer les pare-feu et les NAT.

RTCDataChannel est disponible dans Chrome, Safari, Firefox, Opera et Samsung Internet. Le jeu Cube Slam utilise l'API pour communiquer l'état du jeu. Jouez à un ami ou jouez à l'ours ! La plate-forme innovante Sharefest permettait le partage de fichiers via RTCDataChannel et peerCDN, ce qui donnait un aperçu de la façon dont WebRTC pourrait permettre la distribution de contenu peer-to-peer.

Pour plus d'informations sur RTCDataChannel, consultez le projet de spécification de protocole de l'IETF.

Sécurité

Une application ou un plug-in de communication en temps réel peut compromettre la sécurité de plusieurs façons. Exemple :

  • Les contenus multimédias ou les données non chiffrés peuvent être interceptés entre les navigateurs, ou entre un navigateur et un serveur.
  • Une application peut enregistrer et diffuser du contenu vidéo ou audio à l'insu de l'utilisateur.
  • Des logiciels malveillants ou des virus peuvent être installés en même temps qu'un plug-in ou une application apparemment anodins.

WebRTC offre plusieurs fonctionnalités pour éviter ces problèmes:

  • Les implémentations WebRTC utilisent des protocoles sécurisés tels que DTLS et SRTP.
  • Le chiffrement est obligatoire pour tous les composants WebRTC, y compris les mécanismes de signalement.
  • WebRTC n'est pas un plug-in. Ses composants s'exécutent dans le bac à sable du navigateur et non selon un processus distinct. Les composants ne nécessitent pas d'installation distincte et sont mis à jour en même temps que le navigateur.
  • L'accès à la caméra et au micro doit être explicitement autorisé, et l'interface utilisateur l'indique clairement lorsque ceux-ci sont en fonctionnement.

Cet article n'aborde pas en détail la sécurité des contenus multimédias en streaming. Pour en savoir plus, consultez la proposition d'architecture de sécurité WebRTC proposée par l'IETF.

En conclusion

Les API et les normes de WebRTC peuvent démocratiser et décentraliser les outils de création et de communication de contenu, y compris la téléphonie, les jeux, la production vidéo, la création musicale et la collecte d'actualités.

La technologie n'est pas beaucoup plus perturbatrice que cela.

Comme l'a dit le blogueur Phil Edholm : "Pour la communication en temps réel, WebRTC et HTML5 pouvaient potentiellement opérer la même transformation que celle du navigateur d'origine pour l'information."

Outils pour les développeurs

  • Les statistiques WebRTC d'une session en cours sont disponibles à l'adresse suivante: <ph type="x-smartling-placeholder">
      </ph>
    • about://webrtc-internals dans Chrome
    • opera://webrtc-internals dans Opera
    • about:webrtc dans Firefox <ph type="x-smartling-placeholder">
      </ph> Page chrome://webrtc-internals
      capture d'écran de chrome://webrtc-internals
      .
  • Notes d'interopérabilité entre les navigateurs
  • adapter.js est un shim JavaScript pour WebRTC, géré par Google avec l'aide de la communauté WebRTC. Il supprime les préfixes des fournisseurs, les différences entre les navigateurs et les modifications de spécifications.
  • Pour en savoir plus sur les processus de signalement WebRTC, consultez la sortie du journal appr.tc dans la console.
  • Si c'est trop, vous pouvez utiliser un framework WebRTC ou même un service WebRTC complet.
  • Les rapports de bugs et les demandes de fonctionnalités sont toujours les bienvenus: <ph type="x-smartling-placeholder">

En savoir plus

Normes et protocoles

Résumé de la prise en charge WebRTC

API MediaStream et getUserMedia

  • Chrome pour ordinateur de bureau 18.0.1008 et versions ultérieures Chrome pour Android 29 ou version ultérieure
  • Opera 18 ou version ultérieure Opera pour Android 20 ou version ultérieure
  • Opera 12, Opera Mobile 12 (basé sur le moteur Presto)
  • Firefox 17 ou version ultérieure
  • Microsoft Edge 16 ou version ultérieure
  • Safari 11.2 ou version ultérieure sur iOS, et 11.1 ou version ultérieure sous macOS
  • UC 11.8 ou version ultérieure sur Android
  • Samsung Internet 4 ou version ultérieure

API RTCPeerConnection

  • Chrome pour ordinateur de bureau 20 ou version ultérieure Chrome pour Android 29 ou version ultérieure (sans indicateur)
  • Opera 18 ou version ultérieure (activé par défaut) Opera pour Android 20 ou version ultérieure (activé par défaut)
  • Firefox 22 et versions ultérieures (activé par défaut)
  • Microsoft Edge 16 ou version ultérieure
  • Safari 11.2 ou version ultérieure sur iOS, et 11.1 ou version ultérieure sous macOS
  • Samsung Internet 4 ou version ultérieure

API RTCDataChannel

  • Version expérimentale dans Chrome 25, mais plus stable (et avec interopérabilité Firefox) dans Chrome 26 et versions ultérieures Chrome pour Android 29 ou version ultérieure
  • Version stable (et interopérabilité avec Firefox) dans Opera 18 ou version ultérieure. Opera pour Android 20 ou version ultérieure
  • Firefox 22 et versions ultérieures (activé par défaut)

Pour en savoir plus sur la compatibilité multiplate-forme des API, telles que getUserMedia et RTCPeerConnection, consultez caniuse.com et État de la plate-forme Chrome.

Des API natives pour RTCPeerConnection sont également disponibles dans la documentation sur webrtc.org.