WebRTC getStat() API Set UP

JerryFox picture JerryFox · Jul 31, 2014 · Viewed 7.2k times · Source

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

Answer

fycth picture fycth · Sep 3, 2014

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.