使用RemoteBitrateEstimatorAbsSendTime的時候發現剛剛開始會出現大量的Probe failed, sent at
這樣的打印,然後打印等級是Info(這個等級的打印說明問題不大),但是還是看了一下代碼瞭解一下是什麼原因導致的。這個是因爲收到的包過於密集導致的,出現大量的接收或者發送的包間隔不到1毫秒(ComputeClusters函數)。
- 當且僅當發送間隔和接收間隔都大於等於1毫秒的時候,這個變量
num_above_min_delta
纔會自加。正確的包都會使變量count
自加。 - 當
num_above_min_delta
的個數小於一半count
的個數的時候就會打印一下我們看到的這種log - 爲什麼會出現這樣的情況呢,具體閱讀平滑發送模塊代碼
PacedSender
就知道了,這個是因爲一開始堆積的數據量大和起始發送碼率大pacing_bitrate_kbps_
,然後單個包較小,單次發送的包個數就多(音頻包的優先級高,會一次性發送所有的音頻包,視頻包會平滑發送PacedSender::SendPacket
)
void RemoteBitrateEstimatorAbsSendTime::ComputeClusters(
std::list<Cluster>* clusters) const {
Cluster current;
int64_t prev_send_time = -1;
int64_t prev_recv_time = -1;
for (std::list<Probe>::const_iterator it = probes_.begin();
it != probes_.end();
++it) {
if (prev_send_time >= 0) {
int send_delta_ms = it->send_time_ms - prev_send_time;
int recv_delta_ms = it->recv_time_ms - prev_recv_time;
if (send_delta_ms >= 1 && recv_delta_ms >= 1) {
++current.num_above_min_delta;
}
if (!IsWithinClusterBounds(send_delta_ms, current)) {
if (current.count >= kMinClusterSize)
AddCluster(clusters, ¤t);
current = Cluster();
}
current.send_mean_ms += send_delta_ms;
current.recv_mean_ms += recv_delta_ms;
current.mean_size += it->payload_size;
++current.count;
}
prev_send_time = it->send_time_ms;
prev_recv_time = it->recv_time_ms;
}
if (current.count >= kMinClusterSize)
AddCluster(clusters, ¤t);
}
std::list<Cluster>::const_iterator
RemoteBitrateEstimatorAbsSendTime::FindBestProbe(
const std::list<Cluster>& clusters) const {
int highest_probe_bitrate_bps = 0;
std::list<Cluster>::const_iterator best_it = clusters.end();
for (std::list<Cluster>::const_iterator it = clusters.begin();
it != clusters.end();
++it) {
if (it->send_mean_ms == 0 || it->recv_mean_ms == 0)
continue;
if (it->num_above_min_delta > it->count / 2 &&
(it->recv_mean_ms - it->send_mean_ms <= 2.0f &&
it->send_mean_ms - it->recv_mean_ms <= 5.0f)) {
int probe_bitrate_bps =
std::min(it->GetSendBitrateBps(), it->GetRecvBitrateBps());
if (probe_bitrate_bps > highest_probe_bitrate_bps) {
highest_probe_bitrate_bps = probe_bitrate_bps;
best_it = it;
}
} else {
int send_bitrate_bps = it->mean_size * 8 * 1000 / it->send_mean_ms;
int recv_bitrate_bps = it->mean_size * 8 * 1000 / it->recv_mean_ms;
LOG(LS_INFO) << "Probe failed, sent at " << send_bitrate_bps
<< " bps, received at " << recv_bitrate_bps
<< " bps. Mean send delta: " << it->send_mean_ms
<< " ms, mean recv delta: " << it->recv_mean_ms
<< " ms, num probes: " << it->count;
break;
}
}
return best_it;
}