Я пытаюсь создать простой видеозвонок 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](https://i.stack.imgur.com/FBJmD.png)
Приемник ![Receiver's logs](https://i.stack.imgur.com/T6cw9.jpg)
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)
}
);
})