发送端Webrtc视频Pipeline
Posted unclerunning
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了发送端Webrtc视频Pipeline相关的知识,希望对你有一定的参考价值。
发送端Webrtc视频Pipeline
采集
从摄像头捕获特定帧率和分辨率的原始[YUV/RGB or MGPEG==>YUV/RGB]视频帧
拥塞控制
发送端基于”Loss-based Controller”估算发送端带宽 As A s ,接收端基于”Delay-based controller”估算发送端带宽 Ar A r ,发送端取两者的最小值作为当前发送端目标带宽,作用于编码器、Pacer以及Padder/FEC。
SendSideCongestionController
1.OnTransportFeedback
2.Process
3.MaybeTriggerOnNetworkChanged
BitrateController
1.OnDelayBasedBweResult
2.OnReceivedEstimatedBitrate
3.GetNetworkParameters
SendSideBandwidthEstimation
综合发送端带宽估计和接收端带宽估计,得出当前发送端目标带宽。
1.UpdateDelayBasedEstimate
2.UpdateReceiverEstimate
3.UpdateEstimate
4.CapBitrateToThresholds
BitrateAllocator
OnNetworkChanged
接收SendSideCongestionController::MaybeTriggerOnNetworkChanged回调过来的带宽变化通知。
SendSideCongestionController::MaybeTriggerOnNetworkChanged ==> Call::OnNetworkChanged ==> Call::OnNetworkChanged ==> BitrateAllocator::OnNetworkChanged ==> VideoSendStreamImpl::OnBitrateUpdated ==> FecController::UpdateFecRates and CalculateOverheadRateBps and ==> VideoStreamEncoder::OnBitrateUpdated ==> VideoSender::SetChannelParameters ==> VCMGenericEncoder::SetEncoderParameters ==> VideoEncoder::SetRateAllocation of different video encoder implementation.
编码
Rtp打包过程,图片来源:WebRTC中RTP/RTCP协议实现分析
VideoStreamEncoder
1.SetSource
2.SetSink
3.ConfigureEncoder
4.OnFrame
接收采集端过来的视频帧。
5.EncodeVideoFrame
6.CropAndScaleFrom
7.OnBitrateUpdated
调用vcm::VideoSender::SetChannelParameters,将新的带宽码率设置给编码器实例。
EncodedImageCallback
编码器编码数据回调接口。
VCMEncodedFrameCallback
EncodedImageCallback的wrapper。
vcm::VideoSender
VideoStreamEncoder实现EncodedImageCallback接口,将raw video frame交给vcm::VideoSender去编码,然后从EncodedImageCallback回调接口接收视频编码器编码之后的压缩数据。
1.RegisterExternalEncoder
注册发送端编码器实例。
2.RegisterSendCodec
VideoCodec,用来选择发送端将要使用的视频编码器,参数包括:编码器类型[VP8,VP9,H264…]、rtp payload type、宽、高、起始码率、最大码率、最小码率、目标码率、最大帧率、最大量化参数、不同分辨率的码率个数等。
3.AddVideoFrame
4.SetChannelParameters
Update the channel parameters based on new rates and rtt. This will also cause an immediate call to VideoEncoder::SetRateAllocation.
VideoEncoder
视频编码器接口
1.InitEncode
2.RegisterEncodeCompleteCallback
3.Release
4.Encode
5.SetRateAllocation
VCMGenericEncoder
VideoEncoder的wrapper,确保对VideoEncoder各个api的调用是序列化的。
SetEncoderParameters
设置参数: target_bitrate,loss_rate,rtt,input_frame_rate。
VCMEncoderDataBase
视频编码器数据库,因为同一时刻只有一个编码器会被一个VideoSender使用,所以这个数据库其实只有一个视频编码器,使用RegisterExternalEncoder注册。
1.RegisterExternalEncoder
2.SetSendCodec
3.GetEncoder
4.MatchesCurrentResolution
5.DeregisterExternalEncoder
EncoderSink
继承EncodedImageCallback接口,接收编码后的压缩数据。
VideoSendStreamImpl
VideoSendStreamImpl实现EncoderSink接口,接收VideoStreamEncoder回调过来的编码器编码之后的压缩数据。
1.OnEncodedImage
2.OnBitrateUpdated
Implements BitrateAllocatorObserver,接收带宽变化通知,并设置到编码器VideoStreamEncoder。
PayloadRouter
PayloadRouter routes outgoing data to the correct sending RTP module, based on the simulcast layer in RTPVideoHeader.
1.OnEncodedImage
封包 + FEC + 丢包重传
RtpRtcp
1.SendOutgoingData
2.TimeToSendPacket
3.TimeToSendPadding
4.SendRTCP
ModuleRtpRtcpImpl
实现RtpRtcp接口。
1.SendOutgoingData
接收PayloadRouter过来的压缩数据,通过SendOutgoingData继续传递给RTPSender封包。
2.TimeToSendPacket
接收从PacedSender回调过来的数据包,通过TimeToSendPacket传递给RTPSender。
RTPSender
1.SendOutgoingData
处理ModuleRtpRtcpImpl传递过来的压缩数据。
2.TimeToSendPacket
3.SelectiveRetransmissions
4.OnReceivedNack
接收到接收端rtcp返回的Nack,调用ReSendPacket进行丢包重传。
5.ReSendPacket
在RtpPacketHistory中回溯rtt,查找丢掉的包是否落在这段时间范围内,否则放弃重传;然后检查重传是否会导致“overusing retransmission bitrate”,如果是,则放弃重传。
6.SendToNetwork
把报文存储到RTPPacketHistory结构中进行缓存。接下来如果开启PacedSending,则构造Packe发送到PacedSender进行排队,否则直接发送到网络层。
7.SendPacketToNetwork
将PaceSender回调过来的数据包,通过SendRtp传递给Transport。
RTPSenderVideo
1.SetFecParameters
2.SetSelectiveRetransmissions
3.SendVideo
RTPSenderVideo处理后,通过SendToNetwork回调给RTPSender,然后,RTPSender将包保存在RtpPacketHistory 中等待RtpPacketSender派发。
4.SendVideoPacketWithFlexfec
FEC protection.
PacedSender
继承RtpPacketSender,平滑数据包的发送,通过TimeToSendPacket回调将数据包传递给PacketSender。
1.SetEstimatedBitrate
接收SendSideCongestionController::MaybeTriggerOnNetworkChanged回调过来的带宽变化通知。
2.SetSendBitrateLimits
3.SendPacket
由于视频帧数据量大,且在I帧出现时存在非常大的波动梯度,如果大量的数据在瞬间全部发送到网络中,很容易导致网络的拥塞和抖动,造成延迟和丢包。PacedSender的目的就是平滑数据包的发送,使得发送端能够按照估算的发送端带宽码率平缓的发送媒体数据。
BitrateProber
根据发送码率和发送的数据量估算从当前发送结束到下一次开始发送PacedSender需要等待的时间
IntervalBudget
根据发送码率和等待间隔计算PacedSender本次剩余可发送的数据量,只有bytes_remaining_ 大于0才允许发送。
PacketRouter
继承PacketSender,通过TimeToSendPacket回调将PacedSender回调过来的数据包传递给相应的ModuleRtpRtcpImpl。
发送
Transport
1.SendRtp
2.SendRtcp
reference
WebRTC中RTP/RTCP协议实现分析
Analysis and Design of the Google Congestion Control for Web Real-time Communication (WebRTC)
Understanding the Dynamic Behaviour of the Google Congestion Control
Experimental Investigation of the Google Congestion Control for Real-Time Flows
HANDLING PACKET LOSS IN WEBRTC
Understanding the Basis of the Kalman Filter Via a Simple and Intuitive Derivation
What is RMCAT congestion control, and how will it affect WebRTC?
以上是关于发送端Webrtc视频Pipeline的主要内容,如果未能解决你的问题,请参考以下文章
android webview 加载webrtc视频通信的问题
WebRtc Native M96 远端视频接收之PacketBuffer-组帧原理分析