webrtc研究 remb協議分析

2021-07-25 13:09:09 字數 3413 閱讀 4220

分析入口 webrtc/ideo/vie_remb.cc

void vieremb::onreceivebitratechanged(const

std::vector

& ssrcs,

uint32_t bitrate)

}bitrate_ = bitrate;

// calculate total receive bitrate estimate.

int64_t now = clock_->timeinmilliseconds();

if (now - last_remb_time_ < krembsendintervalms)

last_remb_time_ = now;

if (ssrcs.empty() || receive_modules_.empty())

// send a remb packet.

/*

if (!rtcp_sender_.empty())

else

*/if (!receive_modules_.empty())

else

last_send_bitrate_ = bitrate_;

}if (sender)

}} // namespace webrtc

在改新版webrtc時, 原有的tmmbr/tmmbn改為remb,因為業務需求修改了伺服器邏輯,再使用時,發現remb的請求位元速率一直上不去,分析原因,找個函式作為入口,分析remb的生成計算

呼叫順序

remote_bitrate_estimator_single_stream.cc

void remotebitrateestimatorsinglestream::process()

之後 remote_bitrate_estimator_single_stream.cc

void remotebitrateestimatorsinglestream::updateestimate(int64_t now_ms)

之後 vie_remb.cc

void vieremb::onreceivebitratechanged(const std::vector& ssrcs, uint32_t bitrate)

好吧,發現是在這條道上產生的,之後發現在

remote_bitrate_estimator_single_stream.cc

void remotebitrateestimatorsinglestream::updateestimate(int64_t now_ms)

void remotebitrateestimatorsinglestream::updateestimate(int64_t now_ms) 

}

位元速率在此計算?

const ratecontrolinput input(bw_state,

incoming_bitrate_.rate(now_ms),

mean_noise_var);

進入 incoming_bitrate_.rate(now_ms)

**進入,期待解開真相。。。這***都是些啥啥啊

rate_statistics.cc

rtc::optionalratestatistics::rate(int64_t now_ms) const 

float scale = scale_ / active_window_size;

return rtc::optional(

static_cast

(accumulated_count_ * scale + 0.5f));

}

scale_ 是固定的8000

accumulated_count_ * scale + 0.5f

accumulated_count_ *scale_ /(now_ms - oldest_time_ + 1) + 0.5f

如果沒有推測錯 accumulated_count_ 就是在now_ms - oldest_time_時間接受到的位元組數 單位kb,

然後計算出單位時間可以接受的頻寬, 單位bit

繼續順藤摸瓜, 驗證推測

void ratestatistics::update(size_t count, int64_t now_ms) 

eraseold(now_ms);

// first ever sample, reset window to start now.

if (!isinitialized())

oldest_time_ = now_ms;

uint32_t now_offset = static_cast

(now_ms - oldest_time_);

rtc_dcheck_lt(now_offset, max_window_size_ms_);

uint32_t index = oldest_index_ + now_offset;

if (index >= max_window_size_ms_)

index -= max_window_size_ms_;

buckets_[index].sum += count;

++buckets_[index].samples;

accumulated_count_ += count;

++num_samples_;

}

看到accumulated_count_ += count;

呼叫順序

rtp_stream_receiver.cc

bool rtpstreamreceiver::deliverrtp(const uint8_t* rtp_packet,

size_t rtp_packet_length,

const packettime& packet_time)

之後 congestion_controller.cc

void incomingpacket(int64_t arrival_time_ms,

size_t payload_size,

const rtpheader& header)

之後 remote_bitrate_estimator_single_stream.cc

void remotebitrateestimatorsinglestream::incomingpacket

之後 rate_statistics.cc

void ratestatistics::update(size_t count, int64_t now_ms)

簡單理解 就是接收到資料記個數

???remb就是接受到的頻寬???,是不是**看漏了

webRTC協議分析

http hyper text transport protocol 超文字傳輸協議 應用層協議 包括 sip websocket 和 xmpp websocket 子協議 nat 會話穿透實用工具 回話建立之前會傳送stun報文進行測試 確定是否位於nat之後並發現對映位址和埠 這些資訊用於構建i...

WebRTC研究 audio 丟包判斷

當收到乙個包時,丟包判斷原理 sequence number 當前收到的包的序列號 timestamp 當前收到的包的時間戳 void nacktracker updatelastreceivedpacket uint16 t sequence number,uint32 t timestamp r...

webrtc 和 rtp 協議 之sctp

webrtc和rtp 一 pion的datachannel示例 zoom公司大家其實都知道,會議的體驗很好,因為他們善用了datachannel,有興趣大家可以仔細研究,推敲,到了今天,技術和核心技術得不到大家的理解,很多人依然認為技術可以獲取,缺的是錢,事實上,兩個都缺。sctp協議可以適用tcp...