iT邦幫忙

2021 iThome 鐵人賽

DAY 27
1
Software Development

新手也能打造網路電話系統-WebRTC入門與活用系列 第 27

Day 27 - 進階篇 - 統計數據與分析

為了讓系統可以改良或更穩定,通常都需要收集數據並分析,而我們可藉由RTCRtpSenderRTCRtpReceivergetStats方法來取得WebRTC內建的統計數據。

//getStats方法會回傳Promise物件
const senderPromise = RTCRtpSender.getStats(); //傳送出去的資訊
const receiverPromise = RTCRtpReceiver.getStats(); //接收進來的資訊

取得編解碼格式資訊

getStats方法內包含了許多的統計數據,我們可以將type為codec的數據取出來,就能得知通話所採用的編解碼格式。若搭配之前所教的編解碼器設定,就可以看看系統是否選擇自己期望的編解碼器。

//Step1:取得統計資訊
senderVideo.getStats().then(res => {
    //Step2:取得每筆資訊的報告
    res.forEach(report => {
        //Step3:取得codec類型的報告
        if (report.type === 'codec') {
            console.log('codec report', report);
        }
    }
}
  • Step1:使用getStats方法取得統計資訊。
  • Step2:遍歷統計資訊所有類型的報告。
  • Step3:取得codec類型的報告結果,內部會描述通話所採用的codec格式。

取得位元速率與封包數資訊

我們可以將type為outbound-rtp的數據取出來,就能得知傳送給對方的資訊,包含資料量與封包數,但這裡的資訊都是總數,若要得到每秒的資訊就必須自行扣除上一次的資訊,來取得傳輸位元速率。

//Step1:取得統計資訊
senderVideo.getStats().then(res => {
    //Step2:取得每筆資訊的報告
    res.forEach(report => {
        //Step3:取得outbound-rtp類型的報告
        if (report.type === 'outbound-rtp') {
            console.log('outbound-rtp report', report);

            //Step4:判斷上一筆報告是否存在
            if (lastVideoReport && lastVideoReport.has(report.id)) {
                //Step5:計算位元速率與封包數
                const videoBitrate = Math.round(
                  8 * (report.bytesSent - lastVideoReport.get(report.id).bytesSent) / 
                  (report.timestamp - lastVideoReport.get(report.id).timestamp)
                );
                const packet = (report.packetsSent - lastVideoReport.get(report.id).packetsSent);
            
                console.log('VideoBitrate', `${videoBitrate} kbits/sec`);
                console.log('VideoPackets', packet);
            }
            //Step6:將這次的報告紀錄起來
            lastVideoReport = report;
        }
    }
}
  • Step1:使用getStats方法取得統計資訊。
  • Step2:遍歷統計資訊所有類型的報告。
  • Step3:取得codec類型的報告結果,內部會描述通話所採用的outbound-rtp格式。
  • Step4:判斷上一次的報告是否存在,以利後續計算每秒的數據。
  • Step5:將此次的報告與上次的報告相減,並計算出位元速率與封包數。
  • Step6:我們需要將此次的報告紀錄下來,以利下一次計算每秒的數據。

上一篇
Day 26 - 進階篇 - Codec設定
下一篇
Day 28 - 進階篇 - 測試工具與除錯
系列文
新手也能打造網路電話系統-WebRTC入門與活用30

尚未有邦友留言

立即登入留言