【问题标题】:Using WebRTC getStat() API使用 WebRTC getStat() API
【发布时间】:2015-03-18 18:54:52
【问题描述】:

嘿,我正在尝试在我的 WebRTC 应用程序中实现 getstat API。我发现很难在初学者级别获得任何教程。

我的申请 我使用 peer js 框架创建了一个 2 人聊天室。所以在我的应用程序中,我使用可以描述为“Sneeker-net”的信号发送信号,即我通过在电子邮件中给他们我的 id 手动与我想要聊天的人共享一个 peer id 让他们说然后他们打电话ID 。它使用 stun 和 turn 服务器使我们的连接成为一个简单的点对点聊天,它使用 Html5 和使用 peerjs API 的 JavaScript。

这是我的 HTML 5 和 Javascript 代码

HTML5 代码

<html>
<head>
  <title> PeerJS video chat with manual signalling example</title>
  <link rel="stylesheet" href="style.css">
  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>
  <script type="text/javascript" src="http://cdn.peerjs.com/0.3/peer.js"></script>
  <script type="text/javascript" src="ps-webrtc-peerjs-start.js  ></script>




  </head>

<body>

<div>
<!-- Video area -->

<div id="video-container">
    Your Friend<video id="their-video" autoplay class="their-video"></video>
    <video id="my-video" muted="true" autoplay class="my-video"></video> You
</div>


<!-- Steps -->
<div>
    <h2> PeerJS Video Chat with Manual Signalling</h2>

    <!--Get local audio/video stream-->
    <div id="step1">
        <p>Please click 'allow' on the top of the screen so we can access your webcam and microphone for calls</p>
        <div id="step1-error">
            <p>Failed to access the webcam and microphone. Make sure to run this demo on an http server and click allow when asked for permission by the browser.</p>
            <a href="#" id="step1-retry" class="button">Try again</a>
        </div>
    </div>

<!--Get local audio/video stream-->


<!--Make calls to others-->

<div id="step2">
    <p>Your id: <span id="my-id">...</span></p>
    <p>Share this id with others so they can call you.</p>
    <p><span id="subhead">Make a call</span><br>
        <input type="text" placeholder="Call user id..." id="callto-id">
        <a href="#" id="make-call">Call</a>
    </p>
</div>




<!--Call in progress-->

<!--Call in progress-->
<div id="step3">
    <p>Currently in call with <span id="their-id">...</span></p>
    <p><a href="#" id="end-call">End call</a></p>
</div>

</div>




</div>

</body>
</html>

我的 Javascript 文件

navigator.getWebcam = (navigator.getUserMedia ||
    navigator.webkitGetUserMedia ||
    navigator.mozGetUserMedia ||
    navigator.msGetUserMedia);

// PeerJS object ** FOR PRODUCTION, GET YOUR OWN KEY at http://peerjs.com/peerserver **
var peer = new Peer({
    key: 'XXXXXXXXXXXXXXXX',
    debug: 3,
    config: {
        'iceServers': [{
            url: 'stun:stun.l.google.com:19302'
        }, {
            url: 'stun:stun1.l.google.com:19302'
        }, {
            url: 'turn:numb.viagenie.ca',
            username: "XXXXXXXXXXXXXXXXXXXXXXXXX",
            credential: "XXXXXXXXXXXXXXXXX"
        }]
    }
});

// On open, set the peer id so when peer is on we display our peer id as text 


peer.on('open', function() {
    $('#my-id').text(peer.id);
});

peer.on('call', function(call) {
    // Answer automatically for demo
    call.answer(window.localStream);
    step3(call);
});

// Click handlers setup
$(function() {
    $('#make-call').click(function() {
        //Initiate a call!
        var call = peer.call($('#callto-id').val(), window.localStream);
        step3(call);
    });
    $('end-call').click(function() {
        window.existingCall.close();
        step2();
    });

    // Retry if getUserMedia fails
    $('#step1-retry').click(function() {
        $('#step1-error').hide();
        step();
    });

    // Get things started
    step1();
});

function step1() {
    //Get audio/video stream
    navigator.getWebcam({
        audio: true,
        video: true
    }, function(stream) {
        // Display the video stream in the video object
        $('#my-video').prop('src', URL.createObjectURL(stream));


        // Displays error  
        window.localStream = stream;
        step2();
    }, function() {
        $('#step1-error').show();
    });
}

function step2() { //Adjust the UI
    $('#step1', '#step3').hide();
    $('#step2').show();
}

function step3(call) {
    // Hang up on an existing call if present
    if (window.existingCall) {
        window.existingCall.close();
    }

    // Wait for stream on the call, then setup peer video
    call.on('stream', function(stream) {
        $('#their-video').prop('src', URL.createObjectURL(stream));
    });
    $('#step1', '#step2').hide();
    $('#step3').show();
}

非常感谢任何抽出时间帮助我的人,我非常感激,因为我只是 WebRTC 的初学者。 干杯

【问题讨论】:

  • 我想你会在这里找到答案:link
  • 非常感谢您的帮助

标签: webrtc peerjs


【解决方案1】:

对于 twilio SDK 看这篇文章:

Is there an API for the chrome://webrtc-internals/ variables in javascript?

var rtcPeerConn =Twilio.Device.activeConnection();
rtcPeerConn.options.mediaStreamFactory.protocol.pc.getStats(function callback(report) {
                var rtcStatsReports = report.result();
                for (var i=0; i<rtcStatsReports.length; i++) {
                    var statNames = rtcStatsReports[i].names();
                    // filter the ICE stats
                    if (statNames.indexOf("transportId") > -1) {
                        var logs = "";
                        for (var j=0; j<statNames.length; j++) {
                            var statName = statNames[j];
                            var statValue = rtcStatsReports[i].stat(statName);
                            logs = logs + statName + ": " + statValue + ", ";
                        }
                        console.log(logs);
                    }
                }
            });

【讨论】:

    【解决方案2】:

    这是我的代码,适用于 Chrome 和 Firefox。它在浏览器控制台中跟踪统计信息。因为 Chrome 统计数据非常冗长,所以我按照任意标准(statNames.indexOf("transportId") > -1)过滤它们:

    function logStats() {
            var rtcPeerConn = ...;
            try {
                // Chrome
                rtcPeerConn.getStats(function callback(report) {
                    var rtcStatsReports = report.result();
                    for (var i=0; i<rtcStatsReports.length; i++) {
                        var statNames = rtcStatsReports[i].names();
                        // filter the ICE stats
                        if (statNames.indexOf("transportId") > -1) {
                            var logs = "";
                            for (var j=0; j<statNames.length; j++) {
                                var statName = statNames[j];
                                var statValue = rtcStatsReports[i].stat(statName);
                                logs = logs + statName + ": " + statValue + ", ";
                            }
                            console.log(logs);
                        }
                    }
                });
            } catch (e) {
                // Firefox
                if (remoteVideoStream) {
                    var tracks = remoteVideoStream.getTracks();
                    for (var h=0; h<tracks.length; h++) {
                        rtcPeerConn.getStats(tracks[h], function callback(report) {
                            console.log(report);
                        }, function(error) {});
                    }
                }
            }
    }
    

    您需要 rtcPeerConnection,Firefox 还需要流。

    【讨论】:

    • 感谢您的帮助我在我的应用程序中使用 chrome,所以这对我试图弄清楚如何使用我的应用程序获取统计信息有很大帮助。当你说“你需要 rtcPeerConnection”时,这是否意味着我必须添加一个 rtcPeerConnection 方法或对象,比如你的和 Antonin M. [link] (stackoverflow.com/questions/24066850/…),他使用 Peer js 的例子。我很抱歉,因为我是这个主题的新手,也是 Js 的初学者,所以很难掌握所有帮助。非常感谢
    • 由于您似乎使用 PeerJS,您可以从 peer.call() 返回的 mediaConnection 中检索 rtcPeerConnection(例如),如下所示: rtcPeerConn = mediaConnection.pc 是的,它没有记录.
    • function logStats() { var rtcPeerConn = mediaConnection.pc try { 跟随您提供的其余代码,这应该可以工作@peveuve 看起来正确吗?然后将 statnames 更改为需要调用的任何 stat 。这与从(chrome://webrtc-internals/)接收统计数据有什么不同吗?是否有任何来自 getstatsapi 的额外统计信息,您在 chrome 内部页面上找不到非常感谢@peveuve
    • 提供的代码是我在我的产品中使用的代码,它可以工作。我很确定 getStats() 检索到的信息与 chrome://webrtc-internals 相同,但它非常冗长,因此检查所有内容都很乏味。
    • 非常感谢您抽出宝贵的时间@peveuve,正在考虑使用它们。
    【解决方案3】:

    我建议您阅读 O'Reilly 的 Real-Time Communication with WebRTC 对于初学者来说这本书非常有用,此外这本书将指导您使用 sokcet.io 进行信令逐步构建您的网络聊天应用程序 第一条评论中的链接

    【讨论】:

    • 非常感谢您的帮助,我想尝试加入我一直在开发的这个应用程序中,如果它失败了,我会考虑从那本书中构建一个
    猜你喜欢
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 2020-03-17
    • 2018-07-07
    • 1970-01-01
    相关资源
    最近更新 更多