接收类图不全

一  主要的类

类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. 使用Canvas进行验证码识别
  2. day01_Loadrunner基础流程
  3. 三包围结构的字是什么样的_手帐排版的高段位秘诀:运用艺术字丨大咖分享
  4. Linux学习之系统编程篇:循环创建多个子进程练习
  5. 【飞秋】使用C++语言创建Silverlight中的VisualState
  6. 如何在Debian 9上配置sources.list
  7. 10.Java 面试题整理(CORBA 方面)
  8. html中引入调用另一个公用html模板文件的方法
  9. 【YII】常用代码积累
  10. 伊洛纳登录显示服务器连接中,伊洛纳萌新入坑常见问题汇总
  11. st.getParameter() 和request.getAttribute() 区别 https://terryjs.iteye.com/blog/1317610
  12. 东京disney sea流水账 2
  13. 计算机视觉算法 面试必备知识点(2022)
  14. 数据结构--最小生成树详解
  15. Layui文件上传样式在ng-dialog不显示的问题处理
  16. 用CCS分析解读CC3200 SDK工具包的blinky流水灯文件
  17. 虚拟机内安装金蝶K3环境
  18. 【Visual C++】游戏开发五十四 浅墨DirectX教程二十一 视觉的诡计:公告板(Billboard)技术
  19. 高等代数 :1 线性方程组的解法
  20. Red hat查找命令所属的rpm包

热门文章

  1. 学生机房随堂测试软件,如何使用随堂测试--立即测?
  2. 【Lesson 13】万能和弦和弦走向
  3. Debian字体美化
  4. 考研:研究生考试(五天学完)之《线性代数与空间解析几何》研究生学霸重点知识点总结之第五课线性方程组
  5. 旧笔记本装linux系统
  6. dlink设置虚拟服务器,dlink设置虚拟服务器
  7. n维椭球体积公式_中考物理各种公式单位换算总结
  8. 计算机研究生考试题,全国研究生考试计算机统考试题及答案-20210522014129.docx-原创力文档...
  9. 亚米社区app v1.1.6
  10. 5个一见钟情的手机APP软件 使用过后必须赞赞赞