WebRT C videocall Ошибки мобильной точки доступа - PullRequest
1 голос
/ 05 мая 2020

Я пытаюсь создать простой видеозвонок p2p с помощью WebRT C и SocketIO для обмена сообщениями. Видеочат отлично работает, когда оба клиента подключены к разным сетям WIFI, но когда один из них использует мобильную точку доступа, соединение не может быть установлено. Вот несколько ключевых фрагментов кода, которые могут помочь найти проблему: Запуск вызова / createOffer

function callNeighbor(){
  if(buddy=={}){console.log('CALL_NEIGHBOR Neighbor NULL')}
  else{

    const servers = {iceServers: [{urls: 'stun:stun1.l.google.com:19305'}]};
    pc=new RTCPeerConnection(servers);
    pc.onicecandidate = e => onIceCandidate(pc, e);
    pc.ontrack=gotRemoteStream;
    pc.onnegotiationneeded=function(){
      pc.createOffer().then(success=>{
        console.log(success)
        pc.setLocalDescription(success).then(success=>{
          socket.emit('rtcRequest',{from:name,to:buddy.name,body:pc.localDescription});

        },error=>{
          console.log(failure);
        });

      },
        failure=>{
          console.log(failure);
        })
    }
    navigator.mediaDevices.getUserMedia(constraints).then(handleSuccess).catch(handleError);
  }
}

onICECandidate

function onIceCandidate(pc, event) {
  const candidate=event.candidate
  if(candidate==null){return}
  console.log('**SENDING ICE** '+candidate)
  console.log(candidate)
  socket.emit("rtcICE",{from:name,to:buddy.name, body:candidate});
  console.log(`PC ICE candidate:\n${candidate ? candidate.candidate : '(null)'}`);
}

Прием вызова / createAnswer

function handleCall(stream) {
  console.log(stream);
  localOut.srcObject = stream;

  localStream = stream;
  const audioTracks = localStream.getAudioTracks();
  if (audioTracks.length > 0) {
    // console.log(`Using Audio device: ${audioTracks[0].label}`);
  }
  localStream.getTracks().forEach(track => pc.addTrack(track, localStream));
  // console.log('Adding Local Stream to peer connection');
  pc.createAnswer().then(answer=>{
    pc.setLocalDescription(answer).then(success=>{
        socket.emit('rtcResponse',{from:name,to:buddy.name,body:pc.localDescription});

    },error=>{console.log(error)})

  },error=>{console.log(error)})
}

Добавление Ice Candidate

socket.on('rtcICE',function(data){//rtcICE is via socketIO see onICECandidate above
  pc.addIceCandidate((data.body)).then(success=>console.log(success),error=>console.log(error));
})

ЖУРНАЛЫ

Вызывающий

Caller's logs

Приемник Receiver's logs

EDIT Вот код для настройки удаленного описание

socket.on('rtcRequest',function(data){
  const offer=data.body;
  const servers = {iceServers: [{urls: 'stun:stun1.l.google.com:19305'}]};;
  pc=new RTCPeerConnection(servers);
  pc.onicecandidate = e => onIceCandidate(pc, e);
  pc.ontrack=gotRemoteStream;
  pc.onnegotiationneeded=function(){
    console.log('NEGOTIATION NEEDED!!!')}
  pc.setRemoteDescription(data.body).then(success=>{
    navigator.mediaDevices.getUserMedia(constraints).then(handleCall).catch(handleError);
    },
    error=>{console.log(error)
    }
  );

})
...