WebRTC:如何计算RTC Peer Connection的用户带宽/网络延迟

5

所以,我正在开发一个应用程序,利用WebRTC在同行之间提供视频/音频通信。

我想向用户提供有关其网络连接/带宽/延迟等方面的反馈,以便在带宽等情况不佳时建议可能的解决方案。

WebRTC有一个getStats() API,它提供了许多关键信息。当Peer Connection处于活动状态时,getStats()会给我以下对象...

{
    "googLibjingleSession_5531731670954573009":{
        "id":"googLibjingleSession_5531731670954573009",
        "timestamp":"2016-02-02T11:14:43.467Z",
        "type":"googLibjingleSession",
        "googInitiator":"true"
    },
    "googTrack_SCEHhCOl":{
        "id":"googTrack_SCEHhCOl",
        "timestamp":"2016-02-02T11:14:43.467Z",
        "type":"googTrack",
        "googTrackId":"SCEHhCOl"
    },
    "ssrc_360347109_recv":{
        "id":"ssrc_360347109_recv",
        "timestamp":"2016-02-02T11:14:43.467Z",
        "type":"ssrc",
        "googDecodingCTN":"757",
        "packetsLost":"0",
        "googSecondaryDecodedRate":"0",
        "googDecodingPLC":"3",
        "packetsReceived":"373",
        "googExpandRate":"0.00579834",
        "googJitterReceived":"0",
        "googDecodingCNG":"0",
        "ssrc":"360347109",
        "googPreferredJitterBufferMs":"20",
        "googSpeechExpandRate":"0.00140381",
        "googTrackId":"SCEHhCOl",
        "transportId":"Channel-audio-1",
        "googDecodingPLCCNG":"10",
        "googCodecName":"opus",
        "googDecodingNormal":"744",
        "audioOutputLevel":"6271",
        "googAccelerateRate":"0",
        "bytesReceived":"21796",
        "googCurrentDelayMs":"64",
        "googDecodingCTSG":"0",
        "googCaptureStartNtpTimeMs":"-1",
        "googPreemptiveExpandRate":"0.00292969",
        "googJitterBufferMs":"42"
    }
}

带着这些信息,我希望能计算出用户的:
a) 带宽(最好分别计算音频和视频,但只计算总带宽也可以)
b) 网络延迟
提前感谢...
注:我已经看过this wrapper,但我真的想自己做到这一点(当然需要你的一点帮助:D),因为这个包装器的示例代码使用了一个“bytesSent”属性,而我从getStats()中似乎没有得到。
我也知道GitHub上有WebRTC测试,但同样地,我应该能够在不依赖第三方“插件”等的情况下实现我想要的。

1
Chrome不遵循规范。请参见https://dev59.com/hV0a5IYBdhLWcg3w68Yz#29840886。 - jib
1个回答

3
据我所记,这些RTCStatReports的属性差别很大。例如,你提到的bytesSent属性并不总是可用的,可能需要执行以下操作:
// chrome
if (res.googCodecName == 'VP8' && res.bytesSent) {
  // res.bytesSent - bytes sent so far (video)
}

// firefox
if (res.mediaType == 'video' && res.bytesSent) ...

请查看您发布的包装器的源代码以了解更多信息。您还可以查看我的分支(如果包装器不再起作用,那是我上次查看时的情况)。请点击以下链接:包装器源代码我的分支

1
这对于至少Firefox是不正确的。请参见https://dev59.com/hV0a5IYBdhLWcg3w68Yz#29840886。 - jib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接