1. 程式人生 > >WebRTC、Janus卡頓優化實踐(SPS、PPS丟包)

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程式碼,瀏覽器基本沒有辦法。