WebRTC getStat() API Set UP
Asked Answered
T

1

7

I am trying to use getStat() from WebRTC's api to see if it provides any useful info measure latency and other video streaming data. The problem is that there's not much info of how to use it. Even older existing examples are pretty rare but the api has changed since then.

For example, my set up:

peerconnection.getStats(function(stats) { 
                          console.log(stats); } ));

This returns a RTCStatsResponse object with 2 functions

RTCStatsResponse {result: function, namedItem: function}

Trying to call that result() function returns an array of RTCStatsReport objects with type 'googLibjingleSession' for the 1st object and type 'googTrack' for the 2nd object. The other nameItem function is undefined when trying to call it

[RTCStatsReport, RTCStatsReport]

From what little info available (https://groups.google.com/forum/#!topic/discuss-webrtc/fpr4yn4-3sg), I would be getting alot more RTCStatObjects with more useful info than I am currently getting.

Does anyone have experience with using webrtc's getStats? I believe I may not be doing this correctly

Toxoid answered 31/7, 2014 at 21:42 Comment(0)
O
10

The following solution works for me.

Creating peer connection

pc = new RTCPeerConnection(pc_config, pc_constraints);

Adding onaddstream handler

pc.onaddstream = onRemoteStreamAdded;

The handler itself

var onRemoteStreamAdded = function(event) {
        attachMediaStream(remoteVideo, event.stream);
        remoteStream = event.stream;

        getStats(pc);
    };

Pay attention on the getStats function called from the handler, the function is following

function getStats(peer) {
    myGetStats(peer, function (results) {
        for (var i = 0; i < results.length; ++i) {
            var res = results[i];
            console.log(res);
        }

        setTimeout(function () {
            getStats(peer);
        }, 1000);
    });
}

The myGetStats function is a wrapper to make it possible universal in different browsers;

function myGetStats(peer, callback) {
    if (!!navigator.mozGetUserMedia) {
        peer.getStats(
            function (res) {
                var items = [];
                res.forEach(function (result) {
                    items.push(result);
                });
                callback(items);
            },
            callback
        );
    } else {
        peer.getStats(function (res) {
            var items = [];
            res.result().forEach(function (result) {
                var item = {};
                result.names().forEach(function (name) {
                    item[name] = result.stat(name);
                });
                item.id = result.id;
                item.type = result.type;
                item.timestamp = result.timestamp;
                items.push(item);
            });
            callback(items);
        });
    }
};

Every second it will get statistics and print raw object into console log. You can parse the log and then change the code, getting necessary object's field.

Obtrusive answered 3/9, 2014 at 20:27 Comment(3)
Note that this answer is Chrome specific. See this question.Marlowe
a thank you from the future. This stuff still isn't documented very well onlineToxoid
I am new to this. For arguments pc_config and pc_constraints what value we need to pass, can you please explain.Reality

© 2022 - 2024 — McMap. All rights reserved.