Почему сбой ICE-кандидата при видеовызове WebRTC?

#javascript #google-chrome #browser #webrtc #mozilla

#JavaScript #Google-Chrome #браузер #webrtc #Mozilla

Вопрос:

Я написал простое приложение для видеовызовов с webRTC Technology помощью . Это работает нормально first 3 minutes , и после этого я сталкиваюсь с некоторой "ICE candidate failing" ошибкой.

Вот что происходит :

Шаги :

настройте одноранговое соединение

  • При загрузке окна разрешить веб-камеру с помощью getUserMedia (доступ к веб-камере и микрофону)
  • создайте одноранговое соединение RTC с добавлением удаленного потока и icecandidateAdded

начать одноранговое соединение

  • создайте предложение, отправьте запрос предложения
  • addIceCandidate
  • создать ответ, отправить ответный ответ

Это мой код :

 function hasUserMedia() {
    navigator.getUserMedia = navigator.getUserMedia ||
                         navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
    return !!navigator.getUserMedia;
};

function hasRTCPeerConnection(){
    window.RTCPeerConnection = window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
    window.RTCSessionDescription = window.RTCSessionDescription || window.webkitRTCSessionDescription || window.mozRTCSessionDescription;
    window.RTCIceCandidate = window.RTCIceCandidate || window.webkitRTCIceCandidate || window.mozRTCIceCandidate;

    return !!window.RTCPeerConnection;
};

//when window loading 
function startConnection() {

    if (hasUserMedia()){

        navigator.getUserMedia({ video: true, audio: true }, function(my_stream) {
        stream = my_stream;
        client_Video.src = window.URL.createObjectURL(stream);

        if(hasRTCPeerConnection()){
                console.log("RTC peer connection is ready");
                //set up peer connection
                setup_Peer_Connection(stream);
            }

    }
}

function setup_Peer_Connection(stream){

    var configuration = {"iceServers": [{ "url": "stun:stun.1.google.com:19302" }]};
    my_Connection = new RTCPeerConnection(configuration,{optional:[]});
    my_Connection.addStream(stream);
    my_Connection.onaddstream = remoteStreamAdded;
    my_Connection.onicecandidate = icecandidateAdded;
}

function remoteStreamAdded(ev){

    m_PeerVideo.src = window.URL.createObjectURL(ev.stream);
}

function icecandidateAdded(ev) {
    if (ev.candidate) {
            send({type: "candidate",candidate: ev.candidate});
        }
};  
  

и для начала однорангового соединения :

 var mediaConstraints = {
    optional: [],
    mandatory: {
        OfferToReceiveAudio: true,
        OfferToReceiveVideo: true
    }
};

function calluser(){
    //start video call with user
    Start_Peer_Connection();
}

function Start_Peer_Connection(){

    my_Connection.createOffer(function (offer) {
        console.log("offer started");
        send({type: "offer",offer: offer});
                my_Connection.setLocalDescription(offer, success2, failure_offer);
    }, failure_Start_Peer_Connection,mediaConstraints);
}


//getting message from server

connection.onmessage = function (message) {

    console.log("Got message", message.data);   

    var data = JSON.parse(message.data);

    switch(data.type) {

        case "offer":
            Client_Offer(data.offer, data.name);
        break;

        case "answer":
            Client_Answer(data.answer);
        break;

        case "candidate":
            Client_Candidate(data.candidate);
        break;

        case "leave":
            Client_Leave();
        break;

        default:
        break;
    }
};

function Client_Offer(offer, name) {

    my_Connection.setRemoteDescription(new RTCSessionDescription(offer));

        my_Connection.createAnswer(function (answer) {

            my_Connection.setLocalDescription(answer);

            send({type: "answer",answer: answer});

        },failure_Client_Offer); 

    }
}   

function Client_Answer(answer) {

    my_Connection.setRemoteDescription(new RTCSessionDescription(answer));
}

function Client_Candidate(candidate) {

    my_Connection.addIceCandidate(new RTCIceCandidate(candidate));
}
  

Я использую браузер Mozilla Firefox. я не знаю, почему это не работает через 3 минуты. Соединение в порядке. Но почему ice-кандидат выходит из строя через некоторое время? Отсутствует какой-либо код? Есть предложения?

Комментарии:

1. Можете ли вы воспроизвести это с помощью Chrome? Возникает ли проблема в других приложениях WebRTC?

2. та же проблема все еще в Chrome