WebRtc弱网检测——IOS-SWIFTUI

1 篇文章 0 订阅
本文介绍了如何通过WebRTC的统计信息,特别是MOS值、数据包丢失、往返时间和抖动,来判断视频通话的连接质量,包括如何计算MOS并将其作为弱网或网络异常的指标。
摘要由CSDN通过智能技术生成

在使用WebRtc进行视频/音频通话时,您是否遇到过需要判断连接质量的好坏,也就是“弱网判断” ,在本文中,将会介绍一种测量客户端连接质量的方法(基于 WebRTC 统计数据)

这里 MOS(平均意见得分)是表示音视频通话主观质量的分数(顺便说一下,它不仅用于在线会议)。在这种情况下。该分数应该给出连接质量的一些排名值,等级值通常基于 ACR(绝对类别排名):

  • 5 — 优秀
  • 4 — 良好
  • 3 — 一般
  • 2 — 较差
  • 1 — 差

测量的 MOS 值通常是小数,优秀的质量在 4.5–4.3 之间。当分数低于 3.5 时,音视频通话看起来会非常卡顿。但当然,您可以调整自己的应用程序的级别。

要计算MOS,我们需要知道数据包丢失(丢失了多少数据包:发送100个数据包,接收95个数据包意味着我们有5%的数据包丢失)、往返时间(数据包到达目的地和返回目的地所需的时间)和抖动(数据包抵达时间的变化或延迟变化的程度)

幸运的是,在WebRtc中,使用RTCPeerConnection:getStats()方法可以从WebRTC统计API接收所有必要的值

ssrc

每一个发送或接受的音频或视频Track都有一个对应的ssrc报告,ssrc报告中包含了track的当前相关信息(音|视频以及收发 track的信息不都是相同的)。通过mediaType以及id后缀区分

  • mediaType:媒体类型video/audio
  • packetsSent:累计发送的数据包数
  • googJitterReceived:接收到多少抖动
  • id:后缀用来区分是发送或接受的ssrc,发送: _send,接收: _recv
  • googTrackId:音频或视频TrackId
  • googRtt:全称为:Round-trip time,表示的是请求的往返时间,是发送端从接收端发送过来的RTCP中得到时间戳通过计算得到往返时延
  • transportId:指向传输RTP流的部分,通常于音频或视频流的transportId是一样的
  • googCodecName:编码器的名称,音频一般是opus,视频一般为:VP8、VP9、H264
  • codecImplementationName:具体实现编码器的名称,一般MediaCodec等
  • audioInputLevel:发送端采集的音频能量大小
  • audioOutputLevel:扬声器播放的音量大小
  • bytesSent:累计发送数据的字节数
  • framesEncoded:累计编码出的视频帧数量
  • packetsLost:累计丢包数量,对于发送端从接收端发送过来的RTCP Receiver Report中得到累计丢包数量,可以和googNacksReceived数据进行对照,对于接收端来说,丢包数量是本地测量出来的。
  • googNacksReceived:发送端收到的重传包请求(nack)数量,可以和packetsLost进行对照
  • qpSum:全称为:Quantization Parameter,发送端编码出的带有量化参数(QP)值的帧的数量,一般来说,这个数字越高,视频轨道压缩的越严重,需要注意,QP值可能因编码器不同而不同,所以此值仅在与同一编码器进行比较时可能有用
  • googAdaptationChanges:发送端因为CPU的负载变化导致的分辨率变高或变低的次数,需要设置googCpuOveruseDetection
  • googAvgEncodeMs:发送端平均编码时间,值越小越好
  • googBandwidthLimitedResolution:是否因为宽带受限而降低发送的视频分辨率
  • googCpuLimitedResolution:是否因为CPU不足而降低发送的视频分辨率
  • googEncodeUsagePercent:发送端(平均每帧编码时间)/(平均每帧采集时间),主要是用来反映编码效率
  • googFirsReceived:发送端收到的关键帧请求数量,Fir全称为:Full Intra Request,一般来说在video conference模式下,有新的参与者进来会发出
  • googPlisReceived:发送端收到的古建筑请求数量, pli全称为:Picture Loss Indication,一般来说接码失败时会发出
  • googFrameHeightSent:发送端发送的视频分辨率高度,根据当前网络会进行动态调整
  • googFrameWidthSent:发送端发送的视频分辨率宽度,根据当前网络会动态调整
  • googFrameRateInput:发送端设置的初始帧率
  • googFrameRateSent:发送端实际发送的帧率,根据当前网络会动态调整
  • googFrameHeightReceived:接收到的视频分辨率高度
  • googFrameWidthReceived:接收到的视频分辨率宽度

计算通话质量分数方法

// 定义计算网络状态的方法
    func calculateNetworkStatus(roundTripTime: Double, jitter: Double, packetLoss: Double) -> Double {
        let computationTime = 10.0
        let effectiveRoundTripTime = roundTripTime + jitter * 2 + computationTime
        
        var rFactor: Double
        
        if effectiveRoundTripTime < 160 {
            rFactor = 93.2 - (effectiveRoundTripTime / 40)
        } else {
            rFactor = 93.2 - (effectiveRoundTripTime / 120) - computationTime
        }
        
        let lostPacketsImpactCoef = 2.5
        rFactor = rFactor - (packetLoss * lostPacketsImpactCoef)
        
        let mos = 1 + (0.035) * rFactor + (0.000007) * rFactor * (rFactor - 60) * (100 - rFactor)
        
        return mos
    }

RoundTripTime、Jitter和PacketLoss值取自WebRTC统计信息。我们在计算EffectiveRoundTripTime时将抖动的影响增加了一倍,并添加了一些固定的ComputationTime来补偿网络协议和计算延迟。RFactor值取决于给定的EffectiveRoundTripTime(或延迟)。连接质量越差,RFactor值就越低。

返回的MOS值可以用作确定连接状态的依据之一

假设我们设定MOS<=3.3,作为网络异常的判断依据,MOS<=3.9,作为弱网情况的判断依据。
我们可以依据MOS显示一个指示器,让用户了解网络不正常。该机制也可以用作自动关闭视频的方式,或者用于减少页面上的视频元素量(赋予会议音频优先级)。

参数说明

  • roundTripTime : ssrc信息中的 googRtt
  • jitter : ssrc信息中的googJitterReceived
  • packetLoss : 表示在两次统计之间接收的数据包丢包率,即 (packetsLost/(packetsSent + packetsLost))

参考来源
https://en.wikipedia.org/wiki/Mean_opinion_score
https://telecom.altanai.com/tag/rfactor/
https://github.com/VLprojects/webrtc-issue-detector

  • 17
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值