带宽控制

上行带宽控制

    webrtc/modules/bitrate_controller

下行带宽估计

    remote_bitrate_estimator

节拍器

    pacing

视频编码完成后,首先放入pacing,经pacing平滑发送

rtp_rtcp rtp_sender.cc SendToNetwork

 if (paced_sender_) {uint16_t seq_no = packet->SequenceNumber();uint32_t ssrc = packet->Ssrc();// Correct offset between implementations of millisecond time stamps in// TickTime and Clock.int64_t corrected_time_ms = packet->capture_time_ms() + clock_delta_ms_;size_t payload_length = packet->payload_size();packet_history_.PutRtpPacket(std::move(packet), storage, false);paced_sender_->InsertPacket(priority, ssrc, seq_no, corrected_time_ms,payload_length, false);if (last_capture_time_ms_sent_ == 0 ||corrected_time_ms > last_capture_time_ms_sent_) {last_capture_time_ms_sent_ = corrected_time_ms;TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),"PacedSend", corrected_time_ms,"capture_time_ms", corrected_time_ms);}return true;}

由此数据进去pcaedSender
记录进入数据的时间和大小

void PacedSender::InsertPacket(RtpPacketSender::Priority priority,uint32_t ssrc,uint16_t sequence_number,int64_t capture_time_ms,size_t bytes,bool retransmission) {CriticalSectionScoped cs(critsect_.get());RTC_DCHECK(estimated_bitrate_bps_ > 0)<< "SetEstimatedBitrate must be called before InsertPacket.";int64_t now_ms = clock_->TimeInMilliseconds();prober_->OnIncomingPacket(bytes);if (capture_time_ms < 0)capture_time_ms = now_ms;packets_->Push(paced_sender::Packet(priority, ssrc, sequence_number,capture_time_ms, now_ms, bytes,retransmission, packet_counter_++));
}

线程定期调用 PacedSender::Process()

 while (!packets_->Empty()) {// Since we need to release the lock in order to send, we first pop the// element from the priority queue but keep it in storage, so that we can// reinsert it if send fails.const paced_sender::Packet& packet = packets_->BeginPop();if (SendPacket(packet, probe_cluster_id)) {// Send succeeded, remove it from the queue.bytes_sent += packet.bytes;packets_->FinalizePop(packet);if (is_probing && bytes_sent > recommended_probe_size)break;} else {// Send failed, put it back into the queue.packets_->CancelPop(packet);break;}}

在 PacedSender::SendPacket 中

critsect_->Leave();const bool success = packet_sender_->TimeToSendPacket(packet.ssrc, packet.sequence_number, packet.capture_time_ms,packet.retransmission, probe_cluster_id);critsect_->Enter();

进入 PacketRouter::TimeToSendPacket

bool PacketRouter::TimeToSendPacket(uint32_t ssrc,uint16_t sequence_number,int64_t capture_timestamp,bool retransmission,int probe_cluster_id) {RTC_DCHECK(pacer_thread_checker_.CalledOnValidThread());rtc::CritScope cs(&modules_crit_);for (auto* rtp_module : rtp_modules_) {if (rtp_module->SendingMedia() && ssrc == rtp_module->SSRC()) {return rtp_module->TimeToSendPacket(ssrc, sequence_number,capture_timestamp, retransmission,probe_cluster_id);}}return true;
}

函数rtp_module->TimeToSendPacket,回归rtp_rtcp

bool ModuleRtpRtcpImpl::TimeToSendPacket(uint32_t ssrc,uint16_t sequence_number,int64_t capture_time_ms,bool retransmission,int probe_cluster_id) {if (SendingMedia() && ssrc == rtp_sender_.SSRC()) {return rtp_sender_.TimeToSendPacket(sequence_number, capture_time_ms,retransmission, probe_cluster_id);}// No RTP sender is interested in sending this packet.return true;
}

调用 bool RTPSender::TimeToSendPacket
调用 bool RTPSender::PrepareAndSendPacket
调用 bool RTPSender::SendPacketToNetwork

bool RTPSender::SendPacketToNetwork(const RtpPacketToSend& packet,const PacketOptions& options) {int bytes_sent = -1;if (transport_) {bytes_sent = transport_->SendRtp(packet.data(), packet.size(), options)? static_cast<int>(packet.size()): -1;if (event_log_ && bytes_sent > 0) {event_log_->LogRtpHeader(kOutgoingPacket, MediaType::ANY, packet.data(),packet.size());}}TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),"RTPSender::SendPacketToNetwork", "size", packet.size(),"sent", bytes_sent);// TODO(pwestin): Add a separate bitrate for sent bitrate after pacer.if (bytes_sent <= 0) {LOG(LS_WARNING) << "Transport failed to send packet";return false;}return true;
}

终于 transport_->SendRtp 发送去了
好吧, 我承认这些都是废话, 其实我是想看看码率调节在pacing中的影响,继续看看

webrtc 研究-带宽控制相关推荐

  1. WebRTC的带宽分配(1): 流级别分配

    今天来聊一聊WebRTC的带宽分配(BWA,Bandwidth Allocation),带宽分配是将带宽估计(BWE,Bandwidth Estimation)的结果分配到不同的流上面. 因此带宽分配 ...

  2. 容器开启数据服务之旅系列(四):Kubernetes QoS 助力在线运用与大数据离线运用的带宽控制和磁盘控制...

    容器开启数据服务之旅系列(四) Kubernetes QoS 助力在线运用与大数据离线运用的带宽控制和磁盘控制 概述 本文是2018年大数据峰会上的一些分享,关于在线业务,离线业务在ACK(阿里云容器 ...

  3. (4)Linux进程调度-组调度及带宽控制

    目录 背景 1. 概述 2. task_group 2.2 task_group权重 3. cfs_bandwidth 3.1 数据结构 3.2 流程分析 3.2.1 初始化流程 3.2.2 用户设置 ...

  4. tplink控制上网设备_在家办公视频会议学生上网课慢 - 带宽控制TP-Link 篇

    在家办公视频会议学生上网课慢 - 带宽控制TP-Link 篇 2020-03-09 19:52:10 3点赞 35收藏 7评论 你是AMD Yes党?还是intel和NVIDIA的忠实簇拥呢?最新一届 ...

  5. python openstack vpc互通_深入浅出新一代云网络——VPC中的那些功能与基于OpenStack Neutron的实现(二)-带宽控制...

    在VPC功能实现第一篇中,简单介绍了一下VPC网络对租户间隔离能力的提升以及基于路由提供的一系列网络功能.在这一篇中,将继续介绍VPC网络中十分重要的一个内容:网络带宽的控制,共享以及分离. 首先是对 ...

  6. libvirt使用之---使用tc实现kvm虚拟机带宽控制

    在kvm虚拟机管理的过程当中,对虚拟机带宽进行良好的控制是十分重要的. linux系统当中对网络带宽的控制一般都是使用tc命令实现,tc即是traffic control的缩写,在这里可以找到有关tc ...

  7. Linux进程调度 - 组调度及带宽控制 LoyenWang

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  8. 7、网络管理:ARP防范、带宽控制、补丁、监控上网

    主讲老师:郭盛华 ARP防范 网络经常掉线.发生IP冲突.担心通讯数据受到监控(如微信.QQ.邮件).网络速度受到网管软件限制(如聚生网管.P2P终结者).甚至深受各种ARP攻击软件之苦等这些问题是我 ...

  9. 研究人员使用宽场脑成像技术研究意图控制,探索更好的脑机接口使用方式

    通过我们对外部物体的感官体验,可以有效地控制外部物体.为了研究因果关系的学习和影响方式,研究人员设计了一种使用宽场钙信号(wide-field calcium signals)的脑机接口(BMI)任务 ...

  10. 研究人员通过小鼠控制光标来研究意图控制,探索更好的脑机接口使用方式

    点击上面"脑机接口社区"关注我们 更多技术干货第一时间送达 通过我们对外部物体的感官体验,可以有效地控制外部物体.为了研究因果关系的学习和影响方式,研究人员设计了一种使用宽场钙信号 ...

最新文章

  1. 标注工具_语料标注工具(2)
  2. 用python爬取网站数据期末作业_python实战第一周作业:爬取一页商品数据
  3. c++中的变量作用范围
  4. 蓝桥杯-K好数(java)
  5. 最简单的视音频播放示例9:SDL2播放PCM
  6. 基于机器学习的AI预测更智能?
  7. java连接Redis数据库
  8. 分治3--黑白棋子的移动
  9. 微型计算机原理中ADC,微机原理实验-逐比较式ADC.doc
  10. python机器学习库sklearn——k均值聚类
  11. clickhouse SummingMergeTree表引擎
  12. IE下调试CSS与JS
  13. pythoncad标注教程,AotuCAD国标字体和标注设置技巧图文教程
  14. 反编译so库破解so
  15. Word2016写论文之——常用操作总结
  16. 2022南理工824专考研经验
  17. 6617: Finite Encyclopedia of Integer Sequences
  18. 以“人民为中心”重新定义全球新型智慧城市, 2021-2022年中国新型智慧城市百强榜权威发布!
  19. vue实战之在线翻译项目
  20. zoj 2954 Hanoi Tower(汉诺塔)

热门文章

  1. 电脑是怎样执行编程语言的
  2. el表达试中三元用法
  3. laravel8的 Migration、Factory、Seeder
  4. Jquery 禁止键盘Backspace键
  5. 一文详解谷歌最新物联网操作系统 Android Things,话说还记得大明湖畔的Fuchsia吗?
  6. MySQL常用语句(二)
  7. 广告算法,反作弊,机器学习研发工程师
  8. Lonlife-ACM Round #7
  9. echarts自定义legend图例和tooltip默认提示文字
  10. 海明码的编码和校验方法