Una vez en uno de los artículos antiguos y ya abandonados, escribí sobre lo fácil y sin esfuerzo que es transmitir video desde un lienzo a través de websockets. En ese artículo, hablé brevemente sobre cómo capturar video de una cámara y sonido de un micrófono usando la API MediaStream , cómo codificar la transmisión recibida y enviarla a través de websockets al servidor. Sin embargo, en realidad, no lo hacen, para las transmisiones usan un software especial que necesita ser instalado y configurado: de improviso puede ser Open Broadcast Software , o usan WebRTC, que funciona de inmediato, es decir, no requiere la instalación de ningún complemento como un reproductor flash, que ya en diciembre se eliminará del navegador Chromium.
Hoy hablaremos de WebRTC.
La comunicación web en tiempo real (WebRTC) no es un protocolo, es una colección completa de estándares, protocolos y API de JavaScript que, en conjunto, brindan comunicación de audio y video de igual a igual en tiempo real, y también se pueden usar para transferir cualquier dato binario. ... Por lo general, los navegadores actúan como pares, pero también puede ser una aplicación móvil, por ejemplo. Para organizar la comunicación p2p entre clientes, el navegador necesita soporte para varios tipos de codificación de video y audio, soporte para muchos protocolos de red, asegurando la interacción del hardware con el navegador (a través de capas de sistema operativo): cámaras web, tarjetas de sonido. Todo este revoltijo de tecnologías está oculto detrás de una abstracción API de JavaScript para la conveniencia del desarrollador.
Todo se reduce a tres API:
MediaStream API - , . / ""
RTCPeerConnection - (p2p)
"" . , : , , , . , -. , ( , ), . . 1:
, . . 2020 . , MediaStream API, . IE .
: , , , "" Media Stream <video> html. canvas , WebGL CSS3, , canvas , ( bigo live, twitch ). , , :
https://jeeliz.com/ - realtime CV Javascript. js- canvas: , , (, ) . , .
Canvas captureStream API - API canvas. Chrome, Opera Firefox
RTCPeerConnection
, ? RTCPeerConnection. , RTCPeerConnection:
const peerConnection = new RTCPeerConnection({
iceServers: [{
urls: 'stun:stun.l.google.com:19302'
}]
});
iceServers - , , NAT'. : ip , NAT ? ICE , , ICE WebRTC, .
Usermedia :
navigator.mediaDevices.getUserMedia({ video: true, audio: true }).then(stream => {
// Usermedia-,
const tracks = stream.getTracks();
for (const track of tracks) {
// peerConnection
peerConnection.addTrack(track);
}
}).catch(console.error);
peerConnection onnegotiationneeded, offer ( SDP - Session Description Protocol) peerConnection setLocalDescription. SDP - offer answer - .
LocalDescription peerConnection, "" ice-, NAT. onicegatheringstatechange. onicegatheringstatechange webrtc-signaling- stream Session Description :
peerConnection.oniceconnectionstatechange = (event) => {
console.log('Connection state: ', peerConnection.iceConnectionState);
if (peerConnection.iceConnectionState === 'connected') {
// Start broadcast
setBroadcasting(true);
setBroadcastingBtnActive(true);
}
};
// , peerConnection
peerConnection.onnegotiationneeded = (event) => {
// SDP offer
peerConnection.createOffer().
then((offer) => peerConnection.setLocalDescription(offer)).
catch(console.error);
};
// , ICE
peerConnection.onicegatheringstatechange = (ev) => {
let connection = ev.target;
// Now we can activate broadcast button
if (connection.iceGatheringState === 'complete') {
let delay = 50;
let tries = 0;
let maxTries = 3;
let timerId = setTimeout(function allowStreaming() {
if (isOnline) {
setBroadcastingBtnActive(true);
return;
}
if (tries < maxTries) {
tries += 1;
delay *= 2;
timerId = setTimeout(allowStreaming, delay);
} else {
// TODO: show user notification
console.error("Can't connect to server");
alert("Can't connect to server");
}
}, delay);
}
};
webrtc-signaling- - , session description , websocket xhr- . : session description .
Session descriptions , , ontrack peerConnection, , <video> . .
:
https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection - RTCPeerConnection
https://github.com/pion/webrtc - WebRTC go
https://webrtcforthecurious.com/ - pion
https://hpbn.co/ - High Perfomance Browser Networking. web-. WebRTC. (2013), .
pion, HLS ffmpeg .
: react pion twitch ( ).