Проблема с конфигурацией ответа WebRT C RTCIceCandidate - PullRequest
0 голосов
/ 15 апреля 2020

В настоящее время я выясняю, как настроить webRT C для моего тестового приложения. Я могу заставить работать пользовательскую медиа-API часть webrt c, но конфигурация ICE вызывает у меня проблемы. Я попытался посмотреть здесь на stackoverflow, и кажется, что никто другой не получил подобную ошибку, возвращенную от клиента. Я тестирую его на живом сервере, где первоначальное общение происходит через WSS. Я пропустил разметку и конфигурацию websocket, потому что это не имеет значения.

   let myPeerConnection;


    /* step 1: get users media stream inputs */
    function getUserMediaClient(type = ""){

    let mediaConstraints = {video:true, audio:true};
      createPeerConnection();
      navigator.mediaDevices.getUserMedia(mediaConstraints)
      .then(function(localStream) {
        document.getElementById("myVideo").srcObject = localStream;
        document.getElementById("myVideo").onloadedmetadata = function(){
          document.getElementById("myVideo").play();
        }
        localStream.getTracks().forEach(track => myPeerConnection.addTrack(track, localStream));
      })
      .catch(handleGetUserMediaError);
    }
    getUserMediaClient();


    /* 
      preparation for step 2: 
      get users Peer connection information when the user calls createPeerCandidate() 
      to send the offer or handleVideoOfferMsg() to send the answer 
    */

    function createPeerConnection(){

        myPeerConnection = new RTCPeerConnection(
                                            {
                                                iceServers: [


                                                        {
                                                          urls: [
                                                                  'stun:stun.l.google.com:19302',
                                                                  'stun:stun1.l.google.com:19302'
                                                                ]
                                                        }/*,
                                                        {
                                                          urls: 'turn:192.158.29.39:3478?transport=tcp',
                                                          credential: 'JZEOEt2V3Qb0y27GRntt2u2PAYA=',
                                                          username: '28224511:1379330808'
                                                        }*/

                                                ]
                                            }
                                        );

        return myPeerConnection;
    }

    /*
      step 2:
      send information to opposite part through websocket with SDP info 
    */

    function handleNegotiationNeededEvent(myUsername = "", targetUsername = "") {
      myPeerConnection.createOffer().then(function(offer) {
        return myPeerConnection.setLocalDescription(offer);
      })
      .then(function() {
        sendToServer({
          name: myUsername,
          target: targetUsername,
          type: "video-offer",
          sdp: myPeerConnection.localDescription
        });
      })
      .catch(reportError);
    }


    /* 
      step 3:
      "if" answering user accepts - load tracks to stream and respond with SDP config info
    */
    function handleVideoOfferMsg(msg) {

    let mediaConstraints = {video:true, audio:true};
      var localStream = null;

      targetUsername = msg.name;
      let myUsername = document.getElementById("user1").value;
      createPeerConnection();

      var desc = new RTCSessionDescription(msg.sdp);

      myPeerConnection.setRemoteDescription(desc).then(function () {
        return navigator.mediaDevices.getUserMedia(mediaConstraints);
      })
      .then(function(stream) {
        localStream = stream;
        document.getElementById("myVideo").srcObject = localStream;

        localStream.getTracks().forEach(track => myPeerConnection.addTrack(track, localStream));
      })
      .then(function() {
        return myPeerConnection.createAnswer();
      })
      .then(function(answer) {
        return myPeerConnection.setLocalDescription(answer);
      })
      .then(function() {
        var msg = {
          name: myUsername,
          target: targetUsername,
          type: "video-answer",
          sdp: myPeerConnection.localDescription
        };

        sendToServer(msg);
      })
      .catch(handleGetUserMediaError);
    }



    /*
      step 4: 
      when both users have exchanged information - the ice processing can begin 
      the user that initially sent the request can now reply with a communication method
    */
    var candidateData = null;
    function handleICECandidateEvent(event) {
      if ((event.sdp)||(event.candidate)){

        if (event.candidate){
          candidateData = event.candidate;
        } else if (event.sdp) {
          candidateData = event.sdp;
        }

        sendToServer({
          type: "new-ice-candidate",
          target: event.target,
          candidate: candidateData
        });
      }
    }

    ///////////////////// non functional part under ////////////////////////////



    function handleNewICECandidateMsg(msg) {
      candidateData = msg.candidate;

      myPeerConnection.addIceCandidate(new RTCIceCandidate({sdpMLineIndex:1,candidate: candidateData})).catch(e => {
        console.log("Failure during addIceCandidate(): " + JSON.stringify(e));
      });



      ////////////// non functional part above ///////////////



  console.log("MSG: " + JSON.stringify(msg));

}
function handleGetUserMediaError(e){
 //removed for simplicity
}
//wss connection estabilshment from client removed
wss.onmessage = function(e){ 

    if (type == "video-offer" && document.getElementById("user1").value == target){
      // create counteroffer
      handleVideoOfferMsg(data);
    } else if (type == "video-answer"){
      handleICECandidateEvent(data);
    } else if (type == "new-ice-candidate"){
      handleNewICECandidateMsg(data);
    }
    }

Большая часть кода взята из учебника MDN здесь: https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Signaling_and_video_calling

Проблема внутри функции handleNewICECandidateMsg () (или я так думаю). Потому что, когда я ввожу sdpMLineIndex и sdpMid, я получаю пустую строку json, и когда я оставляю ее только с информацией о sdp кандидатов, она выдает ошибку типа, сказав, что ей нужен либо sdpMid, либо sdpMLineIndex.

Любые мысли, ссылки. Все ценится!

...