主觀評定方法-MOS(Mean Opinion Score)
?
Freeswitch計算MOS值主要通過以下代碼實現(xiàn):
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
從字面意思很容易理解,意思是從統(tǒng)計開始到該時刻收到的rtp包數(shù)量,其中關(guān)鍵的一項rtp_session->stats.inbound.flaws
由幾個部分組成,從代碼中可以分析得知有丟包、傳輸同步損傷和延時損傷的統(tǒng)計。
5 - 完美,如同面對面地交流
4 - 不錯,有不完美的地方,但還是很清晰的。手機的通話質(zhì)量通常被認(rèn)為是在這個范圍內(nèi)
3 - 很嘈雜
2 - 非常嘈雜,基本不可能通話
1 - 不可能通話
每收到一個RTP包都會進行do MOS的計算,首先獲取sequence對比前一個sequence,從而得知是否丟包,并且每隔5秒會強制(force)執(zhí)行do MOS。
丟包
當(dāng)seq>0 && seq > last_processed_seq + 1(last_processed_seq上一步處理的包序號)。
lost = seq - last_processed_seq – 1
flaws += lost
傳輸同步損傷
是當(dāng)執(zhí)行同步刷新緩沖區(qū)的時候,緩沖區(qū)內(nèi)的包數(shù)。
flush :flaws += sync_packets
reset jitter : Last_flaws = 0
延遲損傷
由于延遲統(tǒng)計的延遲期間填充的靜音包數(shù)。
媒體在讀取A方rtp session的時候一個讀取周期內(nèi)讀到了不止一個packet(可能之前幾個讀取周期內(nèi)存在沒能讀取的情況)就會有syncing 1 audio packet(s) ,這時候A方的rtp state統(tǒng)計過程會跳過10個包再進行統(tǒng)計。
媒體讀取A方丟掉一個包會產(chǎn)生lost,之前會有rtp session在好幾個讀周期里沒有讀到packet。
網(wǎng)絡(luò)正常的時候讀取跟寫回是同一時刻。