SL-A-SH Ответов: 0

Как добавить несколько одноранговых соединений - webrtc


Я пытаюсь сделать односторонний видеопоток для нескольких одноранговых узлов. Вызывающий абонент сможет отправить свое видео, а другие коллеги смогут получить его и не отправлять обратно никакого видео.

Только вызывающий может видеть себя, поэтому у него есть элемент localVideo и startButton, а не элемент remoteVideo, а для других-наоборот.

До сих пор только один одноранговый узел может просматривать видео, отправленное вызывающим абонентом. Что я здесь делаю не так?

Строки с комментариями в моем коде. Это то, как это должно быть сделано, чтобы добавить более 2 сверстников? Но тогда таким образом я получаю ошибку при добавлении iceCandidates

Что я уже пробовал:

Это мой код.:

let serverConfig = {
    iceServers: [
      {"urls": "stun:stun.l.google.com:19302"},
      {"urls":  [
        "turn:13.250.13.83:3478?transport=udp"
        ],
      "username": "YzYNCouZM1mhqhmseWk6",
      "credential": "YzYNCouZM1mhqhmseWk6"}
    ]
  };

  let pc1 = new window.RTCPeerConnection(serverConfig);
  let pc2 = new window.RTCPeerConnection(serverConfig);
 // let pc3 = new window.RTCPeerConnection(serverConfig);

  let mediaConstraints = {
    audio: true,
    video: {
      width: { min: 1024, ideal: 1280, max: 1920 },
      height: { min: 576, ideal: 720, max: 1080 },
    }
  };

  const offerOptions = {
    offerToReceiveAudio: 1,
    offerToReceiveVideo: 1
  };

  pc1.onicecandidate = (evt) => {
    if (!evt.candidate) return;
    onIceCandidate('pc1', evt);
  }

  pc2.onicecandidate = (evt) => {
    if (!evt.candidate) return;
    onIceCandidate('pc2', evt);
  }

  // pc3.onicecandidate = (evt) => {
  //   if (!evt.candidate) return;
  //   onIceCandidate('pc3', evt);
  // }


  function onIceCandidate(peer, evt) {
    if (evt.candidate) {
      socket.emit("candidate", JSON.stringify({
        "candidate": evt.candidate,
        "peer": peer
      }));
    }
  }

  pc2.ontrack = function (evt) {
    if (remoteView != null) {
      remoteView.srcObject = evt.streams[0];
    }
  };

  // pc3.ontrack = function (evt) {
  //   if (remoteView != null) {
  //     remoteView.srcObject = evt.streams[0];
  //   }
  // };

if (localView != null) {
      
    if (navigator.mediaDevices.getUserMedia) {
      navigator.mediaDevices.getUserMedia(mediaConstraints).then(function (stream) {
        localView.srcObject = stream;
        pc1.addStream(stream);
      }).catch(function (err) {
        console.log('An error occurred', err);
      }); 
    } else {
      navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
      navigator.getUserMedia(mediaConstraints, function (stream) {
        localView.srcObject = stream;
        pc1.addStream(stream);
      }, function (evt) {
        console.log('An error occurred');
      });
    }
  }

if (startButton) {
    startButton.addEventListener("click", function () {
      pc1.createOffer(offerOptions).then(function (desc) {
        pc1.setLocalDescription(new RTCSessionDescription(desc));
        socket.emit("sdp", JSON.stringify({
          "sdp": desc,
          "peer": 'pc1'
        }));
      });
    });
  }

  socket.on("candidate", function (msg) {

    const candidateMsg = JSON.parse(msg);
    if (candidateMsg.peer === 'pc1') {
      pc2.addIceCandidate(new RTCIceCandidate(candidateMsg.candidate));
      // pc3.addIceCandidate(new RTCIceCandidate(candidateMsg.candidate));
    } else {
      pc1.addIceCandidate(new RTCIceCandidate(candidateMsg.candidate));
    }
    
  });

  socket.on("sdp", function (msg) {
    const sdpMsg = JSON.parse(msg);
    var sessionDesc = new RTCSessionDescription(sdpMsg.sdp);
    if (sdpMsg.peer === 'pc1') {
      pc2.setRemoteDescription(sessionDesc);
      pc2.createAnswer(offerOptions).then(function (sdp) {
        pc2.setLocalDescription(new RTCSessionDescription(sdp));
        socket.emit("answer", JSON.stringify({"sdp": sdp}));
      });

      // pc3.setRemoteDescription(sessionDesc);
      // pc3.createAnswer(offerOptions).then(function (sdp) {
      //   pc3.setLocalDescription(new RTCSessionDescription(sdp));
      //   socket.emit("answer", JSON.stringify({"sdp": sdp}));
      // });
    }   
  });

  socket.on("answer", function (answer) {
    if (localView) {
      pc1.setRemoteDescription(new RTCSessionDescription(JSON.parse(answer).sdp));
    }
  });

0 Ответов