Привязать медиапоток к элементу с описанием неправильного носителя JsSIP

#javascript #webrtc #jssip

#javascript #webrtc #jssip

Вопрос:

Я пытался создать простой интерфейс для видеозвонков с помощью JsSIP , пока мне удалось инициализировать только видеовызов, и приемник получает мои аудио- и видеопотоки, но когда я пытаюсь добавить поток (локальный или удаленный) к <video> элементу на моей странице, я получаю ошибку "Bad Media Description" .

Мой код выглядит примерно так:

     const address = "my.address.com";
    const pass = "pass";
    const callee = "id2";
    const user = "id1";
    const sockets = [];
    const localStream = new MediaStream();
    const config = {
      sockets: sockets,
      uri: `sip:${user}@${address}`,
      password: pass
    };
        const agent = new JsSIP.UA(config);
    const servers = {
      iceServers: [
        {urls:"stun:stun.l.google.com:19302"}
      ]
    };
    const options = {
      pcConfig: servers,
      mediaConstraints: {
        audio: true,
        video: true
      }
    };
    
    document.getElementById("localVideo").srcObject = localStream;
    document.getElementById("buttonCall").addEventListener("click", call);
    
    sockets.push(
      new JsSIP
      .WebSocketInterface(`wss://${address}:443/ws`)
    );
    
    agent.start();
    
        agent.on("newRTCSession", function(data){
          let dataSession = data.session;
          
          dataSession.on("confirmed",function(e){
            let localTracks = dataSession.connection.getSenders();
            localStream.addTrack(localTracks[0].track);
            localStream.addTrack(localTracks[1].track);
            console.log(e);
            document.getElementById("localVideo").play();
          });
        });
        function call() {
            agent
            .call(
            `sip:${callee}@${address}`,
            options
            );
        }
  

Я был бы признателен, если бы кто-нибудь мог указать мне правильный способ сделать это возможным.

Ответ №1:

Я решил это, моя проблема заключалась в том, что я использовал Vue, поэтому, имея function s внутри моей mounted() функции, ссылка на this перезаписывалась, решением было изменить эти function s с помощью функций со стрелками () => {} следующим образом:

     agent.on("newRTCSession", (data) => {
      let dataSession = data.session;
      
      dataSession.on("confirmed", () => {
        let localTracks = dataSession.connection.getSenders();
        localStream.addTrack(localTracks[0].track);
        localStream.addTrack(localTracks[1].track);
        console.log(e);
        this.$refs.localVideo.play();
      });
    });