WebRTC рд▓рд╛рдареА рдФрд░ рд╡реАрдбрд┐рдпреЛ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрд╡реЗрджрди рдХрд░рдирд╛

рдкреНрд░рд┐рдп рдкрд╛рдардХ, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЪрд▓реЛ рд╡реАрдбрд┐рдпреЛ рдХреЙрд▓ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред

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

рдареАрдХ рд╣реИ, рдЪрд▓реЛ рд╣рдорд╛рд░реЗ WebSocket рд╕рд░реНрд╡рд░ рдХреЛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рдиреЛрдб.рдЬреЗрдПрд╕ рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛; рд╕реЙрдХреЗрдЯ.рдЬреЗрдПрд╕
рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ рдФрд░ рд╡рд╣рд╛рдВ рд╕рд░реНрд╡рд░ рд╕реЙрдХреЗрдЯ рдХреЛрдб рд▓рд┐рдЦреЗрдВ:

const WebSocketServer = require('websocket').server;
const http = require('http');

const server = http.createServer(function(request, response) {
 //    ,    ,  http
});
server.listen(1337, function() {});

//   
const wsServer = new WebSocketServer({
  httpServer: server
});

wsServer.on('request', function(request) {
  let connection = request.accept(null, request.origin);
//   
})

рд╕реЙрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ index.html рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ рдФрд░ рд╡рд╣рд╛рдБ рдХреЛрдб рд▓рд┐рдЦреЗрдВ:

     <video autoplay muted height='300' width='300' style="position:fixed;bottom:0;left:0;z-index: 9999;" src="" id='my'>
          </video> <!--   --> 

          <video autoplay height='300' width='300' style="position:fixed;bottom:0;left:300px;z-index: 999999;" src="" id='not_my'>
          </video> <!--  -->

рдЕрдм рд╣рдорд╛рд░реЗ html рдлрд╝рд╛рдЗрд▓ рдореЗрдВ script.js рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ :

  let connection = new WebSocket('ws://127.0.0.1:1337');//   -
  connection.onopen = function(){
//  ,  -      
 }
connection.onmessage = function(message){
//        


}
connection.onerror = function (error) {
        console.error(error)
       //  ,   
      };

рддреЛ, рд╣рдорд╛рд░реЗ рд╡рд╛рд╕реНрдпрд╛ рдФрд░ рдкреЗрдЯреНрдпрд╛ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ


рдЫрд╡рд┐

рдпрд╣ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рд╣реИ, рдЬрд┐рд╕ рдкрд░ рд╡рд╛рд╕рд╛ рдФрд░ рдкреЗрдЯреНрдпрд╛ рдХреЗрд╡рд▓ JSON рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдХреЙрд▓ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ рдпрд╛ рдирд╣реАрдВред рдпрд╣реА рд╣реИ, рдЬрдм рд╣рдорд╛рд░реЗ рдкреГрд╖реНрда рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╕реЙрдХреЗрдЯ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ WebSocket рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓рдирд╛ рд╣реЛрдЧрд╛ред

  1. рд╣рдо рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ JSON рд╕рд░реНрд╡рд░ рд╕реЙрдХреЗрдЯ рдореЗрдВ рдПрдХ рд╣реЗрд▓рдореЗрдЯ рднреЗрдЬрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рд╣рдо рд╡рд╛рд╕рд╛ рдХреЗ рдЦрд╛рддреЗ рд╕реЗ рдкреЗрдЯреАрдПрдо рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ

    connection.send(JSON.stringify({
    //  
    }))
    
  2. рд╣рдореЗрдВ рд╕реЙрдХреЗрдЯ рд╕рд░реНрд╡рд░ рдкрд░ рдЗрд╕ JSON рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдХреЛ рд╕рдВрджреЗрд╢ рдШрдЯрдирд╛ рджреЗрддреЗ рд╣реИрдВ :

    connection.on('message',function(message){
    //   message    ,     JSON  JS
    let self = JSON.parse(message.utf8Data);
    })
    

рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдФрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рджреЛрдиреЛрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ, рд╣рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╡реАрдбрд┐рдпреЛ рд╕рдВрдЪрд╛рд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбреНрдпреВрд▓ js рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ - RTCPeerConnection


рдЫрд╡рд┐

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

рд╣рдо рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рднреЗрдЬрддреЗ рд╣реИрдВ


var pc = new RTCPeerConnection();
            
            var peerConnectionConfig = {
              iceServers: [
                  {
                      urls: 'stun:stun.l.google.com:19302'
                  }
                ]
            }
            pc.onicecandidate = function (event) {
              console.log('new ice candidate', event.candidate);

              if (event.candidate !== null) {
                connection.send(JSON.stringify({
                 // json  ice 
                }))
              }
          };

            navigator.getUserMedia = navigator.getUserMedia ||
                         navigator.webkitGetUserMedia ||
                         navigator.mozGetUserMedia;
                      

            navigator.getUserMedia({video: true,audio:true}, function(stream) {
              //      onaddstream  ,
              //    .
            var my_video = document.getElementById('my')
            my_video.srcObject = stream

              pc.onaddstream = e => {
                document.getElementById('not_my').srcObject = e.stream;
                console.log('not stream is added')
              }
              pc.addStream(stream);   
            
              pc.createOffer(function(offer) {
                pc.setLocalDescription(offer, function() {
                  //  offer  
                  }))
                }, e=> console.log(e));
              }, e=> console.log(e));
            },function (){console.warn("Error getting audio stream from getUserMedia")});

            //  
            function endCall() {
              var videos = document.getElementsByTagName("video");
              for (var i = 0; i < videos.length; i++) {
                videos[i].pause();
              }
            
              pc.close();
            }

            function error(err) {
              endCall();
            }
 

рд╣рдо рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрддреНрддрд░ рджреЗрддреЗ рд╣реИрдВ


var pc = new RTCPeerConnection();// connection
var peerConnectionConfig = { // ice server
              iceServers: [
                  {
                      urls: 'stun:stun.l.google.com:19302'
                  }
                ]
            }
            pc.onicecandidate = function (event) {
              console.log('new ice candidate', event.candidate);

              if (event.candidate !== null) {
                // ice 
              }
          };


            navigator.getUserMedia = navigator.getUserMedia ||
                         navigator.webkitGetUserMedia ||
                         navigator.mozGetUserMedia;

            navigator.getUserMedia({video: true,audio:true}, function(stream) {//          
              var my_video = document.getElementById('my')
              my_video.srcObject = stream
              console.log('stream is added while offering')

              pc.onaddstream = e => {
                console.log('not my stream is added while offering')
                document.getElementById('not_my').srcObject = e.stream;
                
              }
              pc.addStream(stream);
            
              pc.setRemoteDescription(new RTCSessionDescription(data.offer), function() {
                pc.createAnswer(function(answer) {
                  pc.setLocalDescription(answer, function() {
                    // 
                  }, e => console.log(e));
                }, e => console.log(e));
              }, e => console.log(e));
            },function (){console.warn("Error getting audio stream from getUserMedia")});
          }
        }

рд╣рдо рдЙрддреНрддрд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рддреЗ рд╣реИрдВ


pc.setRemoteDescription(new RTCSessionDescription(data.answer), function() { }, error);

рдФрд░ рдЖрдЦрд┐рд░реА рдЪреАрдЬ рдЬреЛ рд╣рдореЗрдВ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рд╡рд╣ рд╣реИ рдЖрдЗрд╕ рдкреИрдХреЗрдЯ


pc.addIceCandidate(new RTCIceCandidate(ice))// ice -  ,    

All Articles