我正在逐步测试WebRTC过程。

我为无服务器的WebRTC编写了一些测试站点。

http://webrtcdevelop.appspot.com/

实际上,使用了Google的STUN服务器,但未部署任何信令服务器。

session 描述协议(protocol)(SDP)可以通过浏览器窗口之间的CopyPaste手动进行手动交换。




到目前为止,这是我在代码中得到的结果:

'use strict';

var peerCon;
var ch;

$(document)
    .ready(function()
    {
        init();

        $('#remotebtn2')
            .attr("disabled", "");

        $('#localbtn')
            .click(function()
            {
                offerCreate();

                $('#localbtn')
                    .attr("disabled", "");
                $('#remotebtn')
                    .attr("disabled", "");

                $('#remotebtn2')
                    .removeAttr("disabled");
            });

        $('#remotebtn')
            .click(function()
            {
                answerCreate(
                    new RTCSessionDescription(JSON.parse($('#remote')
                        .val())));

                $('#localbtn')
                    .attr("disabled", "");
                $('#remotebtn')
                    .attr("disabled", "");

                $('#remotebtn')
                    .attr("disabled", "");
            });

        $('#remotebtn2')
            .click(function()
            {
                answerGet(
                    new RTCSessionDescription(JSON.parse($('#remote')
                        .val())));

                $('#remotebtn2')
                    .attr("disabled", "");
            });
        $('#msgbtn')
            .click(function()
            {
                msgSend($('#msg')
                    .val());

            });
    });

var init = function()
{
    //offer------
    peerCon =
        new RTCPeerConnection(
        {
            "iceServers": [
            {
                "url": "stun:stun.l.google.com:19302"
            }]
        },
        {
            "optional": []
        });

    var localDescriptionOut = function()
    {
        console.log(JSON.stringify(peerCon.localDescription));
        $('#local')
            .text(JSON.stringify(peerCon.localDescription));


    };

    peerCon.onicecandidate = function(e)
    {
        console.log(e);

        if (e.candidate === null)
        {
            console.log('candidate empty!');
            localDescriptionOut();
        }
    };

    ch = peerCon.createDataChannel(
        'ch1',
        {
            reliable: true
        });
    ch.onopen = function()
    {
        dlog('ch.onopen');
    };
    ch.onmessage = function(e)
    {
        dlog(e.data);
    };
    ch.onclose = function(e)
    {
        dlog('closed');
    };
    ch.onerror = function(e)
    {
        dlog('error');
    };
};

var msgSend = function(msg)
{
    ch.send(msg);
}



var offerCreate = function()
{
    peerCon
        .createOffer(function(description)
        {
            peerCon
                .setLocalDescription(description, function()
                {
                    //wait for complete of peerCon.onicecandidate
                }, error);
        }, error);
};

var answerCreate = function(descreption)
{
    peerCon
        .setRemoteDescription(descreption, function()
        {
            peerCon
                .createAnswer(
                    function(description)
                    {
                        peerCon
                            .setLocalDescription(description, function()
                            {
                                //wait for complete of peerCon.onicecandidate
                            }, error);
                    }, error);
        }, error);
};
var answerGet = function(description)
{
    peerCon.setRemoteDescription(description, function()
    { //
        console.log(JSON.stringify(description));
        dlog('local-remote-setDescriptions complete!');
    }, error);
};

var error = function(e)
{
    console.log(e);
};

var dlog = function(msg)
{
    var content = $('#onmsg')
        .html();
    $('#onmsg')
        .html(content + msg + '<br>');
}
  • Firefox(26.0):RtpDataChannelsonopen事件已成功触发,但send失败。
  • Chrome(31.0):RtpDataChannelsonopen事件已成功触发,并且send也成功。

  • Chrome的SDP对象如下:
    {"sdp":".................. cname:L5dftYw3P3clhLve\r\na=ssrc:2410443476 msid:ch1 ch1\r\na=ssrc:2410443476 mslabel:ch1\r\na=ssrc:2410443476 label:ch1\r\n","type":"offer"}
    代码中定义的 ch1 信息;
     ch = peerCon.createDataChannel(
                'ch1',
                {
                    reliable: false
                });
    

    已正确捆绑。

    但是,Firefox的SDP对象(本地描述)根本不包含DataChannel,而且,SDP比Chrome短得多,并且捆绑的信息更少。

    我想念什么?

    可能是因为Firefox缺少SDP对象中的信息,所以我想在DataChannel上send失败的原因。

    我该如何解决?
    我调查了各种工作库的源代码,例如peerJS,easyRTC,simpleWebRTC,但找不到原因。

    任何建议和阅读建议表示赞赏。

    最佳答案

    [还没有答案]
    我将其留在这里只是为了帮助您。我不是WebRTC开发人员。但是,令我好奇的是,这对我来说是相当新的和非常有趣的。
    Have you seen this

    此外,i found this bug hook似乎与巫婆有关。
    最后一点,您的adapter.js版本与code.google上提供的版本不同。和..很多。您缺少webrtcDetectedVersion部分。
    https://code.google.com/p/webrtc/source/browse/stable/samples/js/base/adapter.js
    试试看,再给我好消息。 ?

    上次更新后,点击“获取答案”后,我在控制台中显示了这一行

    但这可能是无用的信息,我将其粘贴粘贴到相同的浏览器选项中进行回答。
    ..女巫让我注意到您正在使用jQuery v1.7.1 jquery.com。
    尝试更新jQuery(在杀死小猫之前),与此同时,请尝试确保使用所有更新版本的脚本。

    Woups,快速阅读以下内容:https://developer.mozilla.org/en-US/docs/Web/Guide/API/WebRTC/WebRTC_basics然后比较您的JavaScript,我看不到SHIM。

    > var PeerConnection = window.mozRTCPeerConnection ||
    > window.webkitRTCPeerConnection; var IceCandidate =
    > window.mozRTCIceCandidate || window.RTCIceCandidate; var
    > SessionDescription = window.mozRTCSessionDescription ||
    > window.RTCSessionDescription; navigator.getUserMedia =
    > navigator.getUserMedia || navigator.mozGetUserMedia ||
    > navigator.webkitGetUserMedia;
    

    关于html - Firefox的WebRTC SDP对象(本地描述)不像Chrome那样包含DataChannel信息?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20622748/

    10-15 02:41