主观评定方法-MOS(Mean Opinion Score)
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
由几个部分组成,从代码中可以分析得知有丢包、传输同步损伤和延时损伤的统计。
5 - 完美,如同面对面地交流
4 - 不错,有不完美的地方,但还是很清晰的。手机的通话质量通常被认为是在这个范围内
3 - 很嘈杂
2 - 非常嘈杂,基本不可能通话
1 - 不可能通话
每收到一个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。
网络正常的时候读取跟写回是同一时刻。