當收到乙個包時,丟包判斷原理:
/*
sequence_number:當前收到的包的序列號
timestamp:當前收到的包的時間戳
*/void nacktracker:
:updatelastreceivedpacket
(uint16_t sequence_number, uint32_t timestamp)
return;}
/* 如果是上乙個包, */
if(sequence_number == sequence_num_last_received_rtp_)
return
;/* nack_list_:丟包集合 */
nack_list_.
erase
(sequence_number);/*
將當前包 與 最近收到的新包 對比,判斷當前包是否為重傳或亂序包
是的話,直接返回
*/if(
isnewersequencenumber
(sequence_num_last_received_rtp_, sequence_number)
)return
;/* 對比 當前包 與 最新收到的包 的序列號與時間戳,更新每個包的樣本數:samples_per_packet_ */
updatesamplesperpacket
(sequence_number, timestamp)
;/* 更新丟包集合:nack_list_ */
updatelist
(sequence_number)
;/* 更新最新收包的序列號與時間戳 */
sequence_num_last_received_rtp_ = sequence_number;
timestamp_last_received_rtp_ = timestamp;
/* 丟棄掉集合 nack_list_ 中不能重傳的包資訊,同時保證集合容量不超過限制 */
limitnacklistsize()
;}
void nacktracker:
:updatelist
(uint16_t sequence_number_current_received_rtp)
void nacktracker:
:changefromlatetomissing
(uint16_t sequence_number_current_received_rtp)
void nacktracker:
:addtolist
(uint16_t sequence_number_current_received_rtp)
}
void nacktracker:
:limitnacklistsize()
WebRTC中丟包重傳機制的實現
當網路質量突然變的很差並開始丟包時,聲音聽起來音質會變差,畫面幀速會下降,甚至會完全卡住。我們可能需要某種機制來應對這種情況。在webrtc中,主要有兩種機制來應該網路變差的情況 前向糾錯 在每個資料報中,您將新增一些關於前乙個資訊的資訊,以防丟失,您需要重新構建它們 flexfec是webrtc ...
webrtc研究 remb協議分析
分析入口 webrtc ideo vie remb.cc void vieremb onreceivebitratechanged const std vector ssrcs,uint32 t bitrate bitrate bitrate calculate total receive bitr...
UDP丟包原因
一 主要丟包原因 1 接收端處理時間過長導致丟包 呼叫recv方法接收端收到資料後,處理資料花了一些時間,處理完後再次呼叫recv方法,在這二次呼叫間隔裡,發過來的包可能丟失。對於這種情況可以修改接收端,將包接收後存入乙個緩衝區,然後迅速返回繼續recv。2 傳送的包巨大丟包 雖然send方法會幫你...