RTCPeerConnection getStats 结果解析不完全指南

3,282 阅读2分钟

开发 WebRTC 应用是,开发者可以通过 chrome://webrtc-internals/ 去查看相关的状态信息。

image.png

到了生产环境,也需要提供一些状态信息给用户直观感受当前的状态,此时需要使用 getStats 进行获取并解析展示给用户,接口调用比较简单,但是获取到的数据非常的多,刚开始看会抓不到重点,这篇文章记录一下我在使用过程中常用的一些参数信息。

image.png

getStats 返回的结果是一个支持遍历的对象,可以通过 type 来判断统计类别的名称。

往返时间RTT

这个参数表示当前客户端到对端的网络延迟,在我的视频会议应用中会显示一个到服务器的延时,这个参数在 typeremote-inbound-rtp 的对象中,单位是秒。

image.png

接收端丢包

因为 WebRTC 是基于 UDP 的,接收端在网络不好的情况下会出现丢包,这个结果在 typeinbound-rtp 的对象的 packetsLost 属性中,需要注意的是,每个视频轨和音频轨是独立统计的,显示给客户时需要把结果加起来。

image.png

发送端视频分辨率、帧率

使用 getUserMedia 获取视频时可以指定获取到的 MediaStream 的分辨率,但是实际发送出去的视频分辨率不一定和 MediaStream 一致,typeoutbound-rtp 对象的 frameHeightframeWidthframesPerSecond 是当前编码后的视频高度宽度和帧率。

image.png

发送端码率

相对与上面几个获取之后就可以直接使用的参数,码率的显示相对来说就会比较麻烦。

在获取的统计信息中,我们能够拿到的信息分别为 timestampbytesSentheaderBytesSent这些,这些数数据也是在 typeoutbound-rtp 的对象中,需要注意的是,每个音轨、视频轨是独立统计的,计算的时候需要把两个结果加起来。

码率计算的伪代码如下:

  const durtion = next.timestamp - prev.timestamp;
  if (0 >= durtion) {
    return 0;
  }
  return (1000 * 8 * (next.bytesSent + next.headerBytesSent - prev.bytesSent + prev.headerBytesSent)) / durtion;

得到的结果单位是 bits/s。

image.png

接收端视频分辨率、帧率

接收端的分辨率和帧率信息在 typeinbound-rtp 的对象中,参数名也是 frameHeightframeWidthframesPerSecond

image.png

接收端码率

接收端的码率计算和发送端基本一致,只是数据来源需要变成 typeinbound-rtp 对象的 bytesReceivedheaderBytesReceived,每条轨道也是单独统计的。

image.png

打个广告,最新在找工作,希望有 WebRTC 前端或者前端音视频相关岗位可以帮我内推一下,留言或邮件都可以,邮箱是 kunkkaco@gmail.com

参考资料: