Настройка WebRTC getStat() API

Я пытаюсь использовать getStat() из API WebRTC, чтобы проверить, предоставляет ли он полезную информацию, измеряет задержку и другие данные потокового видео. Проблема в том, что не так много информации о том, как его использовать. Даже более старые существующие примеры довольно редки, но API изменился с тех пор.

Например, мои настройки:

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

Это возвращает объект RTCStatsResponse с 2 функциями

RTCStatsResponse {result: function, namedItem: function}

Попытка вызова этой функции result() возвращает массив объектов RTCStatsReport с типом "googLibjingleSession" для 1-го объекта и типом "googTrack" для 2-го объекта. Другая функция nameItem не определена при попытке вызвать ее

[RTCStatsReport, RTCStatsReport]

Из того небольшого количества доступной информации ( https://groups.google.com/forum/) я получу намного больше объектов RTCStatObjects с более полезной информацией, чем я получаю в настоящее время.

У кого-нибудь есть опыт использования webrtc getStats? Я полагаю, что я не могу делать это правильно

1 ответ

Решение

Следующее решение работает для меня.

Создание однорангового соединения

pc = new RTCPeerConnection(pc_config, pc_constraints);

Добавление обработчика onaddstream

pc.onaddstream = onRemoteStreamAdded;

Сам обработчик

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

        getStats(pc);
    };

Обратите внимание на функцию getStats, вызываемую из обработчика, функция следующая

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);
    });
}

Функция myGetStats является оберткой, чтобы сделать ее универсальной в разных браузерах;

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);
        });
    }
};

Каждую секунду он получает статистику и выводит необработанный объект в консольный журнал. Вы можете разобрать журнал, а затем изменить код, получив необходимое поле объекта.

Другие вопросы по тегам