接收类图不全

一  主要的类

类video_coding::PacketBuffer是接收RTP包,类RtpVideoStreamReceiver2中有用到。

packet_buffer_(clock_, kPacketBufferStartSize, PacketBufferMaxSize()),最小值512,最大2048。

类video_coding::FrameBuffer是一帧完整的视频数据,类VideoReceiveStream2中有用到。

二  判断一帧数据是否完整

判断第一包、最后一包是否在一帧中

parsed_payload->type.Video.is_first_packet_in_frame = first_fragment;

//FU_A第二字节的SER的S

video_header.is_last_packet_in_frame |= rtp_packet.Marker(); //RTP包的mark位

void RtpVideoStreamReceiver2::OnInsertedPacket(video_coding::PacketBuffer::InsertResult result) {for (auto& packet : result.packets) {...//把rtp包写成完整一帧数据,给video_coding::RtpFrameReferenceFinder管理OnAssembledFrame(std::make_unique<video_coding::RtpFrameObject>()}
}RtpVideoStreamReceiver2::OnAssembledFrame(
--| reference_finder_->ManageFrame(std::move(frame));

三  帧间完整性判断—gop--没懂

把最后一包的seq作为pid-图片唯一标识。

四  FrameBuffer用在那 ? 解码

VideoReceiveStream2::OnCompleteFrame()
frame_buffer_->InsertFrame(std::move(frame));VideoReceiveStream2::StartNextDecode() {
//NextFrame()获得frame,给HandleEncodedFrame解码
frame_buffer_->NextFrame()--|  frame = absl::WrapUnique(GetNextFrame());
HandleEncodedFrame(std::move(frame));
}

五  JitterDelay的计算

//用卡尔曼kalman滤波估计(或预测) JitterDelay
计算公式如下:跟最大帧长度,平均帧长度等有关
JitterDelay = theta[0] * (MaxFS – AvgFS) + [noiseStdDevs * sqrt(varNoise) – noiseStdDevOffset]double VCMJitterEstimator::CalculateEstimate(),返回值就是JitterDelay。VCMJitterEstimator::UpdateEstimate
--| KalmanEstimateChannel(frameDelayMS, deltaFS);--更新公式参数的值//获取jitter估计值,单位是毫秒
int VCMJitterEstimator::GetJitterEstimate(double rttMultiplier,absl::optional<double> rttMultAddCapMs)// Updates the estimates with the new measurements.
void VCMJitterEstimator::UpdateEstimate(int64_t frameDelayMS,uint32_t frameSizeBytes,bool incompleteFrame /* = false */) 

六  JitterDelay:1 作用于从接收队列取数据的时间(意义在那?)  2 赋值给视频帧渲染时间

//帧间延时-->JitterDelay-->wait_ms:从接收队列取frame的时间
//wait_ms值在[0、3000]
int64_t VCMTiming::RenderTimeMsInternal(
{int64_t estimated_complete_time_ms =ts_extrapolator_->ExtrapolateLocalTime(frame_timestamp); //?return estimated_complete_time_ms + actual_delay;
}EncodedFrame* FrameBuffer::GetNextFrame() {
//帧间延时frame_delay传给滤波
if (inter_frame_delay_.CalculateDelay(first_frame->Timestamp(),&frame_delay, receive_time_ms)) {jitter_estimator_.UpdateEstimate(frame_delay, superframe_size);
}
...
timing_->SetJitterDelay(jitter_estimator_.GetJitterEstimate(rtt_mult, rtt_mult_add_cap_ms));
...
}int64_t FrameBuffer::FindNextFrame(int64_t now_ms) {EncodedFrame* frame = frame_it->second.frame.get();if (frame->RenderTime() == -1) {       frame->SetRenderTime(timing_->RenderTimeMs(frame->Timestamp(), now_ms));       }//frame->RenderTime()即期望渲染时间-当前时间-解码所需时间-渲染延迟时间(值10)wait_ms = timing_->MaxWaitingTime(frame->RenderTime(), now_ms);return wait_ms;
}

七 RenderTime视频帧渲染时间,算出渲染等待时间

看有的文章说,动态调整jitterbuffer大小,没有,只是调整了渲染的时间。

void IncomingVideoStream::Dequeue() {  absl::optional<VideoFrame> frame_to_render = render_buffers_.FrameToRender();if (frame_to_render)callback_->OnFrame(*frame_to_render);//即VideoReceiveStream2::OnFrame(//过wait_time,再去渲染if (render_buffers_.HasPendingFrames()) {uint32_t wait_time = render_buffers_.TimeToNextFrameRelease();  incoming_render_queue_.PostDelayedTask([this]() { Dequeue(); }, wait_time);}
}uint32_t VideoRenderFrames::TimeToNextFrameRelease() {//render_time_ms()是frame->SetRenderTime()设置进去的时间。const int64_t time_to_release = incoming_frames_.front().render_time_ms() -render_delay_ms_ - rtc::TimeMillis();return time_to_release < 0 ? 0u : static_cast<uint32_t>(time_to_release);
}
//赋值的地方
frame_info.renderTimeMs = frame.RenderTimeMs();
decodedImage.set_timestamp_us(frameInfo->renderTimeMs *rtc::kNumMicrosecsPerMillisec);

八 Jitterbuffer调优参数

1 rtp_video_header.playout_delay,rtp扩展头字段。

2 jitterbuffer和nack模块关系?没有直接关系

WebRTC的JitterBuffer笔记相关推荐

  1. WebRTC视频JitterBuffer详解

    WebRTC视频JitterBuffer详解 1 WebRTC版本 2 概要 3 JitterBuffer结构和基本流程 4 帧完整性 - PacketBuffer 4.1 包缓存 4.2 帧的开始和 ...

  2. WebRtC视频jitterbuffer原理机制

    WebRTC视频JitterBuffer详解_一朵喇叭花压海棠的博客-CSDN博客_jitterbuffer本文从代码层面详细描述了WebRTC的视频JitterBuffer模块的主要功能模块,可以作 ...

  3. 流媒体之Jitterbuffer笔记

    创建于 2013-04-11 迁移自本人的百度空间 -------------------------------- Jitterbuffer :抖动缓冲器 在voice over IP(VoIP)中 ...

  4. WebRTC Video JitterBuffer

    目录 一. 前言 二. Video JitterBuffer架构 三. PacketBuffer 四. ReferenceFinder 五. FrameBuffer 一. 前言 音视频传输通常使用 U ...

  5. 《WebRTC实时通信》笔记整理汇总

    前言 1.本书脉络 以高度抽象方式描述与WebRTC相关的完整开发周期: 说明如何编写代码以查询.获得对本地多媒体资源(如音频和视频设备)的访问,并在HTML5中显示: 将获得的媒体流与PeerCon ...

  6. webrtc jitterbuffer 学习

    注:详情可关注微信公众号Deverloper_Taoists 视频通话中的jitterbuffer分析 1. 概述 Jitterbuffer在实时通讯中起了重要作用,用于数据接收端,它缓冲了接收到的数 ...

  7. WebRTC[1]-WebRTC中h264解码过程的源码分析

    目录 前言 正文 <WebRTC工作原理精讲>系列-总览_liuzhen007的专栏-CSDN博客_webrtc 原理前言欢迎大家订阅Data-Mining 的<WebRTC工作原理 ...

  8. webrtc jitterbuffer--buffer草稿

    webrtc的jitterbuffer按照功能分类的话,可以分为jitter和buffer.buffer主要对丢包.乱序.延时到达等异常情况做处理,还会和NACK.FEC.FIR等QOS相互配合.ji ...

  9. WebRTC音视频同步详解

    WebRTC音视频同步详解 1 WebRTC版本 2 时间戳 2.1 视频时间戳 2.2 音频时间戳 2.3 NTP时间戳 2 延迟 3 同步 3.1 一张图看懂音视频同步 3.2 音视频相对延迟 3 ...

最新文章

  1. 客户信贷评级 Python 实战
  2. python画二维数组散点图_Python散点图二维数组
  3. 撒花!《图解深度学习》已开源,16 章带你无障碍深度学习,高中生数学就 ok!
  4. boost::mpl::minus相关的测试程序
  5. BZOJ 2434 最长公共子序列
  6. 【树链剖分】【倍增】宝石(2021GDOI Day2 T1)
  7. orm2 中文文档 3.3 模型钩子
  8. 五分钟彻底学会iptables防火墙--技术流ken
  9. 【十一】Jmeter 函数助手实战:__time 时间戳函数
  10. 【转】去除inline-block元素的间隙
  11. 你需要的不是大数据——而是正确的数据
  12. hdu 1425 sort用堆排序做的
  13. 数字图像处理 冈萨雷斯(第四版)韦伯比的理解
  14. uniapp实现身份证实名认证
  15. PS无法拖拽置入图片解决办法
  16. 【转】为您解决HDMI无声的烦恼
  17. python图像处理教程,【图像处理】使用OpenCV+Python进行图像处理入门教程(二)...
  18. 解决ESP32 驱动 28BYJ-48 步进电机反向不转之震动的问题
  19. 6-1 计算年year、月month和日day对应的是该年的第几天
  20. JS中 Object.assign()用法

热门文章

  1. python在煤矿的用途-矿用非金属制品检测前处理方法研究
  2. 【木头Cocos2d-x 005】穷鬼之mac cocos2d-x环境搭建-成功!(VMWare + mac lion+xcode)
  3. idea中src/main/resources目录下的applicationContext.xml文件访问src/main/webap目录下的配置文件
  4. 电商APP:移动电子商务新趋势
  5. vs2017c语言程序打包,VS2017桌面应用程序打包成.msi或者.exe
  6. MOOC —— Python语言基础与应用 by 北京大学 第九章 高级扩展模块
  7. 发射光功率和接收灵敏度的正常范围
  8. beats耳机红白交替闪烁三次_beats耳机红白灯交替闪如何解决
  9. 不可多得的干货!互联网公司常用分库分表方案汇总!太完整了!
  10. 手把手教你做出数据可视化项目(七)可视化图表数据动态获取及界面跳转