Ngandlela thize phakathi
Namuhla sizokhuluma ngeWebRTC.
I-Web Real-Time Communication (WebRTC) ayiyona iphrothokholi eyodwa, iyiqoqo eliphelele lamazinga, izivumelwano kanye nama-JavaScript APIs ahlinzeka ngokuxhumana komsindo wevidiyo kontanga kuya kontanga ngesikhathi sangempela, futhi angasetshenziswa ukudlulisa noma yikuphi. idatha kanambambili . Ngokuvamile iziphequluli zisebenza njengontanga, kodwa futhi kungaba uhlelo lokusebenza lweselula, isibonelo. Ukuze uhlele ukuxhumana kwe-p2p phakathi kwamaklayenti, ukusekelwa kwesiphequluli sezinhlobo ezahlukene zombhalo wekhodi wevidiyo nomsindo kuyadingeka, ukusekelwa kwezinqubo ezihlukahlukene zenethiwekhi, ukuqinisekisa ukusebenzisana kwehadiwe nesiphequluli (ngezendlalelo ze-OS): amakhamera ewebhu, amakhadi omsindo. Yonke le hodgepodge yobuchwepheshe ifihliwe ngemuva kwe-JavaScript API abstraction ukuze kube lula kunjiniyela.
Konke kubilisa kuma-API amathathu:
-
I-MediaStream API β yahlakazwa okokugcina, namuhla ngizobhala okwengeziwe ngaye. Isebenzela ukwamukela ukusakazwa kwevidiyo / okulalelwayo kusuka kuhadiwe -
RTCPeerConnection - inikeza ukuxhumana phakathi kwamaklayenti amabili (p2p) -
I-RTCDataChannel - Isebenzela ukudlulisa idatha phakathi kwamaklayenti amabili
Ilungiselela ukusakazwa komsindo nevidiyo ukuze kudluliselwe
Konke kuqala "ngokuthwebula" ikhamera yewebhu kanye nokusakaza kwemidiya yemakrofoni. Impela, ukusakaza okuluhlaza akufanelekile ukuhlela i-teleconference, ukusakaza ngakunye kudinga ukucutshungulwa: ukuthuthukisa ikhwalithi, ukuvumelanisa umsindo nevidiyo, beka izimpawu zokuvumelanisa ekusakazeni kwevidiyo, futhi uqinisekise i-bitrate ehambisana nomkhawulokudonsa oshintsha njalo wesiteshi. . Isiphequluli sinakekela konke lokhu, umthuthukisi akudingeki akhathazeke ngokuhlinzeka ngombhalo wekhodi wokusakazwa kwemidiya. Ngaphakathi kwesiphequluli sesimanje, sekuvele kunezendlalelo zesoftware zokuthwebula, ukuthuthukisa ikhwalithi (susa i-echo nomsindo emsindweni, thuthukisa isithombe), ividiyo kanye nombhalo wekhodi womsindo. Isikimu sesendlalelo siboniswa ku fig. 1:
Ilayisi. 1. Izendlalelo zokucutshungulwa komsindo nevidiyo esipheqululini
Konke ukucubungula kwenzeka ngqo esipheqululini ngokwaso, akukho okwengeziwe. awekho ama-plugin adingekayo. Kodwa-ke, izinto azikakabi kuhle kangako ngo-2020. Kuneziphequluli ezingakasekeli ngokugcwele
Ungenza izinto ezithakazelisa kakhulu ngemifudlana eyamukelwe: ungahlanganisa, uguqule ukulungiswa kwevidiyo, ulawule ikhwalithi yomsindo, ungathatha futhi "uxhume" ukusakaza kweMedia ukuze maka futhi uzibheke ekhasini le-html. Noma ungadweba umfudlana kukhanvasi, bese usetha i-WebGL noma i-CSS3, futhi usebenzise izihlungi ezihlukahlukene kuvidiyo, uthwebule ividiyo ecutshunguliwe kukhanvasi bese uyithumela ngenethiwekhi kuseva, udlulise ikhodi futhi ushicilele kuwo wonke umuntu (sawubona bigo bukhoma, twitch nabanye). Lapha ngeke ngihlaziye ukuthi izinto ezinjalo zenziwa kanjani, ngizonikeza izibonelo ezimbalwa ezitholakala kuwebhu:
RTCPeerConnection
Ngakho-ke sifike ephuzwini, kepha siyidlulisela kanjani ividiyo komunye umsebenzisi? Iza phambili
const peerConnection = new RTCPeerConnection({
iceServers: [{
urls: 'stun:stun.l.google.com:19302'
}]
});
Sicacisa ama-iceServer njengenye yezinketho - lena iseva esiza ekuhlinzekeni ukuxhumana phakathi kweziphequluli ezimbili ngemuva kwe-NAT'om. Okungukuthi, inkinga ixazululwa lapha: indlela yokuthola i-ip ye-interlocutor uma engemuva kwe-NAT yomhlinzeki wakhe? Iphrothokholi ye-ICE iyasiza, empeleni, i-ICE ayisebenzi ku-WebRTC nhlobo, kodwa okwengeziwe ngalokho kamuva.
Ngaphambilini, sithole ukusakazwa kwe-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);
Okulandelayo, umcimbi odinga ukuxoxisana uvutha ku-peerConnection, kusibambi okufanele sakhe isipho (ngokwe-SDP - Iphrothokholi Yencazelo Yeseshini) futhi sinikeze i-peerConnection ngendlela ye-setLocalDescription. Mayelana ne-SDP - ukuthi iyini futhi mayelana namafomethi okunikezwayo nezimpendulo - sizokhuluma ngokuqhubekayo.
Ngemva kokwabela i-LocalDescription peerConnection, isiphequluli "sihlanganisa" amakhandidethi eqhwa, okungukuthi, sithola izindlela ezihlukahlukene zokuxhumana nge-NAT. Umcimbi we-onicegatheringstatechange uyasha. Kusibambi se-Onicegatheringstatechange, sivumela uxhumo ekusakazweni kweseva ye-webrtc-signaling-kushintshanisa Incazelo Yeseshini phakathi kontanga:
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);
}
};
Iseva ye-webrtc-signaling iyiseva edingekayo ukushintshanisa incazelo yeseshini phakathi kontanga ababili, ingaba i-websocket elula kakhulu noma iseva ye-xhr kunoma iyiphi i-PL. Umsebenzi wayo ulula: ukwamukela incazelo yeseshini kusuka kontanga eyodwa bese uyidlulisela komunye.
Ngemuva kokushintshaniswa kwezincazelo zeSeshini, izinhlangothi zombili zilungele ukusakaza nokwamukela ukusakazwa kwevidiyo, ohlangothini oluthola ukusakazwa kwevidiyo, umcimbi we-ontrack uculwa ku-peerConnection, kusiphathi lapho, amathrekhi atholiwe angabelwa futhi ubheke interlocutor oyikhonzile. Ithiyori eyengeziwe nemininingwane.
Izixhumanisi nemibhalo:
Engxenyeni elandelayo, ngifuna ukunikeza ingxenye encane yethiyori kanye nokusebenza ukuhlaziya ukwamukela nokucubungula ukusakazwa kwevidiyo kuseva kusetshenziswa i-pion, i-transcoding ku-HLS nge-ffmpeg ukuze isakazwe kubabukeli esipheqululini.
Kwabangenasineke:
Source: www.habr.com