WebRTC, как сервер STUN реагирует на кандидатов SDP и ICE?

Ради себя я тестирую процедуру WebRTC пошагово.

Я написал какой-то сайт для тестирования безсерверного WebRTC.

http://webrtcdevelop.appspot.com/

Фактически, используется сервер STUN от Google, но сервер сигнализации не развернут.

Обмен протоколом описания сеанса (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", "");
            });
    });


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

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

    ch = peerCon.createDataChannel(
        'ch1',
        {
            reliable: false
        });
    ch.onopen = function()
    {
        alert('ch.onopen');
        ch.send("hello chat!");
    };
    ch.onmessage = function(e)
    {
        alert(e.data);
    };


};

var offerCreate = function()
{
    peerCon
        .createOffer(function(description)
        {
            peerCon
                .setLocalDescription(description, function()
                {
                    console.log(JSON.stringify(description));
                    $('#local')
                        .text(JSON.stringify(description));
                }, error);
        }, error);

};

var answerCreate = function(descreption)
{
    peerCon
        .setRemoteDescription(descreption, function()
        {
            peerCon
                .createAnswer(
                    function(description)
                    {
                        peerCon
                            .setLocalDescription(description, function()
                            {
                                console.log(JSON.stringify(description));
                                $('#local')
                                    .text(JSON.stringify(description));

                            }, error);
                    }, error);
        }, error);

};
var answerGet = function(description)
{
    peerCon.setRemoteDescription(description, function()
    { //
        console.log(JSON.stringify(description));
        alert('local-remote-setDescriptions complete!');
    }, error);
};

var error = function(e)
{
    console.log(e);
};
  • Firefox (26.0): событие RtpDataChannels onopen запущено успешно, но send завершается ошибкой.

  • Chrome (31.0): событие RtpDataChannels onopen не запускается.

Итак, мой вопрос:

Я хочу знать, почему Chrome не работает при событии RtpDataChannels onopen и как это исправить.

Возможно, что более важно, я хочу понять, как управлять событием ICE .onicecandidate.

Например, локальное описание предложения, полученное с сервера STUN. следующее:

{"sdp":"v=0\r\no=- 7430372191078664219 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE audio data\r\na=msid-semantic: WMS\r\nm=audio 1 RTP/SAVPF 111 103 104 0 8 106 105 13 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:1 IN IP4 0.0.0.0\r\na=ice-ufrag:Gj7WBxZNS7HswoxM\r\na=ice-pwd:FsXen3Tz2sXdXV31splr7WKg\r\na=ice-options:google-ice\r\na=fingerprint:sha-256 EF:67:28:00:41:B6:08:A3:C5:27:BF:38:84:83:CF:8D:DC:CC:95:A9:6C:DB:77:44:DA:B2:D1:05:39:73:99:D1\r\na=setup:actpass\r\na=mid:audio\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=recvonly\r\na=rtcp-mux\r\na=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:ZTGRIJAdH3o1Y1T/6gF3YUtCF5CTdsaEkjWCtWJ+\r\na=rtpmap:111 opus/48000/2\r\na=fmtp:111 minptime=10\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:106 CN/32000\r\na=rtpmap:105 CN/16000\r\na=rtpmap:13 CN/8000\r\na=rtpmap:126 telephone-event/8000\r\na=maxptime:60\r\nm=application 1 RTP/SAVPF 101\r\nc=IN IP4 0.0.0.0\r\na=rtcp:1 IN IP4 0.0.0.0\r\na=ice-ufrag:Gj7WBxZNS7HswoxM\r\na=ice-pwd:FsXen3Tz2sXdXV31splr7WKg\r\na=ice-options:google-ice\r\na=fingerprint:sha-256 EF:67:28:00:41:B6:08:A3:C5:27:BF:38:84:83:CF:8D:DC:CC:95:A9:6C:DB:77:44:DA:B2:D1:05:39:73:99:D1\r\na=setup:actpass\r\na=mid:data\r\na=sendrecv\r\nb=AS:30\r\na=rtcp-mux\r\na=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:ZTGRIJAdH3o1Y1T/6gF3YUtCF5CTdsaEkjWCtWJ+\r\na=rtpmap:101 google-data/90000\r\na=ssrc:3757983348 cname:ojw6/osqSDh7tsMo\r\na=ssrc:3757983348 msid:ch1 ch1\r\na=ssrc:3757983348 mslabel:ch1\r\na=ssrc:3757983348 label:ch1\r\n","type":"offer"}

Единственный IP-адрес, который я мог видеть, - это 127.0.0.1, то есть localhost, но я полагаю, что какой-то глобальный адрес должен быть включен в информацию SDP, потому что без него мы можем подключиться только локально.

Итак, я думаю, мне нужно пометить различных кандидатов ICE onicecaditate с SDP, но я не уверен, как это сделать, и я думаю, что эта проблема связана с неудачей теста.

Любые предложения и рекомендации к прочтению приветствуются.

РЕДАКТИРОВАТЬ: Хорошо, наверное, это та же тема, за которой я сейчас следую:

необходимо отправить ледяных кандидатов, или они приходят в пакете с данными предложения / ответа? https://groups.google.com/forum/#!topic/discuss-webrtc/UOnopWJ1l44


person Community    schedule 16.12.2013    source источник


Ответы (1)


необходимо отправить ледяных кандидатов, или они приходят в пакете с данными предложения / ответа? > https://groups.google.com/forum/#!topic/discuss-webrtc/UOnopWJ1l44

Chrome отправляет кандидатов ICE независимо от исходного пакета SDP, и, хотя кандидаты ICE прибыли, они автоматически попадают в / обновляют LocalDescription.

Итак, необходимо дождаться завершения серии кандидатов ICE, помеченной нулевым объектом-кандидатом ICE, а затем вывести / отправить на сервер сигнализации.

После модификации кода с указанным выше открытием ситуация изменилась: подробности см. В моем следующем вопросе. (пока не решено 2013/12/17)

WebRTC SDP-объект (локальное описание) по Firefox не содержит информации DataChannel, в отличие от Chrome?

person Community    schedule 16.12.2013