发送端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基本概念(一)

如何实现webrtc多人视频直播会议?

WebRtc Native M96 远端视频接收之PacketBuffer-组帧原理分析

WebRtc Native M96 远端视频接收之PacketBuffer-组帧原理分析

如何实现 iOS开发webrtc 视频通话时录像,截屏。