网上看到很多webrtc的JitterBuffer处理流程,都是介绍VCMJitterBuffer类的实现流程,不过手里的这个2019年的版本,发现webrtc已经不用这个机制了。原因还不清楚。
VCMJitterBuffer类的调用关系如下图,但是,VideoCodingModuleImpl、VideoReceiveStream、VideoStreamDecoder三个类,都没有调用VCMJitterBuffer的InsertPacket关键函数。
VCMJitterBuffer
->VCMReceiver
->VideoReceiver
->VideoCodingModuleImpl
VideoReceiveStream
VideoStreamDecoder
走读最新的webrtc的JitterBuffer代码,发现实现的大概思想是,视频按照RTP报入队一个全局buffer,按照计算的一个jitter时间,pop一帧视频,送进解码器。
入队的核心函数如下:
->video_coding::PacketBuffer::InsertPacket
-------------------------将RTP报文缓存在data_buffer_中。
->RtpVideoStreamReceiver::OnReceivedFrame
-------------------------判断首帧是否是IDR,不是丢弃帧;是,调用ManageFrame。
->video_coding::RtpFrameReferenceFinder::ManageFrame
-------------------------判断帧间参考关系。若当前帧的参考帧没到,继续等。
->RtpVideoStreamReceiver::OnCompleteFrame
-------------------------继续传VideoReceiveStream::OnCompleteFrame
->internal::VideoReceiveStream::OnCompleteFrame
-------------------------继续传FrameBuffer::InsertFrame
->video_coding::FrameBuffer::InsertFrame
--------------------------对当前帧的参考关系、时间戳进行合法性判断。合法帧发送信号量,知会解码器取数据。
出队的核心函数为:
->bool VideoReceiveStream::Decode
-------------------------解码器找frame_buffer要数据。配置等待超时时间kMaxWaitForFrameMs或kMaxWaitForKeyFrameMs
->FrameBuffer::ReturnReason FrameBuffer::NextFrame
-------------------------若当前帧OK,直接送给解码器。若当前帧不全,需要等wait_ms,超过wait_ms,直接跳下一帧。
->VCMTiming::MaxWaitingTime
--------------------------计算当前帧解码时间是否到,到就出帧,否则就等待。
等待时间=当前帧预计渲染时间-解码消耗时间-渲染模块耗时
因为这里是解码前,所以要把后面的解码+渲染时间扣除。
VCMTiming::RenderTimeMs函数实现视频帧渲染时间的计算。
VCMTiming::RenderTimeMs
->VCMTiming::RenderTimeMsInternal
->VCMTiming::TargetDelayInternal
一帧视频的预期渲染时间是发送端发送时间+网络延时时间+解码时间+渲染模块耗时时间
发送端发送时间:可以根据发送报文的时间戳+接收第一帧视频的系统时间推算出来。
网络延时时间:可以参考《webrtc代码走读十六(Jitter延时的计算)》
解码时间:使用KalmanFilter算法,计算每帧视频解码时间。
渲染时间:根据硬件配置,是固定值。
TimestampExtrapolator::ExtrapolateLocalTime
VCMJitterEstimator::GetJitterEstimate
VCMCodecTimer::RequiredDecodeTimeMs
VideoReceiveStream::VideoReceiveStream函数
video_receiver_.SetRenderDelay(config_.render_delay_ms)代码配置固定值
IncomingVideoStream::OnFrame
VideoRenderFrames::FrameToRender
本文发布于:2024-01-30 18:48:48,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170661173222089.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |