WebRTC-前端分析端到端延迟

在某些WebRTC业务场景中对延迟非常敏感。对于前端来说WebRTC是黑盒的,发生问题时排查原因非常困难。好在WebRTC提供了googTimingFrameInfo这个字段来用于分析端到端的分段延迟。

使用流程

获取Receiver

当PeerConnection建立连接成功后,先通过PeerConnection的getReceivers方法来获取到接收的Receiver数组。一般情况,一个PeerConnection会接收一路视频和一路音频(当然也有特殊情况会有一路音频+多路视频)。

const receiverArr: RTCRtpReceiver[] = peerConnection.getReceivers();
for (let i = 0; i < receiverArr.length; ++i) {
  if (receiverArr[i].track.kind === "video") {
    const receiver: RTCRtpReceiver = receiverArr[i];
    // 找到receiver
    break;
  }
}

获取googTimingFrameInfo内容

通过RTCRtpReceiver.getStats方法获取googTimingFrameInfo的内容

reveiver.getStats().then((report: RTCStatsReport) => {
  report.forEach((stats: RTCStats) => {
    if (stats.type === "inbound-rtp") {
      console.log("googTimingFrameInfo:", stats.googTimingFrameInfo);
    }
  })
})

解析googTimingFrameInfo的内容

/**
*  解析googTimingFrameInfo的方法
*/
function parseGoogTimingFrameInfo (googTimingFrameInfoStr: string): void {
  const arr: string[] = googTimingFrameInfoStr.split(',');
  if (arr.length === 15) {
    const capture_time_ms: number = parseInt(arr[1]);
    const encode_start_ms: number = parseInt(arr[2]);
    const encode_finish_ms: number = parseInt(arr[3]);
    const packetization_finish_ms: number = parseInt(arr[4]);
    const pacer_exit_ms: number = parseInt(arr[5]);
    const receive_start_ms: number = parseInt(arr[8]);
    const receive_finish_ms: number = parseInt(arr[9]);
    const decode_start_ms: number = parseInt(arr[10]);
    const decode_finish_ms: number = parseInt(arr[11]);
    const render_time_ms: number = parseInt(arr[12]);
    console.log(`采集到送编码耗时:${encode_start_ms - capture_time_ms}`);
    console.log(`编码耗时:${encode_finish_ms - encode_start_ms}`);
    console.log(`打包耗时:${packetization_finish_ms - encode_finish_ms}`);
    console.log(`打包完成到发送耗时:${pacer_exit_ms - packetization_finish_ms}`);
    console.log(`接收耗时:${receive_finish_ms - receive_start_ms}`);
    console.log(`接收完成到送解码耗时:${decode_start_ms - receive_finish_ms}`);
    console.log(`解码耗时:${decode_finish_ms - decode_start_ms}`);
    console.log(`解码完成到送渲染耗时:${render_time_ms - decode_finish_ms}`);
  }
}

总结

通过解析googTimingFrameInfo的内容,我们可以分析端到端的过程中,具体是哪一个环节导致了延迟变大。通过分析结果,才能进行有效的优化。

其他

如果你也是专注前端多媒体或者对前端多媒体感兴趣,可以搜索微信公众号"前端多媒体"

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆包啊啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值