WebRTC、Janus卡顿优化实践(SPS、PPS丢包)

背景

在弱网环境下如果丢了SPS、PPS,会发生较长时间的卡顿。

服务端

Janus

版本

66

详述

      在视频通话时,WebRTC发送端发送的第一个RTP包只包含SPS、PPS,第二个包是IDR帧,接收端收到后会把SPS、PPS、IDR帧合成一个Buffer传给解码器,这样才能正确解码。
      当SPS、PPS发生丢包时,WebRTC在收到第一个IDR帧的包后检查SPS、PPS,如果缺失,则丢弃该包,并发送一个PLI包,期望从发送端获取一个I帧,这期间即使NACK机制重发了SPS、PPS,接收端也不会正确处理。这样,在WebRTC客户端从Janus拉流的情况下就依赖Janus对PLI包的处理,目前Janus没有转发该包(考虑多人同时拉流的情况),需要自己做I帧的发送逻辑(支持所谓的秒开),如果Janus的I帧间隔比较大,就会有比较大的卡顿。
      其他非关键帧包的丢包通过NACK重发即可恢复,即使没有恢复,也不会出现长时间的卡顿。

解决

      在SPS、PPS丢失的情况下,缓存第一个IDR帧的包,通过NACK等丢包重传机制重新获取到SPS、PPS后重新处理IDR帧,这样可以有效缓解卡顿。当然,这个需要修改WebRTC的Native代码,浏览器基本没有办法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章