WebRTC è un nuovo fronte nella lunga guerra per un web aperto e libero.
Brendan Eich, inventore di JavaScript
Comunicazione in tempo reale senza plug-in
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:
- Apri appr.tc nel browser.
- Fai clic su Partecipa per entrare in una chat room e consentire all'app di utilizzare la webcam.
- 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?
- Per una panoramica di WebRTC, guarda il seguente video di Google I/O o consulta queste slide:
- Se non hai utilizzato l'API
getUserMedia
, consulta Acquisire audio e video in HTML5 e simpl.info getUserMedia. - Per saperne di più sull'API
RTCPeerConnection
, vedi l'esempio seguente e 'simpl.info RTCPeerConnection'. - Per scoprire in che modo WebRTC utilizza i server per la segnalazione, il firewall e NAT Traversal, consulta il codice e i log della console su appr.tc.
- Non puoi aspettare e vuoi solo provare WebRTC ora? Prova alcune delle più di 20 demo che utilizzano le API JavaScript WebRTC.
- Hai problemi con il tuo computer e WebRTC? Visita lo strumento per la risoluzione dei problemi WebRTC.
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à:
- Nel browser, vai a Esempi di WebRTC
getUserMedia
. - Apri la console.
- 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.
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.
- Alice crea un oggetto
RTCPeerConnection
con un gestoreonicecandidate
, che viene eseguito quando i candidati di rete diventano disponibili. - Alice invia a Bob i dati dei candidati serializzati attraverso qualsiasi canale di segnalazione, ad esempio WebSocket o altri meccanismi.
- 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):
- Alice esegue il metodo
createOffer()
RTCPeerConnection
. Il risultato finale viene superato con la dicituraRTCSessionDescription
- la descrizione della sessione locale di Alice. - 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 cheRTCPeerConnection
non inizierà a raccogliere candidati finché non verrà chiamatosetLocalDescription()
. Questo codice è codificato nella bozza JSEP IETF. - Bob imposta la descrizione inviata da Alice come descrizione remota utilizzando
setRemoteDescription()
. - 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 callbackcreateAnswer()
viene superato unRTCSessionDescription
. Roberto la imposta come descrizione locale e la invia ad Alice. - Quando Alice ottiene la descrizione della sessione di Roberto, la imposta come descrizione remota con
setRemoteDescription
. - Ping!
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.
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.
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
- Crea un nuovo
RTCPeerConnection
e aggiungi lo stream dagetUserMedia()
: ```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) => { pc1.addTrack(traccia, localStream); });
- Crea un'offerta e impostala come descrizione locale per
pc1
e come descrizione remota perpc2
. 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
- Crea
pc2
e, quando viene aggiunto lo stream dapc1
, 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.
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.
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.
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.
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
- 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ù
- Sessione WebRTC di Justin Uberti al Google I/O 2012
- Alessandro B. Johnston e Daniel C. Burnett gestisce un libro WebRTC ora alla sua terza edizione in formato eBook e cartaceo all'indirizzo webrtcbook.com.
- webrtc.org ospita tutto ciò che riguarda WebRTC, tra cui demo, documentazione e discussioni.
- discuss-webrtc è un gruppo Google per le discussioni tecniche WebRTC.
- @webrtc
- La documentazione di Talk di Google Developers fornisce ulteriori informazioni su NAT Traversal, STUN, server di inoltro e raccolta di candidati.
- WebRTC su GitHub
- Stack Overflow è un ottimo strumento per cercare risposte e porre domande su WebRTC.
Standard e protocolli
- Bozza dell'editor W3C WebRTC
- Bozza dell'editor di W3C: Media Capture e stream (nota anche come
getUserMedia
) - Statuto del gruppo di lavoro dell'IETF
- Bozza di protocollo del canale dei canali dati WebRTC
- Bozza IETF JSEP
- IETF proposto uno standard per ICE
- Bozza Internet per il gruppo di lavoro RTCWEB della IETF: casi d'uso e requisiti relativi alla comunicazione in tempo reale sul web
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.