PeerJS рдкрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╡реАрдбрд┐рдпреЛ рдХреЙрд▓ред рдЬрд▓реНрджреА рд╢реБрд░реВ рдХрд░реЛ

рдореИрдВ рд╣рдмреНрдмрд░ рдХреЗ рд╕рднреА рдкрд╛рдардХреЛрдВ рдХреЛ рд╢реБрднрдХрд╛рдордирд╛рдПрдВ рджреЗрддрд╛ рд╣реВрдВред рдЗрд╕ рд╡рд░реНрд╖, рдореЗрд░реЗ рдкрд╛рд╕ рд╢рд┐рдХреНрд╖рдХ рдХреЗ рдФрд░ рдЫрд╛рддреНрд░ рдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рд╕реАрдзреЗ рд╡реАрдбрд┐рдпреЛ рд╕рдВрдЪрд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлреЛрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкреЛрд░реНрдЯрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реАрдбрд┐рдпреЛ рд╕рдВрдЪрд╛рд░ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдерд╛ред рдРрд╕реЗ рд╢реБрд░реБрдЖрддреА рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рдерд╛ред рдПрдХ рдЫреЛрдЯреА рдЦреЛрдЬ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ 2 рддрд░реАрдХреЗ рд╣реИрдВ: рдлреНрд▓реИрд╢ рдФрд░ рд╡реЗрдмрдЖрд░рдЯреАрд╕реА ред WebRTC рдЕрдкрдиреЗ рд╢реБрджреНрдз рд░реВрдк рдореЗрдВ рдЬрдЯрд┐рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реАрдбрд┐рдпреЛ рд╕рдВрдЪрд╛рд░ рдХрд╛ рдХрд╛рд░реНрдп рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореИрдВ PeerJS рдореЗрдВ рдЖрдпрд╛, рдЬреЛ WebRTC рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдЬрд▓реНрджреА рд╕реЗ рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдбрд╛рдпрд▓рд░ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, https рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдг рдкреГрд╖реНрда рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА (рдЪреВрдВрдХрд┐ рдкреЗрдЬ рдХреИрдорд░рд╛ рдФрд░ рдорд╛рдЗрдХреНрд░реЛрдлрд╝реЛрди рддрдХ рдкрд╣реБрдВрдЪ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдЧрд╛, рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдмрд┐рдирд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдмрд╕ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрдЧрд╛)

рд╢реБрд░реВ рд▓реЗрдЖрдЙрдЯ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Peer</title> <script src="https://unpkg.com/peerjs@1.0.0/dist/peerjs.min.js"></script> </head> <body> <p><h3> ID: </h3><span id=myid ></span></p> <input id=otherPeerId type=text placeholder="otherPeerId" > <button onclick="callToNode(document.getElementById('otherPeerId').value)"></button> <br> <video id=myVideo muted="muted" width="400px" height="auto" ></video> <div id=callinfo ></div> <video id=remVideo width="400px" height="auto" ></video> </body> 

рд╣реЗрдб рд╕реЗрдХреНрд╢рди рдореЗрдВ, рд╣рдо PeerJS рдХреЛ рд░рд┐рдореЛрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рдФрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИред

рдЗрдирдкреБрдЯ рдЖрдИрдбреА = otherPeerId - рдЬрд┐рд╕реЗ рд╣рдо рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ, рдЙрд╕рдХреА рджрд╛рд╡рдд рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЖрдк рдЗрд╕реЗ рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╛ рдлрд╝реЛрди рдирдВрдмрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ)ред

рджреЛ рд╡реАрдбрд┐рдпреЛ рдЯреИрдЧ рдХреНрд░рдорд╢рдГ рдЖрдкрдХреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡реАрдбрд┐рдпреЛ рдФрд░ рд╡рд╛рд░реНрддрд╛рдХрд╛рд░ рдХреЗ рд╡реАрдбрд┐рдпреЛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВред

рдЕрдм WebRTC рддрдХрдиреАрдХ рдФрд░ рдХреЙрд▓ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ред WebRTC, рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдмрд┐рдирд╛ рд╕рд░реНрд╡рд░ рдХреА рднрд╛рдЧреАрджрд╛рд░реА рдХреЗ рд╕реАрдзреЗ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ 2 рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдвреВрдВрдврдиреЗ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ WebRTC рдХреЛ рдПрдХ рд╕рд┐рдЧреНрдирд▓ рд╕рд░реНрд╡рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЕрд░реНрдерд╛рддреН рдПрдХ рд╕рд░реНрд╡рд░ рдЬреЛ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рджреВрд╕рд░реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ, рдФрд░ рд╡реЗрдмрдЖрд░рдЯреАрд╕реА рдореЗрдВ рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рд░реНрд╡рд░ рдХреЛ рд╕реНрд╡рдпрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкреАрдпрд░рдЬреЗрдПрд╕ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд┐рдЧреНрдирд▓ рд╕рд░реНрд╡рд░ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд╛рд░реНрддрд╛рдХрд╛рд░ рдХреЛ PeerID рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, PeerJS рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдЕрджреНрд╡рд┐рддреАрдп рд╕реВрдЪрдХрд╛рдВрдХред рдПрдХ рдХрд╛рдо рдХреЗ рдорд╕реМрджреЗ рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛:

  1. рдкреЗрдЬ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рдкреАрдпрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  2. рдЗрд╕рдХрд╛ рд╕рд╣рдХрд░реНрдореА mysql рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ
  3. рдЬрдм рдХреЙрд▓ рдмрдЯрди рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрдВрдЯрд░рд▓реЙрдХрд░ рдХрд╛ рд╕рд╣рдХрд░реНрдореА рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рд╡рд░реНрддрдорд╛рди рдкрд░реАрдХреНрд╖рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЕрдиреНрдпрдкрд┐рдпрд░рдЖрдИрдЖрд░рдбреА рдкрд╛рда рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╡рд╛рд░реНрддрд╛рдХрд╛рд░ рдХреЗ рд╕рд╣рдХрд░реНрдореА рдХреЛ рджрд░реНрдЬ рдХрд░реЗрдВрдЧреЗ

рддреЛ, рдЪрд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

1. рдореБрдЦреНрдп рдкреАрдпрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ

 var peer = new Peer(); 

2. рджрд╛рд╡рдд рдХреЗ рдЙрджреНрдШрд╛рдЯрди рдкрд░, рд╣рдо рдкреНрд░рддрд┐рд╖реНрдард┐рдд рд╕рд╣рдХрд░реНрдореА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рднрд╛рдЧреАрджрд╛рд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рд╡рд╣ рд╣рдорд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░ рд╕рдХреЗ

 peer.on('open', function(peerID) { document.getElementById('myid').innerHTML=peerID; }); 

3. рдХреЙрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЙрд▓ рдЗрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХреЛ рд▓рдЯрдХрд╛рддреЗ рд╣реИрдВ

 var peercall; peer.on('call', function(call) { // Answer the call, providing our mediaStream peercall=call; document.getElementById('callinfo').innerHTML="  <button onclick='callanswer()' ></button><button onclick='callcancel()' ></button>"; }); 

рдПрдХ рдЖрдиреЗ рд╡рд╛рд▓реА рдХреЙрд▓ рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдПрдХ рдХреЙрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдорд┐рд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо peercall рдЧреНрд▓реЛрдмрд▓ рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ рд╕реЗрд╡ рдХрд░рддреЗ рд╣реИрдВред рд╕рд╛рде рд╣реА рд╕реВрдЪрдирд╛ рдореЗрдВ рдПрдХ рдЗрдирдХрдорд┐рдВрдЧ рдХреЙрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рд╣реЛрддрд╛ рд╣реИ рдФрд░ 2 рдмрдЯрди рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ: рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ рдФрд░ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ

4. рд╣рдо рдПрдХреНрд╕реЗрдкреНрдЯ рдмрдЯрди рдХреЗ рд▓рд┐рдП рдПрдХ рдлрдВрдХреНрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ

 function callanswer() { navigator.mediaDevices.getUserMedia ({ audio: true, video: true }).then(function(mediaStream) { var video = document.getElementById('myVideo'); peercall.answer(mediaStream); //         //peercall.on ('close', onCallClose); //  -  video.srcObject = mediaStream; //      (  ) document.getElementById('callinfo').innerHTML=" ... <button onclick='callclose()' > </button>"; //,   ,     video.onloadedmetadata = function(e) {// ,    video.play(); }; setTimeout(function() { //        document.getElementById('remVideo').srcObject = peercall.remoteStream; document.getElementById('remVideo').onloadedmetadata= function(e) { //       document.getElementById('remVideo').play(); }; },1500); }).catch(function(err) { console.log(err.name + ": " + err.message); }); } 

navigator.mediaDevices.getUserMedia - рдХреИрдорд░рд╛ рдФрд░ рдорд╛рдЗрдХреНрд░реЛрдлрд╝реЛрди рддрдХ рдкрд╣реБрдВрдЪ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рджрд┐рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдбреЗрдЯрд╛ рдореЗрдВ {рдСрдбрд┐рдпреЛ: рдЯреНрд░реВ, рд╡реАрдбрд┐рдпреЛ: рдЯреНрд░реВ}, рдЖрдк рддрджрдиреБрд╕рд╛рд░ рдХреЗрд╡рд▓ рдХреИрдорд░реЗ рдпрд╛ рдХреЗрд╡рд▓ рдорд╛рдЗрдХреНрд░реЛрдлреЛрди рддрдХ рдкрд╣реБрдВрдЪ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЧреЗ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рд╕реАрдзреЗ рдХреЛрдб рдореЗрдВ рдЬреБрдбрд╝ рдЧрдИрдВред

рд╕реЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЛ рдЖрдиреБрднрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛: рд╕рд╛рдереА рдХрд╛ рд╡реАрдбрд┐рдпреЛ рдЪрд▓рдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реБрдЖ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдиреЗ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ред

5. рдХреЙрд▓ рдмрдЯрди рджреНрд╡рд╛рд░рд╛ рдбрд╛рдпрд▓ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп

 function callToNode(peerId) { // navigator.mediaDevices.getUserMedia ({ audio: true, video: true }).then(function(mediaStream) { var video = document.getElementById('myVideo'); peercall = peer.call(peerId,mediaStream); //,  peerId-    mediaStream peercall.on('stream', function (stream) { // ,   setTimeout(function() { document.getElementById('remVideo').srcObject = peercall.remoteStream; document.getElementById('remVideo').onloadedmetadata= function(e) { document.getElementById('remVideo').play(); }; },1500); }); // peercall.on('close', onCallClose); video.srcObject = mediaStream; video.onloadedmetadata = function(e) { video.play(); }; }).catch(function(err) { console.log(err.name + ": " + err.message); }); } 

рдкрд┐рдЫрд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ, рд╣рдо рдЖрдкрдХреЗ рдореАрдбрд┐рдпрд╛ рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВред рдкреАрдпрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХреЙрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЬреЛ рдХреЙрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рдореЗрдВ рд▓реМрдЯрд╛рдПрдЧрд╛, рдЙрд╕реЗ Peercall рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВред рд╣рдо рд╕реНрдЯреНрд░реАрдо рдЗрд╡реЗрдВрдЯ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдХреНрдпрд╛ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рдФрд░ рдЖрдиреЗ рд╡рд╛рд▓реА рд╕реНрдЯреНрд░реАрдо рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рд╡реАрдбрд┐рдпреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛

рд╡рд╣ рд╕рдм рд╣реИ, рд▓реЗрдХрд┐рди ...

рдпрджрд┐ рджреЛрдиреЛрдВ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреАрдЫреЗ рд╣реИрдВ, рддреЛ рдирд╛рде рдХреЙрд▓ рд╕реЗ рдирд╣реАрдВ рдЧреБрдЬрд░реЗрдЧрд╛ред (рдХреНрдпреЛрдВ? рдпрд╣рд╛рдБ рдкрдврд╝реЗрдВ habr.com/en/company/yandex/blog/419951 )
рдЗрд╕ рдмрд╛рдзрд╛ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╣рдХрд░реНрдореА рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп TURN рд╕рд░реНрд╡рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдпрд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛рдВ рдХрд╛ рдкреНрд░рд╢реНрди рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдирд╣реАрдВ рдерд╛ред рд╣рдореЗрдВ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдЙрдард╛рдирд╛ рдерд╛: Ubuntu 16.04 рдкрд░ VPSред рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдкрдирд╛ред
 apt install coturn 
)

рддрдм рджрд╛рд╡рдд рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:

 var callOptions={'iceServers': [ {url: 'stun:95.xxx.xx.x9:3479', username: "user", credential: "xxxxxxxxxx"}, { url: "turn:95.xxx.xx.x9:3478", username: "user", credential: "xxxxxxxx"}] }; peer= new Peer({config: callOptions}); 

рдЕрдВрдд рдореЗрдВ, рдкреВрд░рд╛ рдХреЛрдб:

 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Peer</title> <script src="https://unpkg.com/peerjs@1.0.0/dist/peerjs.min.js"></script> </head> <body> <p><h3> ID: </h3><span id=myid ></span></p> <input id=otherPeerId type=text placeholder="otherPeerId" > <button onclick="callToNode(document.getElementById('otherPeerId').value)"></button> <br> <video id=myVideo muted="muted" width="400px" height="auto" ></video> <div id=callinfo ></div> <video id=remVideo width="400px" height="auto" ></video> <script> var callOptions={'iceServers': [ {url: 'stun:95.xxx.xx.x9:3479', username: "user", credential: "xxxxxxxxxx"}, { url: "turn:95.xxx.xx.x9:3478", username: "user", credential: "xxxxxxxx"}] }; peer= new Peer({config: callOptions}); peer.on('open', function(peerID) { document.getElementById('myid').innerHTML=peerID; }); var peercall; peer.on('call', function(call) { // Answer the call, providing our mediaStream peercall=call; document.getElementById('callinfo').innerHTML="  <button onclick='callanswer()' ></button><button onclick='callcancel()' ></button>"; }); function callanswer() { navigator.mediaDevices.getUserMedia ({ audio: true, video: true }).then(function(mediaStream) { var video = document.getElementById('myVideo'); peercall.answer(mediaStream); //         //peercall.on ('close', onCallClose); //  -  video.srcObject = mediaStream; //      (  ) document.getElementById('callinfo').innerHTML=" ... <button onclick='callclose()' > </button>"; //,   ,     video.onloadedmetadata = function(e) {// ,    video.play(); }; setTimeout(function() { //        document.getElementById('remVideo').srcObject = peercall.remoteStream; document.getElementById('remVideo').onloadedmetadata= function(e) { //       document.getElementById('remVideo').play(); }; },1500); }).catch(function(err) { console.log(err.name + ": " + err.message); }); } function callToNode(peerId) { // navigator.mediaDevices.getUserMedia ({ audio: true, video: true }).then(function(mediaStream) { var video = document.getElementById('myVideo'); peercall = peer.call(peerId,mediaStream); peercall.on('stream', function (stream) { // ,   setTimeout(function() { document.getElementById('remVideo').srcObject = peercall.remoteStream; document.getElementById('remVideo').onloadedmetadata= function(e) { document.getElementById('remVideo').play(); }; },1500); }); // peercall.on('close', onCallClose); video.srcObject = mediaStream; video.onloadedmetadata = function(e) { video.play(); }; }).catch(function(err) { console.log(err.name + ": " + err.message); }); } </script> </body> 

Chrome, Opera, Firefox рдореЗрдВ Windows7 рдФрд░ Ubuntu 18.04 рдХреЗ рддрд╣рдд рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред Chrome Android рдФрд░ MacOS рдкрд░ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ iPhone рдФрд░ iPad рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi468705/


All Articles