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

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