Closed shentu521 closed 5 years ago
void pace_try_transmit(pace_sender_t pace, int64_t now_ts) { int elapsed_ms; uint32_t target_bitrate_kbps; int sent_bytes; packet_event_t ev;
elapsed_ms = (int)(now_ts - pace->last_update_ts);
if (elapsed_ms < k_min_packet_limit_ms)
return;
elapsed_ms = SU_MIN(elapsed_ms, k_max_interval_ms);
//budget是个评估单位时间内可以发送多少数据量的一个机制
/*计算media budget中需要的码率,并更新到media budget之中*/
if (pacer_queue_bytes(&pace->que) > 0){
//通过media_budget模块来计算本次理应发送的字节数
//然后和实际发送的字节数进行对比!!!!
target_bitrate_kbps = pacer_queue_target_bitrate_kbps(&pace->que, now_ts);
target_bitrate_kbps = SU_MAX(pace->pacing_bitrate_kpbs, target_bitrate_kbps);
}
else
target_bitrate_kbps = pace->pacing_bitrate_kpbs;
这个target_bitrate_kbps不是应该根据发送端和接收端的网络情况综合得出吗?如果按代码缩写,那就是500ms非得把缓冲区中剩余的数据发光?
oldest是缓冲区中最早待发送的包,目的是为了计算缓冲区延迟长度。
这个500毫秒的意思是pace最大的延迟为500毫秒,不是一个绝对值,如果是绝对值,容易引起很大的延迟。pacer只是为了平滑发送,不是码率控制,码率控制是通过拥塞控制得到,再通知给上层的数据源来改变编码码率。
感谢老大不吝指教,再继续好好研究
缓冲区中有100个数据,oldest就是第一个数据包的时间戳,第一个数据包发送出去后,oldtest就变为了第二个数据包的时间戳,也就是oldtest是缓冲区中最早待发送的包,懂了,谢谢老大指点.
uint32_t pacer_queue_target_bitrate_kbps(pacer_queue_t* que, int64_t now_ts) { uint32_t ret = 0, space;
}
老大,请教下,这行代码,为什么是500毫秒?
还有: now_ts - que->oldest_ts;
que->oldest_ts应该是代表的发送的第一帧的时间戳把,也就是: now_ts - que->oldest_ts; 如果是第100帧,400,600,等等,未来的某些时刻,这个space就永远为500了?