基于版本branch-headers-78,列出webrtc的码率设置的主要函数调用过程。我最新的博客-webrtc的视频数据处理流程分析有更详细的分析。

kPacerQueueUpdateInterval  25ms更新一次
//https://github.com/pixiv/webrtc/blob/branch-heads/pixiv-m78/call/rtp_transport_controller_send.cc#L521
void RtpTransportControllerSend::StartProcessPeriodicTasks() {if (!pacer_queue_update_task_.Running()) {pacer_queue_update_task_ = RepeatingTaskHandle::DelayedStart(task_queue_.Get(), kPacerQueueUpdateInterval, [this]() {RTC_DCHECK_RUN_ON(&task_queue_);TimeDelta expected_queue_time = pacer()->ExpectedQueueTime();control_handler_->SetPacerQueue(expected_queue_time);UpdateControlState();return kPacerQueueUpdateInterval;});}controller_task_.Stop();if (process_interval_.IsFinite()) {controller_task_ = RepeatingTaskHandle::DelayedStart(task_queue_.Get(), process_interval_, [this]() {RTC_DCHECK_RUN_ON(&task_queue_);UpdateControllerWithTimeInterval();return process_interval_;});}
}
void RtpTransportControllerSend::UpdateControlState() {absl::optional<TargetTransferRate> update = control_handler_->GetUpdate();if (!update)return;retransmission_rate_limiter_.SetMaxRate(update->network_estimate.bandwidth.bps());// We won't create control_handler_ until we have an observers.RTC_DCHECK(observer_ != nullptr);observer_->OnTargetTransferRate(*update);
}
void Call::OnTargetTransferRate(TargetTransferRate msg) {bitrate_allocator_->OnNetworkChanged(target_bitrate_bps, stable_target_rate_bps, bandwidth_bps, fraction_loss,rtt_ms, probing_interval_ms);
}
//https://github.com/pixiv/webrtc/blob/branch-heads/pixiv-m78/call/bitrate_allocator.cc#L97
void BitrateAllocator::OnNetworkChanged(uint32_t target_bitrate_bps,uint32_t stable_target_bitrate_bps,uint32_t bandwidth_bps,uint8_t fraction_loss,int64_t rtt,int64_t bwe_period_ms)
{uint32_t protection_bitrate = config.observer->OnBitrateUpdated(update);
}
uint32_t VideoSendStreamImpl::OnBitrateUpdated(BitrateAllocationUpdate update) {RTC_DCHECK_RUN_ON(worker_queue_);RTC_DCHECK(rtp_video_sender_->IsActive())<< "VideoSendStream::Start has not been called.";// When the BWE algorithm doesn't pass a stable estimate, we'll use the// unstable one instead.if (update.stable_target_bitrate.IsZero()) {update.stable_target_bitrate = update.target_bitrate;}rtp_video_sender_->OnBitrateUpdated(update, stats_proxy_->GetSendFrameRate());encoder_target_rate_bps_ = rtp_video_sender_->GetPayloadBitrateBps();const uint32_t protection_bitrate_bps =rtp_video_sender_->GetProtectionBitrateBps();DataRate link_allocation = DataRate::Zero();if (encoder_target_rate_bps_ > protection_bitrate_bps) {link_allocation =DataRate::BitsPerSec(encoder_target_rate_bps_ - protection_bitrate_bps);}DataRate overhead =update.target_bitrate - DataRate::BitsPerSec(encoder_target_rate_bps_);DataRate encoder_stable_target_rate = update.stable_target_bitrate;if (encoder_stable_target_rate > overhead) {encoder_stable_target_rate = encoder_stable_target_rate - overhead;} else {encoder_stable_target_rate = DataRate::BitsPerSec(encoder_target_rate_bps_);}encoder_target_rate_bps_ =std::min(encoder_max_bitrate_bps_, encoder_target_rate_bps_);encoder_stable_target_rate =std::min(DataRate::BitsPerSec(encoder_max_bitrate_bps_),encoder_stable_target_rate);DataRate encoder_target_rate = DataRate::BitsPerSec(encoder_target_rate_bps_);link_allocation = std::max(encoder_target_rate, link_allocation);video_stream_encoder_->OnBitrateUpdated(encoder_target_rate, encoder_stable_target_rate, link_allocation,rtc::dchecked_cast<uint8_t>(update.packet_loss_ratio * 256),update.round_trip_time.ms(), update.cwnd_reduce_ratio);stats_proxy_->OnSetEncoderTargetRate(encoder_target_rate_bps_);return protection_bitrate_bps;
}

 而调整编码器的码率,可以通过两种方式实现,丢帧和重置编码器速率:

DataRate VideoStreamEncoder::UpdateTargetBitrate(DataRate target_bitrate,double cwnd_reduce_ratio) {RTC_DCHECK_RUN_ON(&encoder_queue_);DataRate updated_target_bitrate = target_bitrate;// Drop frames when congestion window pushback ratio is larger than 1// percent and target bitrate is larger than codec min bitrate.// When target_bitrate is 0 means codec is paused, skip frame dropping.if (cwnd_reduce_ratio > 0.01 && target_bitrate.bps() > 0 &&target_bitrate.bps() > send_codec_.minBitrate * 1000) {int reduce_bitrate_bps = std::min(static_cast<int>(target_bitrate.bps() * cwnd_reduce_ratio),static_cast<int>(target_bitrate.bps() - send_codec_.minBitrate * 1000));if (reduce_bitrate_bps > 0) {// At maximum the congestion window can drop 1/2 frames.cwnd_frame_drop_interval_ = std::max(2, static_cast<int>(target_bitrate.bps() / reduce_bitrate_bps));// Reduce target bitrate accordingly.updated_target_bitrate =target_bitrate - (target_bitrate / cwnd_frame_drop_interval_.value());return updated_target_bitrate;}}cwnd_frame_drop_interval_.reset();return updated_target_bitrate;
}

 通过丢帧的方式降低码率, 代码注释的很清楚,是由于限定条件的。要设置的目标码率,依然大于当前编码器配置(图像的长宽)的最下速率。

[1]webrtc视频帧率控制算法机制(一)–目标码率丢帧

webrtc码率设置的函数调用相关推荐

  1. java h265,H264/H265码流的编码码率设置

    一.什么是视频码率? 视频码率是视频数据(视频色彩量.亮度量.像素量)每秒输出的位数.一般用的单位是kbps. 二.设置视频码率的必要性 在视频会议应用中,视频质量和网络带宽占用是矛盾的,通常情况下视 ...

  2. ffmpeg 编解码 码率设置问题 CBR 、VBR

    之前都是利用硬件进行视频流的编解码 最近 在利用ffmpeg 编解码在CPU上进行软解软编码 之前别的硬件平台设置码率和vbr cbr的时候 提供了接口直接设置一下就可以 但是ffmpeg这里 并没有 ...

  3. WebRTC - Android 设置手机焦距

    客户提出在后台进行放大缩小,可以实时传输到手机上,进行放大以及缩小. 此时就需要设置焦距值来达到客户需求 Camera1Session //设置摄像头焦距问题public static void se ...

  4. Android : WebRTC中设置 Video Stabilization 遇到的一个兼容性问题

    最近我们公司的产品,在一款Android平板上遇到一个奇怪的问题,现象是本地视频预览画面显示是黑屏,监听VideoFrame无输出.下面我来描述一下这个故事. 在WebRTC Android SDK源 ...

  5. python给函数设置超时时间_Python设置函数调用超时

    http://blog.sina.com.cn/s/blog_63041bb80102uy5o.html 背景: 最近写的Python代码不知为何,总是执行到一半卡住不动,为了使程序能够继续运行,设置 ...

  6. python运行时间长就卡_解决Python设置函数调用超时,进程卡住的问题

    背景: 最近写的Python代码不知为何,总是执行到一半卡住不动,为了使程序能够继续运行,设置了函数调用超时机制. 代码: import time import signal def test(i): ...

  7. 流媒体学习-WebRTC全面入门学习-1

    一.初始WebRTC 1.WebRTC 就是音视频处理+即时通讯的开源库 音视频处理中ffmpeg和WebRTC是两个很重要的一部分,ffmpeg注重与数据音视频的编解码,文件的后处理.WebRTC整 ...

  8. WebRTC GCC拥塞控制算法详解

    1.WebRTC版本 m74 2.GCC的概念 GCC全称Google Congest Control,所谓拥塞控制,就是控制数据发送的速率避免网络的拥塞.可以对比TCP的拥塞控制算法,由于WebRT ...

  9. WebRTC的拥塞控制和带宽策略(转)

    网络的波动带来的卡顿直接影响着用户的体验,在WebRTC中设计了一套基于延迟和丢包反馈的拥塞机制(GCC)和带宽调节策略来保证延迟.质量和网路速度之间平衡,本文中重点是介绍基于trendline滤波的 ...

最新文章

  1. 一组匹配中国大陆手机号码的正则表达式
  2. Console-算法[for]-打印出杨辉三角形
  3. Django-请求与响应
  4. 图像局部显著性—点特征(SiftGPU)
  5. code iban 是有什么组成_深入浅出Zookeeper(四):客户端的请求在服务器中经历了什么...
  6. 什么是hypernetworks? hypernetworks简单介绍
  7. push指令的执行过程
  8. Mybatis-Spring扫描路径有重叠导致Invalid bound statement(not found)问题
  9. C++_auto_ptr与unique_ptr智能指针
  10. 智能优化算法:被囊群算法-附代码
  11. CF1041E Tree Reconstruction
  12. 计算机360u盘删除,如何删除U盘在电脑中的使用痕迹
  13. (APP测试三板斧)第一板:Xposed+JustTrustMe绕过SSL Pining
  14. spark学习之SparkSQL
  15. 合天网安实验室CTF-基础100-Flag就在这儿
  16. WIN7下安装WIN2003系统
  17. 轻量级配置的登录管理器选择---Silm[zt]
  18. 企业微信机器人还能这么玩?
  19. docker启动jenkins部署springboot到tomcat(集成:企业微信和邮件通知)
  20. 【ant】Apache ant 开发

热门文章

  1. 计算机卡慢解决方法,电脑很卡怎么办,详细教您电脑很卡很慢应该怎么解决
  2. shell的几个重要命令,主要参数,循环语句以及变量处理
  3. 语c语言描写,【萌°语c】『语c』语c基本知识的简单介绍
  4. 便捷的oh-my-zsh
  5. 许久不动笔,,再来点人生感悟吧
  6. 达内cgb2111第三次月考 76分就够了
  7. React中input输入框中文输入的问题
  8. 微信视频号视频怎么下载?
  9. 例题 8-4 传送中的车(Fabled Rook, UVa 11134)
  10. 容联云:实现异步 手机短信验证码