FreeSWITCH中MOS的计算

主观评定方法-MOS(Mean Opinion Score)


1.png

Freeswitch计算MOS值主要通过以下代码实现:

R = (int)((double)((double)(rtp_session->stats.inbound.recved - rtp_session->stats.inbound.flaws) / (double)rtp_session->stats.inbound.recved) * 100.0);

rtp_session->stats.inbound.mos = 1 + (0.035) * R + (.000007) * R * (R-60) * (100-R);

rtp_session->stats.inbound.recved

从字面意思很容易理解,意思是从统计开始到该时刻收到的rtp包数量,其中关键的一项rtp_session->stats.inbound.flaws由几个部分组成,从代码中可以分析得知有丢包、传输同步损伤和延时损伤的统计。

2.png

5 - 完美,如同面对面地交流
4 - 不错,有不完美的地方,但还是很清晰的。手机的通话质量通常被认为是在这个范围内
3 - 很嘈杂
2 - 非常嘈杂,基本不可能通话
1 - 不可能通话

3.png

每收到一个RTP包都会进行do MOS的计算,首先获取sequence对比前一个sequence,从而得知是否丢包,并且每隔5秒会强制(force)执行do MOS。

丢包

当seq>0 && seq > last_processed_seq + 1(last_processed_seq上一步处理的包序号)。

lost = seq - last_processed_seq – 1

flaws += lost

传输同步损伤

是当执行同步刷新缓冲区的时候,缓冲区内的包数。

flush :flaws += sync_packets

reset jitter : Last_flaws = 0

延迟损伤

由于延迟统计的延迟期间填充的静音包数。

媒体在读取A方rtp session的时候一个读取周期内读到了不止一个packet(可能之前几个读取周期内存在没能读取的情况)就会有syncing 1 audio packet(s) ,这时候A方的rtp state统计过程会跳过10个包再进行统计。

媒体读取A方丢掉一个包会产生lost,之前会有rtp session在好几个读周期里没有读到packet。

网络正常的时候读取跟写回是同一时刻。

你可能感兴趣的:(FreeSWITCH中MOS的计算)