WebRTC-проблема: не удается создать ответ в стабильной версии (нет Chrome, но задействована сигнализация AJAX)

может кто-нибудь мне немного помочь? Я немного застрял.

Я пытаюсь написать процесс сигнализации с использованием ajax и базы данных (это пока только для изучения основ WebRTC). Я получаю штраф SDP от объекта JSON, как кажется, но затем я всегда получаю сообщение об ошибке «Невозможно создать ответ в стабильной версии», когда пытаюсь создать ответ в get_remote_offer() для pc_partner.

Я почти уверен, что это что-то очевидное, но я новичок в WebRTC и просто не понимаю, что именно. Я использую Firefox здесь и просто пытаюсь подключить два его экземпляра (один в приватном режиме, один в «обычном» режиме, но я пытаюсь заставить его работать для удаленных пользователей.

Это мой код:

var opt;
var video_el_partner;
var video_el_local;
var pc_partner;
var pc_local;
var interval_gro;
var remote_offer_available = false; 

var service_url = "https://xyz.de/webrtc";
var pwd = "xxx";
var signaling_url = "https://xyz.de/webrtc/sdp_transfer.php";

function init_stream(video_partner_id, video_local_id, allow_video, allow_audio){
    if (location.protocol === 'https:') { // only possible for https!
        pc_local = new RTCPeerConnection();
        pc_partner = new RTCPeerConnection();

        if(document.getElementById(video_partner_id) != null){
            video_el_partner = document.getElementById(video_partner_id);
            video_el_local = document.getElementById(video_local_id);

            if(allow_video == null){
                allow_video = true;
            }
            if(allow_audio == null){
                allow_audio = true;
            }

            opt = { audio: allow_audio, video: allow_video }; 

            if(typeof navigator != 'undefined' && typeof navigator.mediaDevices != 'undefined' &&  navigator.mediaDevices.getUserMedia != null){
                navigator.mediaDevices.getUserMedia(opt).then (
                    function (this_stream){
                        // local video directly into video element:
                        video_el_local.srcObject = this_stream;

                        // remote one is more insteresting:
                        pc_local.addStream(this_stream);

                        pc_local.createOffer().then(
                            function (this_sdp) {
                                // sdp (session dependend protocol object) is now available... this would need to go to a server somehow now.
                                // they use socket.io for that... maybe I can use my own thing to do that?
                                pc_local.setLocalDescription(this_sdp);
                                var this_sdp_json = JSON.stringify(this_sdp)
                                var params_ins = "mode=insert_offer&sdp_con=" + this_sdp_json + "&pass=" + pwd + "&service_url=" + service_url;

                                ajax_request_simple (
                                    signaling_url, 
                                    params_ins, 
                                    function (res_ins) {
                                        // insert done. Lets read for another candidate.
                                        console.log('Set Interval!');
                                        interval_gro = window.setInterval('get_remote_offer();', 5000);
                                    }
                                );
                            }
                        );
                    }
                ).catch(
                    function (error) {
                        console.log('Problem: ');
                        console.log(error);
                    }
                );
            } else {
                console.log("navgiator or navigator.mediaDevices is not defined.");
            }
        }
    } else {
        console.log('init_stream(): We can only do anything like that on https-connections! Http is not supported by the browser!');
    }
}

window.onload = function () {
    document.getElementById('button_start_stream').onclick = function () {
        init_stream('video_partner', 'video_local', true, false);
    }
}

function is_json_str(str) {
    try {
        JSON.parse(str);
    } catch (e) {
        return false;
    }
    return true;
}

function get_remote_offer() {
    var params_read = "mode=get_offer&pass=" + pwd + "&service_url=" + service_url;
    ajax_request_simple (
        signaling_url, 
        params_read, 
        function (res_read) {
            // done.
            if(is_json_str(res_read)){
                // seems like we get one now.
                // lets use that to connect and stream the video to the remote view.
                var partner_offer = res_read;
                partner_offer = JSON.parse(partner_offer);

                // clear interval if found.
                window.clearInterval(interval_gro);
                console.log('Cleared Interval. Found!');

                pc_local.setRemoteDescription(
                    new RTCSessionDescription(partner_offer), function(){
                        // video_el_partner.srcObject = event.stream;
                        pc_local.onicecandidate = function (e) {
                            if ( e.candidate != null ) {
                                pc_partner.addIceCandidate( new RTCIceCandidate(e.candidate) );
                            }
                        };

                        pc_partner.onicecandidate = function (e) {
                            if ( e.candidate != null ) {
                                pc_local.addIceCandidate( new RTCIceCandidate(e.candidate) );
                            }
                        };

                        pc_partner.createAnswer(
                            function (offer) {
                                pc_local.setRemoteDescription(offer);
                                pc_partner.setLocalDescription(offer);
                            }
                        );

                        // pc_local.ontrack = function (evt) {
                            // video_el_local.srcObject = evt.stream;
                        // };

                        pc_partner.ontrack = function (evt) {
                            video_el_partner.srcObject = evt.stream;
                        };

                    }, 
                    function(e) { 
                        console.log("Problem while doing client-answer: ", e);
                    }
                );
            } else {
                console.log("Can not parse: ");
                console.log(res_read);
            }
        }
    );
}

Извините за смесь обещаний и обратных вызовов... На всякий случай я попробовал пару вещей... когда все заработает, я перепишу части обратного вызова. Заранее большое спасибо за любую подсказку, которую вы можете мне дать :).

С наилучшими пожеланиями и спасибо за чтение до сих пор ;).

Фучур


person Fuchur84    schedule 10.04.2020    source источник
comment
Я вижу два объекта однорангового соединения. Я думаю, вы смешиваете демонстрацию вкладок с демонстрацией локального цикла.   -  person jib    schedule 11.04.2020
comment
Большое спасибо за подсказку ... Я переписал его и теперь могу создать ответ, но теперь я столкнулся с другой проблемой OperationError: Unknown ufrag (71c0b048). Я задал новый вопрос об этом здесь, потому что stackoverflow попросил меня сделать это: > stackoverflow.com/questions/61292934/   -  person Fuchur84    schedule 18.04.2020