WebRTC 之度量与统计: 到底出了什么问题

2021-07-14  本文已影响0人  老瓦在霸都

由于新冠疫情,我们待在家中,在网上工作,开会,看电影的时间越来越多了。网络嘛,大家都知道,时常不稳定,网上开会时声音听不清楚,图像模糊,视频有马赛克(不是人为打的)的情况时有发生,这时候,问题出在哪里呢?
也许是网络的问题,也许不是,即使网络出现问题,只要不是不可忍受的,我们依然需要进行调整,保证基本的功能:

  1. 语音通话要保持通畅,这是要首先保证的
  2. 共享的桌面或文件内容要能够识别
  3. 视频要能看到,哪怕分辨率低点也行

首要的事情是要搞清楚出了什么问题?网络传输问题,设备问题,编解码的问题,还是音视频源的问题?

网络抓包后分析媒体流是常规的媒体质量分析方法,可是用户和服务器都不可能让你随时随地去抓包,何况还有安全和隐私问题的红线。所以剩下的选择就是度量 metrics, 做好度量就能见微知著,透过现象看本质,为上述问题找出答案。

先看一个例子 WebRTC Statistics Example, 源码很简单,参见

就是建立一个本地端到端的连接,将收集到的统计数据打印出来

1) Audio Inbound-rtp 接收的 Audio RTP 数据度量

注:

注1:dB(SPL)表示 dB(声压级,sound pressure level)意为在空气或其它气体中的声压,其参考值为20微帕斯卡 (μP_a) = 2×10^{−5} P_a,这是人能听到的最安静的声音。大致相当于3米外蚊子飞行的声音。经常被缩写为"dB",这造成了很多误解以为"dB"是个有量纲的绝对单位。对于水声或其它液体,参考值是1 μPa。 dBov or dBO 意为 dB(过载,overload)– 信号的幅值,其参照于设备的最大在限幅(clipping)发生前的最大允许值。

注2:声压指声音的强度 L_p = 20 log_{10}(P_{rms}/P_{ref}) dB, 单位是分贝,分贝是一个比值,分母 P_{ref} 是 20 微帕, 20 微帕是人耳所能听到的最低的声音强度。

可以如下公式来转换为这些单位 Math.sqrt(totalAudioEnergy/totalSampleDuration), 而计算平均音频电平的公式为 Math.sqrt((energy2 - energy1)/(duration2 - duration1))

例如, 如果生成一个 10ms 音频数据包, 其 RMS 为 0.5(超过 1.0), 则将 0.5 * 0.5 * 0.01 = 0.0025 加到 totalAudioEnengy, 如果另外一个 10ms 音频数据包,其 RMS 为 0.1,则添加 0.0001 到 totalAudioEnengy。 然后,Math.sqrt(totalAudioEnergy/totalSamplesDuration) 变为 Math.sqrt(0.0026/0.02) = 0.36,这与通过对连续 20 毫秒音频段进行 RMS 计算获得的值相同。

如果使用多个音频通道,则样本的音频能量是指任一通道的最高能量。

2) Audio outbound-rtp 发送的 Audio RTP 数据度量

3) Video Inbound-rtp 接收的 Video RTP 数据度量

注:

可根据公式:(totalSquaredInterFrameDelay - totalInterFrameDelay^2/framesDecoded)/framesDecoded,从totalInterFrameDelay、totalSquaredInterFrameDelay 和framesDecoded 计算帧间延迟方差。

4) Video outbound-rtp 发送的 Video RTP 数据度量

WebRTC statistics API

详细的 API 和数据结构定义参见 https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/getStats

全部的度量指标

参见 https://www.w3.org/TR/webrtc-stats/#summary

度量驱动改进

我们可以用各种工具来更改网络条件,例如延迟,丢包,抖动等,观察度量指标的变化.

以我常用的 macos 为例,可以安装 Network Link Cponditioner 对本地发送接收的网络条件进行调整,再观察应用的度量指标。

这样在系统设置里可以看到 Network Link Conditioner 的图标

然后点击 "Manage Profiles", 对上行(uplink) 和下行 (downlink) 的带宽(bandwidth),丢包(packet loss), 延迟(delay) 进行调整:

至于 windows ,我们可以使用 Clumsy 来更改网络参数, 下载地址有 https://jagt.github.io/clumsy/download.html
Manual: https://jagt.github.io/clumsy/manual.html, 界面如下

至于 Linux 服务器,可以使用 Linux Traffic Control 的 netem 模块来模拟网络异常, 例如想要在服务器上添加 200ms 的延迟

apt-get install iproute
tc qdisc add dev eth0 root netem delay 200ms
tc qdisc show  dev eth0

参考资料

上一篇 下一篇

猜你喜欢

热点阅读