0

有人可以帮帮我吗?我有点卡住了。

我正在尝试使用 ajax 和涉及的数据库编写一个信令过程(这只是为了学习 WebRTC 的基础知识)。我似乎从 JSON 对象收到了 SDP 罚款,但是当我尝试在 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);
            }
        }
    );
}

对不起,承诺和回调的混合......我尝试了一些事情以防万一......当它工作时,我将重写回调部分。非常感谢您提前给我的任何提示:)。

最好的问候和感谢您到现在为止的阅读;)。

富丘尔

4

0 回答 0