开发 WebRTC 应用是,开发者可以通过 chrome://webrtc-internals/ 去查看相关的状态信息。
到了生产环境,也需要提供一些状态信息给用户直观感受当前的状态,此时需要使用 getStats 进行获取并解析展示给用户,接口调用比较简单,但是获取到的数据非常的多,刚开始看会抓不到重点,这篇文章记录一下我在使用过程中常用的一些参数信息。
getStats 返回的结果是一个支持遍历的对象,可以通过 type 来判断统计类别的名称。
往返时间RTT
这个参数表示当前客户端到对端的网络延迟,在我的视频会议应用中会显示一个到服务器的延时,这个参数在 type
为 remote-inbound-rtp
的对象中,单位是秒。
接收端丢包
因为 WebRTC 是基于 UDP 的,接收端在网络不好的情况下会出现丢包,这个结果在 type
为 inbound-rtp
的对象的 packetsLost
属性中,需要注意的是,每个视频轨和音频轨是独立统计的,显示给客户时需要把结果加起来。
发送端视频分辨率、帧率
使用 getUserMedia 获取视频时可以指定获取到的 MediaStream 的分辨率,但是实际发送出去的视频分辨率不一定和 MediaStream 一致,type
为 outbound-rtp
对象的 frameHeight
、frameWidth
、framesPerSecond
是当前编码后的视频高度宽度和帧率。
发送端码率
相对与上面几个获取之后就可以直接使用的参数,码率的显示相对来说就会比较麻烦。
在获取的统计信息中,我们能够拿到的信息分别为 timestamp
、bytesSent
、headerBytesSent
这些,这些数数据也是在 type
为 outbound-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。
接收端视频分辨率、帧率
接收端的分辨率和帧率信息在 type
为 inbound-rtp
的对象中,参数名也是 frameHeight
、frameWidth
和 framesPerSecond
。
接收端码率
接收端的码率计算和发送端基本一致,只是数据来源需要变成 type
为 inbound-rtp
对象的 bytesReceived
和 headerBytesReceived
,每条轨道也是单独统计的。
打个广告,最新在找工作,希望有 WebRTC 前端或者前端音视频相关岗位可以帮我内推一下,留言或邮件都可以,邮箱是 kunkkaco@gmail.com。