Webrtc 关闭RTPeerConnection后,我无法再次调用,因为未激发onicecandidate

Webrtc 关闭RTPeerConnection后,我无法再次调用,因为未激发onicecandidate,webrtc,rtcpeerconnection,Webrtc,Rtcpeerconnection,我想使用webrtc建立点对点连接。当我第一次创建RTPeerConnection时,它工作正常,但当我使用close()方法关闭连接并尝试通过创建新的RTPeerConnection再次调用时,调用未建立,因为未触发onicecandidate事件,因此ice候选对象无法发送到信号器 var config = { apiKey: "AIzaSyB_hC6EAi4Lcubx5oKdt6XhfUhy9eIqt3A", authDomain

我想使用webrtc建立点对点连接。当我第一次创建RTPeerConnection时,它工作正常,但当我使用close()方法关闭连接并尝试通过创建新的RTPeerConnection再次调用时,调用未建立,因为未触发onicecandidate事件,因此ice候选对象无法发送到信号器

    var config = {
        apiKey: "AIzaSyB_hC6EAi4Lcubx5oKdt6XhfUhy9eIqt3A",
        authDomain: "maqraa-18b00.firebaseapp.com",
        databaseURL: "https://maqraa-18b00.firebaseio.com",
        projectId: "maqraa-18b00",
        storageBucket: "maqraa-18b00.appspot.com",
        messagingSenderId: "484319770328",
        appId: "1:484319770328:web:d814f4b0787ebcdca709ad",
        measurementId: "G-4M23TN8TNL"
    };
    firebase.initializeApp(config);
    OpenMyMic();
    
    const callButton = document.querySelector('button#callButton');
    const hangupButton = document.querySelector('button#hangupButton');
    var partnerAudio = document.querySelector('.audio.partner');
    callButton.disabled = false;
    hangupButton.disabled = true;   
    callButton.onclick = call;
    hangupButton.onclick = hangup;
    
    
    var database = firebase.database().ref();
    var yourId = Math.floor(Math.random()*1000000000);
    var servers = {iceServers: [{
       urls: [ "stun:bn-turn1.xirsys.com" ]
    }, {
       username: "4YZ55YVDuwcyQ9eBVVfFPUIXleT0R_Q-V-MmSugmX0NqHNaPrgNaRtY3dJXq51WzAAAAAF-eg9Bpc2FsZWg=",
       credential: "07d3299e-1c27-11eb-8f9c-0242ac140004",
       urls: [
           "turn:bn-turn1.xirsys.com:80?transport=udp",
           "turn:bn-turn1.xirsys.com:3478?transport=udp",
           "turn:bn-turn1.xirsys.com:80?transport=tcp",
           "turn:bn-turn1.xirsys.com:3478?transport=tcp",
           "turns:bn-turn1.xirsys.com:443?transport=tcp",
           "turns:bn-turn1.xirsys.com:5349?transport=tcp"
       ]
    }]};
    let pc;
    createPC();
    function createPC()
    {
    debugger
    pc = new RTCPeerConnection(servers);
    pc.onicecandidate = (event => event.candidate?sendMessage(yourId, JSON.stringify({'ice': event.candidate})):console.log("Sent All Ice") );
    pc.onaddstream = (event => partnerAudio.srcObject = event.stream);
    }
    function sendMessage(senderId, data) {
        debugger
        var msg = database.push({ sender: senderId, message: data });
        msg.remove();
    }
    var messageRead = false;
    function readMessage(data) {
        
        
       
        var msg = JSON.parse(data.val().message);
        var sender = data.val().sender;
        if (sender != yourId) {
                
            if(msg.info == 'hangup')
            {
                debugger
              callButton.disabled = false;
              hangupButton.disabled = true; 
              pc.close();
            }
            else if(msg.info == 'call')
            {
              callButton.disabled = true;
              hangupButton.disabled = false;    
              if(pc.connectionState == "closed")
                {debugger
                 createPC();    
                }
            }
            else if (msg.ice != undefined)
                pc.addIceCandidate(new RTCIceCandidate(msg.ice));
            else if (msg.sdp.type == "offer")
                pc.setRemoteDescription(new RTCSessionDescription(msg.sdp))
                  .then(() => pc.createAnswer())
                  .then(answer => pc.setLocalDescription(answer))
                  .then(() => sendMessage(yourId, JSON.stringify({'sdp': pc.localDescription})));
            else if (msg.sdp.type == "answer")
                pc.setRemoteDescription(new RTCSessionDescription(msg.sdp));
        }
    };
    
    database.on('child_added', readMessage);
    
    function OpenMyMic() {
      navigator.mediaDevices.getUserMedia({audio:true})
        .then(stream => pc.addStream(stream));
    }
    
    function call() {
        
     if(pc.connectionState == "closed")
         {debugger
          createPC();   
     }
        console.log('call started');
        pc.createOffer()
        .then(offer => pc.setLocalDescription(offer) )
        .then(() => sendMessage(yourId, JSON.stringify({'sdp': pc.localDescription})) );
        
        callButton.disabled = true;
        hangupButton.disabled = false;
        
        sendMessage(yourId, JSON.stringify({'info': 'call'})) 
    }
    
     function hangup() {     
           pc.close();    
           callButton.disabled = false;
           hangupButton.disabled = true;    
           sendMessage(yourId, JSON.stringify({'info': 'hangup'}))     
     }