Inizia a utilizzare WebRTC

WebRTC è un nuovo fronte nella lunga guerra per un web aperto e libero.

Brendan Eich, inventore di JavaScript

Immagina un mondo in cui il tuo telefono, la TV e il computer possano comunicare su una piattaforma comune. Immagina che sia stato facile aggiungere la chat video e la condivisione dei dati peer-to-peer alla tua app web. Questa è la visione di WebRTC.

Vuoi provare? WebRTC è disponibile su computer e dispositivi mobili in Google Chrome, Safari, Firefox e Opera. Un buon punto di partenza è la semplice app di video chat all'indirizzo appr.tc:

  1. Apri appr.tc nel browser.
  2. Fai clic su Partecipa per entrare in una chat room e consentire all'app di utilizzare la webcam.
  3. Apri l'URL visualizzato alla fine della pagina in una nuova scheda o, meglio ancora, su un altro computer.

Avvio rapido

Non hai tempo di leggere questo articolo o vuoi solo del codice?

In alternativa, passa direttamente al codelab WebRTC, una guida passo passo che spiega come creare un'app di chat video completa, incluso un semplice server di segnalazione.

Una cronologia molto breve di WebRTC

Una delle ultime sfide principali per il web è consentire la comunicazione umana tramite voce e video: comunicazione in tempo reale o RTC in breve. In un'app web, RTC dovrebbe essere naturale quanto l'inserimento di testo in un input di testo. Senza questi limiti, le tue capacità di innovazione e sviluppo di nuovi modi di interagire tra le persone sono limitate.

Storicamente, RTC era aziendale e complesso e richiedeva la licenza o lo sviluppo interno di costose tecnologie audio e video. Integrare la tecnologia RTC con contenuti, dati e servizi esistenti è stato difficile e richiede molto tempo, in particolare sul web.

La videochiamata di Gmail è diventata popolare nel 2008 e, nel 2011, Google ha introdotto Hangouts, che utilizza Talk (così come Gmail). Google ha acquistato GIPS, una società che ha sviluppato molti componenti necessari per RTC, come i codec e le tecniche di cancellazione dell'eco. Google ha reso open source le tecnologie sviluppate da GIPS e si è impegnata con gli enti di standardizzazione pertinenti presso l'Internet Engineering Task Force (IETF) e il World Wide Web Consortium (W3C) per garantire il consenso del settore. Nel maggio 2011, Ericsson ha realizzato la prima implementazione di WebRTC.

WebRTC ha implementato standard aperti per la comunicazione in tempo reale, video, audio e dati senza plug-in. La necessità era reale:

  • Molti servizi web utilizzavano RTC, ma avevano bisogno di download, app native o plug-in. Sono inclusi Skype, Facebook e Hangouts.
  • Il download, l'installazione e l'aggiornamento dei plug-in sono operazioni complesse, soggette a errori e fastidiosi.
  • I plug-in sono difficili da distribuire, eseguire il debug, risolvere i problemi, testare e gestire e potrebbero richiedere licenze e integrazione con tecnologie complesse e costose. Spesso è difficile convincere gli utenti a installare plug-in.

I principi guida del progetto WebRTC devono essere open source, senza costi, standardizzate, integrate nei browser web e più efficienti delle tecnologie esistenti.

Dove siamo ora?

WebRTC viene utilizzato in varie app, ad esempio Google Meet. WebRTC è stato integrato anche con le app native WebKitGTK+ e Qt.

WebRTC implementa queste tre API: - MediaStream (noto anche come getUserMedia) - RTCPeerConnection - RTCDataChannel

Le API sono definite nelle due specifiche seguenti:

Tutte e tre le API sono supportate su dispositivi mobili e computer da Chrome, Safari, Firefox, Edge e Opera.

getUserMedia: per demo e codice, consulta gli esempi di WebRTC o prova gli fantastici esempi di Chris Wilson che utilizzano getUserMedia come input per l'audio web.

RTCPeerConnection: per una demo semplice e un'app di chat video completamente funzionante, vedi rispettivamente gli esempi di connessione peer WebRTC e appr.tc. Questa app utilizza adapter.js, uno shim JavaScript gestito da Google con l'aiuto della community WebRTC, per astrarre le differenze del browser e le modifiche alle specifiche.

RTCDataChannel: per vedere come funziona, guarda gli esempi di WebRTC per dare un'occhiata a una delle demo sui canali dati.

Il codelab WebRTC mostra come utilizzare tutte e tre le API per creare una semplice app per la chat video e la condivisione di file.

Il tuo primo WebRTC

Le app WebRTC devono fare diverse cose:

  • Ricevi audio, video o altri dati in streaming.
  • Recupera le informazioni di rete, ad esempio indirizzi IP e porte, e scambiale con altri client WebRTC (noti come peer) per attivare la connessione, anche tramite NAT e firewall.
  • Coordina le comunicazioni di segnalazione per segnalare gli errori e avviare o chiudere le sessioni.
  • Scambia informazioni sulle funzionalità multimediali e client, come risoluzione e codec.
  • Comunica audio, video o dati in streaming.

Per acquisire e comunicare i flussi di dati, WebRTC implementa le seguenti API:

  • MediaStream ha accesso agli stream di dati, ad esempio provenienti dalla fotocamera e dal microfono dell'utente.
  • RTCPeerConnection consente le chiamate audio o le videochiamate con servizi per la crittografia e la gestione della larghezza di banda.
  • RTCDataChannel consente la comunicazione peer-to-peer di dati generici.

Più avanti verrà approfondita una discussione dettagliata sugli aspetti di rete e di segnalazione di WebRTC.

API MediaStream (nota anche come API getUserMedia)

L'API MediaStream rappresenta gli stream sincronizzati di contenuti multimediali. Ad esempio, uno stream preso dall'input della videocamera e del microfono ha tracce video e audio sincronizzate. Non confondere MediaStreamTrack con l'elemento <track>, che è qualcosa di completamente diverso.

Probabilmente il modo più semplice per comprendere l'API MediaStream è dare un'occhiata alla realtà:

  1. Nel browser, vai a Esempi di WebRTC getUserMedia.
  2. Apri la console.
  3. Esamina la variabile stream, che è in ambito globale.

Ogni MediaStream ha un input, che potrebbe essere un MediaStream generato da getUserMedia(), e un output, che potrebbe essere passato a un elemento video o a un RTCPeerConnection.

Il metodo getUserMedia() prende un parametro dell'oggetto MediaStreamConstraints e restituisce un Promise che si risolve in un oggetto MediaStream.

Ogni MediaStream ha un label, ad esempio 'Xk7EuLhsuHKbnjLWkW4yYGNJJ8ONsgwHBvLQ'. I metodi getAudioTracks() e getVideoTracks() restituiscono un array di MediaStreamTrack.

Per l'esempio getUserMedia, stream.getAudioTracks() restituisce un array vuoto (perché non c'è audio) e, supponendo che sia collegata una webcam funzionante, stream.getVideoTracks() restituisce un array di un MediaStreamTrack che rappresenta lo stream dalla webcam. Ogni MediaStreamTrack ha un tipo ('video' o 'audio'), un label (qualcosa come 'FaceTime HD Camera (Built-in)') e rappresenta uno o più canali audio o video. In questo caso, esiste una sola traccia video e nessun audio, ma è facile immaginare casi d'uso in cui ce ne siano di più, come un'app di chat che riceve stream dalla fotocamera anteriore, dalla fotocamera posteriore, dal microfono e da un'app che condivide lo schermo.

Un elemento MediaStream può essere associato a un elemento video impostando l'attributo srcObject. In precedenza, questa operazione veniva eseguita impostando l'attributo src su un URL dell'oggetto creato con URL.createObjectURL(), ma questa impostazione è stata ritirata.

getUserMedia può essere utilizzato anche come nodo di input per 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);
});

Anche le app e le estensioni basate su Chromium possono incorporare getUserMedia. L'aggiunta delle autorizzazioni audioCapture e/o videoCapture al file manifest consente di richiedere e concedere l'autorizzazione una sola volta al momento dell'installazione. Dopodiché, all'utente non verrà richiesta l'autorizzazione per accedere alla fotocamera o al microfono.

L'autorizzazione deve essere concessa una sola volta per getUserMedia(). La prima volta viene visualizzato un pulsante Consenti nella barra delle informazioni del browser. L'accesso HTTP per getUserMedia() è stato ritirato da Chrome alla fine del 2015 in quanto è stato classificato come funzionalità potente.

L'intenzione è potenzialmente di abilitare MediaStream per qualsiasi origine dati in streaming, non solo per una videocamera o un microfono. Ciò consente il flusso di dati da dati archiviati o da origini dati arbitrarie, come sensori o altri ingressi.

getUserMedia() prende vita davvero insieme ad altre API e librerie JavaScript:

  • Webcam Toy è un'app per la creazione di foto che utilizza WebGL per aggiungere effetti strani e meravigliosi alle foto che possono essere condivise o salvate in locale.
  • FaceKat è un gioco per il monitoraggio dei volti realizzato con headtrackr.js.
  • La fotocamera ASCII utilizza l'API Canvas per generare immagini ASCII.
di Gemini Advanced.
Immagine ASCII generata da idevelop.ro/ascii-camera
Grafica ASCII gUM!

Vincoli

Puoi utilizzare i vincoli per impostare i valori della risoluzione video per getUserMedia(). In questo modo è possibile anche supportare altri vincoli, come le proporzioni; modalità rivolta verso l'alto (fotocamera anteriore o posteriore); frequenza fotogrammi, altezza e larghezza; e un metodo applyConstraints().

Per un esempio, consulta la sezione Esempi di WebRTC getUserMedia: seleziona la risoluzione.

L'impostazione di un valore di vincolo non consentito restituisce un valore DOMException o OverconstrainedError se, ad esempio, la risoluzione richiesta non è disponibile. Per vedere questa funzionalità in azione, consulta la sezione Esempi di WebRTC getUserMedia: selezionare la risoluzione per una demo.

Acquisizione schermo e schede

Le app di Chrome consentono inoltre di condividere un video in diretta di una singola scheda del browser o dell'intero desktop tramite le API di chrome.tabCapture e chrome.desktopCapture. Per una demo e per ulteriori informazioni, consulta la pagina relativa alla condivisione dello schermo con WebRTC. L'articolo risale a qualche anno fa, ma è ancora interessante.)

È anche possibile utilizzare l'acquisizione schermo come origine MediaStream in Chrome usando il vincolo chromeMediaSource sperimentale. Tieni presente che l'acquisizione dello schermo richiede HTTPS e deve essere utilizzata solo per lo sviluppo, poiché è abilitata tramite un flag della riga di comando, come spiegato in questo post.

Segnalazione: controllo della sessione, rete e informazioni multimediali

WebRTC utilizza RTCPeerConnection per comunicare flussi di dati tra browser (noti anche come peer), ma necessita anche di un meccanismo per coordinare la comunicazione e inviare messaggi di controllo, un processo noto come segnalazione. I metodi e i protocolli di segnalazione non sono specificati da WebRTC. La segnalazione non fa parte dell'API RTCPeerConnection.

Gli sviluppatori di app WebRTC possono invece scegliere il protocollo di messaggistica preferito, ad esempio SIP o XMPP, e qualsiasi canale di comunicazione duplex (doppio) appropriato. L'esempio appr.tc utilizza XHR e l'API Channel come meccanismo di segnalazione. Il codelab utilizza Socket.io in esecuzione su un server nodo.

La segnalazione viene utilizzata per scambiare tre tipi di informazioni:

  • Messaggi di controllo della sessione: per inizializzare o chiudere la comunicazione e segnalare errori.
  • Configurazione di rete: per il mondo esterno, quali sono l'indirizzo IP e la porta del tuo computer?
  • Funzionalità multimediali: quali codec e risoluzioni possono essere gestiti dal browser e dal browser con cui vuole comunicare?

Lo scambio di informazioni tramite la segnalazione deve essere completato correttamente prima dell'inizio dello streaming peer-to-peer.

Ad esempio, immagina Alice voglia comunicare con Roberto. Ecco un esempio di codice della specifica WebRTC di W3C, che mostra il processo di segnalazione in azione. Il codice presuppone l'esistenza di qualche meccanismo di segnalazione creato nel metodo createSignalingChannel(). Tieni inoltre presente che su Chrome e Opera, il prefisso RTCPeerConnection è attualmente.

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

Innanzitutto, Alice e Bob si scambiano informazioni di rete. L'espressione finding candidate si riferisce al processo di ricerca delle interfacce di rete e delle porte utilizzando il framework ICE.

  1. Alice crea un oggetto RTCPeerConnection con un gestore onicecandidate, che viene eseguito quando i candidati di rete diventano disponibili.
  2. Alice invia a Bob i dati dei candidati serializzati attraverso qualsiasi canale di segnalazione, ad esempio WebSocket o altri meccanismi.
  3. Quando Bob riceve un messaggio per il candidato da Alice, chiama addIceCandidate per aggiungere il candidato alla descrizione remota del candidato.

I client WebRTC (noti anche come peer o Alice e Bob in questo esempio) devono verificare e scambiare informazioni multimediali audio e video locali e remoti, come la risoluzione e le funzionalità di codec. La segnalazione dello scambio di informazioni sulla configurazione dei contenuti multimediali avviene con lo scambio di un'offerta e una risposta utilizzando il protocollo SDP (Session Description Protocol):

  1. Alice esegue il metodo createOffer() RTCPeerConnection. Il risultato finale viene superato con la dicitura RTCSessionDescription - la descrizione della sessione locale di Alice.
  2. Nel callback, Alice imposta la descrizione locale utilizzando setLocalDescription(), quindi invia questa descrizione della sessione a Roberto tramite il suo canale di segnalazione. Tieni presente che RTCPeerConnection non inizierà a raccogliere candidati finché non verrà chiamato setLocalDescription(). Questo codice è codificato nella bozza JSEP IETF.
  3. Bob imposta la descrizione inviata da Alice come descrizione remota utilizzando setRemoteDescription().
  4. Roberto esegue il metodo createAnswer() RTCPeerConnection, trasmettendo la descrizione remota che ha ricevuto da Alice in modo da generare una sessione locale compatibile con la sua. Il callback createAnswer() viene superato un RTCSessionDescription. Roberto la imposta come descrizione locale e la invia ad Alice.
  5. Quando Alice ottiene la descrizione della sessione di Roberto, la imposta come descrizione remota con setRemoteDescription.
  6. Ping!
di Gemini Advanced.

Gli oggetti RTCSessionDescription sono BLOB conformi al protocollo per la descrizione delle sessioni, SDP. Serializzato. Un oggetto SDP ha il seguente aspetto:

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'acquisizione e lo scambio di informazioni sulla rete e sui contenuti multimediali possono essere eseguite contemporaneamente, ma entrambi i processi devono essere stati completati prima che possa iniziare lo streaming audio e video tra peer.

L'architettura di offerta/risposta descritta in precedenza è denominata JavaScript Session Launchment Protocol o JSEP. C'è un'animazione eccellente che spiega il processo di segnalazione e streaming nel video dimostrativo di Ericsson per la sua prima implementazione di WebRTC.

Diagramma dell&#39;architettura di JSEP
Architettura di JSEP

Una volta completato il processo di segnalazione, i dati possono essere trasmessi in streaming direttamente peer-to-peer, tra il chiamante e il chiamante o, in caso di esito negativo, tramite un server di inoltro intermediario (ulteriori informazioni in merito più avanti). Il flusso di dati è compito di RTCPeerConnection.

RTCPeerConnection

RTCPeerConnection è il componente WebRTC che gestisce la comunicazione stabile ed efficiente di flussi di dati tra peer.

Di seguito è riportato un diagramma dell'architettura WebRTC che mostra il ruolo di RTCPeerConnection. Come noterai, le parti verdi sono complesse.

Diagramma dell&#39;architettura WebRTC
Architettura WebRTC (da webrtc.org)

Dal punto di vista di JavaScript, la cosa principale da capire in questo diagramma è che RTCPeerConnection protegge gli sviluppatori web dalla miriade di complessità che si celano sotto. I codec e i protocolli utilizzati da WebRTC svolgono un lavoro enorme per rendere possibile la comunicazione in tempo reale, anche su reti inaffidabili:

  • Occultamento della perdita di pacchetti
  • Cancellazione dell'eco
  • Adattabilità alla larghezza di banda
  • Buffering jitter dinamico
  • Controllo automatico guadagno
  • Riduzione ed eliminazione del rumore
  • Pulizia delle immagini

Il codice W3C precedente mostra un esempio semplificato di WebRTC dal punto di vista della segnalazione. Di seguito sono riportate le procedure dettagliate di due app WebRTC funzionanti. Il primo è un semplice esempio per dimostrare RTCPeerConnection e il secondo è un client di chat video completamente operativo.

RTCPeerConnection senza server

Il seguente codice viene preso dalla connessione peer di esempi WebRTC, che ha RTCPeerConnection locale e remoto (e video locale e remoto) su una pagina web. Ciò non costituisce nulla di molto utile: il chiamante e il chiamante sono sulla stessa pagina, ma rende il funzionamento dell'API RTCPeerConnection un po' più chiaro perché gli oggetti RTCPeerConnection sulla pagina possono scambiare dati e messaggi direttamente senza dover utilizzare meccanismi di segnalazione intermedia.

In questo esempio, pc1 rappresenta il peer locale (chiamante) e pc2 rappresenta il peer remoto (chiamato).

Chiamante

  1. Crea un nuovo RTCPeerConnection e aggiungi lo stream da getUserMedia(): ```js // Servers è un file di configurazione facoltativo. (Consulta la discussione relativa a TURN e STUN più avanti.) pc1 = new RTCPeerConnection(servers); // ... localStream.getTracks().forEach((track) =&gt; { pc1.addTrack(traccia, localStream); });
  1. Crea un'offerta e impostala come descrizione locale per pc1 e come descrizione remota per pc2. Questa operazione può essere eseguita direttamente nel codice senza utilizzare la segnalazione perché sia il chiamante che il chiamante si trovano nella stessa pagina: js pc1.setLocalDescription(desc).then(() => { onSetLocalSuccess(pc1); }, onSetSessionDescriptionError ); trace('pc2 setRemoteDescription start'); pc2.setRemoteDescription(desc).then(() => { onSetRemoteSuccess(pc2); }, onSetSessionDescriptionError );

Destinatario

  1. Crea pc2 e, quando viene aggiunto lo stream da pc1, visualizzalo in un elemento video: js pc2 = new RTCPeerConnection(servers); pc2.ontrack = gotRemoteStream; //... function gotRemoteStream(e){ vid2.srcObject = e.stream; }

API RTCPeerConnection più server

Nel mondo reale, WebRTC ha bisogno di server, per quanto semplici, pertanto potrebbe verificarsi quanto segue:

  • Gli utenti si scoprono a vicenda e si scambiano dettagli reali, ad esempio i nomi.
  • Le app client WebRTC (peer) si scambiano informazioni di rete.
  • I colleghi si scambiano dati sui contenuti multimediali, ad esempio il formato e la risoluzione dei video.
  • Le app client WebRTC attraversano gateway NAT e firewall.

In altre parole, WebRTC ha bisogno di quattro tipi di funzionalità lato server:

  • Rilevamento e comunicazione per gli utenti
  • Segnalazioni
  • Attraversamento NAT/firewall
  • Inoltra i server in caso di errore della comunicazione peer-to-peer

NAT Traversal, networking peer-to-peer e requisiti per la creazione di un'app server per il rilevamento e la segnalazione degli utenti non rientrano nell'ambito di questo articolo. È sufficiente dire che il protocollo STUN e la sua estensione, TURN, vengono utilizzati dal framework ICE per consentire a RTCPeerConnection di far fronte a NAT Traversal e ad altre variabili della rete.

ICE è un framework per la connessione tra colleghi, ad esempio due client di chat video. Inizialmente, ICE prova a connettere i peer direttamente con la latenza più bassa possibile tramite UDP. In questo processo, i server STUN hanno una sola attività: consentire a un peer dietro un NAT di trovare il suo indirizzo pubblico e la sua porta. Per ulteriori informazioni su STUN e TURN, consulta Creare i servizi di backend necessari per un'app WebRTC.

Ricerca candidati per la connessione
Ricerca di candidati per una connessione

Se UDP non riesce, ICE prova TCP. Se la connessione diretta non riesce, in particolare a causa dell'attraversamento di NAT enterprise e dei firewall, ICE utilizza un server TURN intermediario (relè). In altre parole, ICE utilizza prima STUN con UDP per connettere direttamente i peer e, in caso di errore, torna a un server di inoltro TURN. L'espressione finding candidate si riferisce al processo di ricerca delle interfacce e delle porte di rete.

Percorsi di dati WebRTC
Percorsi di dati WebRTC

L'ingegnere WebRTC Justin Uberti fornisce ulteriori informazioni su ICE, STUN e TURN nella presentazione WebRTC 2013 di Google I/O. Le diapositive della presentazione forniscono esempi di implementazioni di server TURN e STUN.

Un semplice client per le videochiamate

Un buon posto per provare WebRTC, completo di segnale e NAT/firewall attraversal utilizzando un server STUN, è la demo sulle videochiamate all'indirizzo appr.tc. Questa app usa adapter.js, uno shim per isolare le app dalle modifiche alle specifiche e dalle differenze nei prefissi.

Il codice è deliberatamente dettagliato nella registrazione. Controlla la console per comprendere l'ordine degli eventi. Di seguito è riportata una procedura dettagliata dettagliata del codice.

Topologie di rete

WebRTC, come attualmente implementato, supporta solo la comunicazione one-to-one, ma potrebbe essere utilizzato in scenari di rete più complessi, ad esempio con più peer che comunicano tra loro direttamente o tramite un'unità di controllo multipunto (MCU), un server in grado di gestire un numero elevato di partecipanti e di eseguire l'inoltro selettivo dello streaming, nonché il mix o la registrazione di audio e video.

Diagramma della topologia dell&#39;unità di controllo multipunto
Esempio di topologia di unità di controllo multipunto

Molte app WebRTC esistenti dimostrano solo la comunicazione tra browser web, ma i server gateway possono consentire a un'app WebRTC in esecuzione su un browser di interagire con i dispositivi, ad esempio con i telefoni (noti anche come PSTN) e con i sistemi VOIP. A maggio 2012, Doubango Telecom ha reso open source il client SIP sipml5 realizzato con WebRTC e WebSocket, che (tra altri possibili utilizzi) consente di effettuare videochiamate tra browser e app in esecuzione su iOS e Android. Alla conferenza Google I/O, Tethr e Tropo hanno dimostrato un framework per le comunicazioni di emergenza in una valigetta utilizzando una cella OpenBTS per consentire le comunicazioni tra feature phone e computer tramite WebRTC. Comunicazione telefonica senza un operatore.

Demo di Tethr/Tropo alla conferenza Google I/O 2012
Tethr/Tropo: comunicazioni disastrose in una valigetta

RTCDataChannel API<

Oltre ad audio e video, WebRTC supporta la comunicazione in tempo reale per altri tipi di dati.

L'API RTCDataChannel consente lo scambio peer-to-peer di dati arbitrari con bassa latenza e velocità effettiva elevata. Per demo di una sola pagina e per imparare a creare una semplice app per il trasferimento di file, consulta rispettivamente gli esempi di WebRTC e il codelab WebRTC.

Esistono molti casi d'uso potenziali per l'API, tra cui:

  • Giochi
  • App Remote Desktop
  • Chat di testo in tempo reale
  • Trasferimento file
  • Reti decentralizzate

L'API include diverse funzionalità con cui puoi sfruttare al meglio RTCPeerConnection e consentire una comunicazione peer-to-peer potente e flessibile:

  • Utilizzo della configurazione della sessione RTCPeerConnection
  • Più canali simultanei con prioritizzazione
  • semantica di consegna affidabile e inaffidabile
  • Sicurezza integrata (DTLS) e controllo della congestione
  • Possibilità di utilizzo con o senza audio o video

La sintassi è volutamente simile a WebSocket con un metodo send() e un evento 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 comunicazione avviene direttamente tra i browser, quindi RTCDataChannel può essere molto più veloce di WebSocket anche se è necessario un server di inoltro (TURN) in caso di buca per far fronte a firewall e NAT.

RTCDataChannel è disponibile in Chrome, Safari, Firefox, Opera e Samsung Internet. Il gioco Cube Slam utilizza l'API per comunicare lo stato del gioco. Gioca con gli amici o gioca con l'orso! L'innovativa piattaforma Sharefest consentiva la condivisione di file tramite RTCDataChannel e peerCDN dava un'idea di come WebRTC consentisse la distribuzione di contenuti peer-to-peer.

Per saperne di più su RTCDataChannel, dai un'occhiata alle specifiche del protocollo in bozza della IETF.

Sicurezza

Esistono diversi modi in cui un'app o un plug-in per la comunicazione in tempo reale potrebbero compromettere la sicurezza. Ad esempio:

  • I contenuti multimediali o i dati non criptati potrebbero essere intercettati tra browser o tra un browser e un server.
  • Un'app potrebbe registrare e distribuire video o audio a insaputa dell'utente.
  • Malware o virus potrebbero essere installati insieme a plug-in o app apparentemente innocui.

WebRTC ha diverse funzionalità per evitare questi problemi:

  • Le implementazioni WebRTC utilizzano protocolli sicuri come DTLS e SRTP.
  • La crittografia è obbligatoria per tutti i componenti WebRTC, inclusi i meccanismi di segnalazione.
  • WebRTC non è un plug-in. I suoi componenti vengono eseguiti nella sandbox del browser e non in un processo separato. I componenti non richiedono un'installazione separata e vengono aggiornati a ogni aggiornamento del browser.
  • L'accesso alla fotocamera e al microfono deve essere concesso in modo esplicito e, quando la fotocamera o il microfono sono in funzione, questo è chiaramente indicato dall'interfaccia utente.

Una discussione completa sulla sicurezza per lo streaming di contenuti multimediali non rientra nell'ambito di questo articolo. Per ulteriori informazioni, consulta la pagina Architettura di sicurezza WebRTC proposta proposta dall'IETF.

Conclusioni

Le API e gli standard di WebRTC possono democratizzare e decentralizzare gli strumenti per la creazione e la comunicazione di contenuti, tra cui telefonia, giochi, produzione video, produzione musicale e raccolta di notizie.

La tecnologia non diventa molto più dirompente di così.

Come ha spiegato il blogger Phil Edholm, "Potenzialmente, WebRTC e HTML5 potrebbero consentire la stessa trasformazione in tempo reale che il browser originale svolgeva per le informazioni".

Strumenti per sviluppatori

  • Le statistiche WebRTC per una sessione in corso sono disponibili all'indirizzo:
    • about://webrtc-internals in Chrome
    • opera://webrtc-internals in Opera
    • about:webrtc su Firefox
      Pagina chrome://webrtc-internals
      screenshot di chrome://webrtc-internals
  • Note interop cross-browser
  • adapter.js è uno shim JavaScript per WebRTC gestito da Google con l'aiuto della community WebRTC che astrae i prefissi dei fornitori, le differenze nei browser e le modifiche alle specifiche.
  • Per scoprire di più sui processi di segnalazione WebRTC, controlla l'output del log appr.tc nella console.
  • Se è eccessivo, potresti voler utilizzare un framework WebRTC o addirittura un servizio WebRTC completo.
  • Segnalazioni di bug e richieste di funzionalità sono sempre apprezzate:

Scopri di più

Standard e protocolli

Riepilogo assistenza WebRTC

API MediaStream e getUserMedia

  • Chrome desktop 18.0.1008 e versioni successive; Chrome per Android 29 e versioni successive
  • Opera 18 e versioni successive; Opera per Android 20 e versioni successive
  • Opera 12, Opera Mobile 12 (basato sul motore Presto)
  • Firefox 17 e versioni successive
  • Microsoft Edge 16 e successivi
  • Safari 11.2 e versioni successive su iOS e 11.1 e versioni successive su MacOS
  • UC 11.8 e successive su Android
  • Samsung Internet 4 e versioni successive

RTCPeerConnection API

  • Chrome per desktop 20 e versioni successive; Chrome per Android 29 e versioni successive (senza flag)
  • Opera 18 e versioni successive (attiva per impostazione predefinita); Opera per Android 20 e versioni successive (attiva per impostazione predefinita)
  • Firefox 22 e versioni successive (opzione attiva per impostazione predefinita)
  • Microsoft Edge 16 e successivi
  • Safari 11.2 e versioni successive su iOS e 11.1 e versioni successive su MacOS
  • Samsung Internet 4 e versioni successive

RTCDataChannel API

  • Versione sperimentale in Chrome 25, ma più stabile (e con l'interoperabilità di Firefox) in Chrome 26 e versioni successive; Chrome per Android 29 e versioni successive
  • Versione stabile (e con interoperabilità di Firefox) in Opera 18 e versioni successive; Opera per Android 20 e versioni successive
  • Firefox 22 e versioni successive (opzione attiva per impostazione predefinita)

Per informazioni più dettagliate sul supporto multipiattaforma per le API, ad esempio getUserMedia e RTCPeerConnection, consulta caniuse.com e Chrome Platform Status.

Le API native per RTCPeerConnection sono disponibili anche nella documentazione su webrtc.org.