背景
在弱網環境下如果丟了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代碼,瀏覽器基本沒有辦法。