模块之间的关系
发送端
1、Transport,是最底层的发送操作,位于所有模块的底部,用于把数据(rtp、rtcp)发送到网络中
2、RTPSenderVideo、RTPSenderAudio,属于RTPSender的子模块,处理具体媒体数据的发送前处理(如fec等),最终他们还是透过RTPSender进行数据发送
3、RTPSender,位于Transport的上面,通过调用Transport来实现数据发送的操作,RTPSender主要提供下面的功能:
- 3.1、对媒体数据(音视频数据或者fec的冗余数据)进行封装
- 3.2、处理重传操作(nack、ARQ)
- 3.3、利用PacerSender实现平滑发送的功能
- 3.4、进行FEC冗余操作
- 3.5、调用Transport发送数据
4、ModuleRtpRtcpImpl,位于RTPSender的上层,RTPSender是它的子模块,它主要提供下面的功能
- 4.1、RTP数据的发送,RTPSender
- 4.2、RTCP数据的发送,RTCPSender
- 4.3、RTCP数据的接收,RTCPReceiver
- 4.4、关键帧请求,KeyFrameRequestMethod
- 4.5、远端带宽估计,RemoteBitrateEstimator
5、RtpRtcp,提供RTP、RTCP的抽象接口,可以这样说:RtpRtcp是抽象,ModuleRtpRtcpImpl是具体
6、VideoSendStreamImpl、AudioSendStream,位于RtpRtcp的上层,RtpRtcp是他们的子模块
7、VideoSendStream,位于VideoSendStreamImpl的上层,VideoSendStreamImpl是他的子模块
- 7.1、包含了编码模块:VideoStreamEncoder
- 7.2、包含了发送实现模块:VideoSendStreamImpl
- 7.3、提供发送RTCP的接口:DeliverRtcp
- 7.4、注意没有提供RTP发送的接口,因为的RTP发送是内部隐含实现的,Capture采集到图像数据之后,送到编码器,编码输出交给RtpRtcp模块进行fec冗余、打包等操作,然后发送
- 7.5、设置数据源的接口:SetSource,它设置图像数据的来源,一般来说是Capture
- 7.6、如果你对默认的编码器、fec、ARQ等模块不满意,那么可以通过VideoSendStream::Config啦定制你需要的东西,VideoSendStream::Config包含了很多模块以及相应的配置信息:
- 7.5.1、编码器的设置:EncoderSettings
- 7.5.2、Rtp的设置:Rtp,其中Rtp又包括下面的一些设置:
- ARQ模块的设置:NackConfig
- FEC模块的设置:UlpfecConfig、Flexfec
- 重传包的设置:Rtx
- 7.5.3、Rtcp的设置:Rtcp
- 7.5.4、数据传输模块:Transport
- 7.5.5、编码前处理:rtc::VideoSinkInterface
- 7.5.6、编码后处理:EncodedFrameObserver
8、Call,位于VideoSendStream的上层,VideoSendStream是他的子模块,它主要提供下面的模块和功能
- 8.1、假设A和B要通话,那么A和B都需要两个Call,一个Call用于发送数据,另一个Call用于接收数据
- 8.2、创建Call需要一个配置信息Call::Config,Call::Config包含下面的一些模块,如果有需要你可以仔细配置Call::Config的内容,下面说说它包含的模块:
- 8.1.1、码控设置:BitrateConstraints
- 8.1.2、音频状态(设备、混音等):AudioState
- 8.1.3、音频处理:AudioProcessing
- 8.1.4、fec冗余模块:FecControllerFactoryInterface
- 8.3、从功能上来看,Call就像一个容器,装了很多个模块。下面从其中的一个模块VideoSendStream分析;VideoSendStream是视频数据发送流,它对外表现为一个数据流:
- 8.3.1、需要提供一个数据源,这个数据数据源用于提供数据(未编码的图像数据)输入,一般来说是一个Capture
- 8.3.2、需要提供一个数据输出点,因为图像数据处理之后你需要发送给对方,这个数据输出点就是Transport,Transport直接调用socket发送数据到网上
- 8.3.3、未编码的数据不能直接发送到网上,因此VideoSendStream还需要提供一个视频编码器
- 8.3.4、编码之后的数据需要打包成一个个的数据包才能发送,因此它还包括一个RTP模块用于数据打包
- 8.3.5、由于音视频数据使用udp进行传输,因此可能会丢包,为了抗丢包,它还提供了fec、nack等模块
- 8.3.6、由于udp没有拥塞控制,需要实现应用层的拥塞控制算法,因此它还包括了拥塞控制、带宽估计、feedback、PacerSender等模块
接收端
接收端处理数据分为两个部分:
- 解析RTP数据
- 解码
解析RTP数据
- 1、从网络收到数据
- 2、Call::DeliverPacket
- 3、Call::DeliverRtp
- 4、RtpStreamReceiverController::OnRtpPacket
- 5、RtpDemuxer::OnRtpPacket
- 6、RtpVideoStreamReceiver::OnRtpPacket,和上面能连接起来的关键是RtpStreamReceiverController::CreateReceiver,RtpVideoStreamReceiver继承自RtpPacketSinkInterface
- 7、RtpVideoStreamReceiver::OnRtpPacket、RtpVideoStreamReceiver::OnRecoveredPacket
- 8、RtpVideoStreamReceiver::ReceivePacket
- 9、RtpReceiverImpl::IncomingRtpPacket
- 10、RTPReceiverVideo::ParseRtpPacket
- 11、RtpVideoStreamReceiver::OnReceivedPayloadData,通过RtpReceiver::CreateVideoReceiver和上面结合起来
- 12、PacketBuffer::InsertPacket、NackModule::OnReceivedPacket
- 13、RtpVideoStreamReceiver::OnReceivedFrame,通过video_coding::PacketBuffer::Create和上面结合起来
- 14、RtpFrameReferenceFinder::ManageFrame
- 15、RtpVideoStreamReceiver::OnCompleteFrame
- 16、VideoReceiveStream::OnCompleteFrame
- 17、FrameBuffer::InsertFrame、RtpVideoStreamReceiver::FrameContinuous,至此,帧已经插入JitterBuffer中
解码
- 1、VideoReceiveStream::VideoReceiveStream、VideoReceiveStream::Start
- 2、VideoReceiveStream::DecodeThreadFunction
- 3、VideoReceiveStream::Decode
- 4、FrameBuffer::NextFrame(还调用了另一个FrameBuffer::NextFrame)
- 5、VideoReceiver::Decode
- 6、VCMGenericDecoder::Decode
- 7、H264DecoderImpl::Decode
- 8、VCMDecodedFrameCallback::Decoded
- 9、VideoStreamDecoder::FrameToRender
- 10、VideoReceiveStream::OnFrame
- 11、render,渲染播放
解码侧模块之间的关系
RTPReceiverVideo、RTPReceiverAudio,解析RTP数据的最底层
RtpReceiver,即RtpReceiverImpl,位于RTPReceiverVideo、RTPReceiverAudio的上层
扫描二维码关注公众号,回复: 2944752 查看本文章RtpVideoStreamReceiver,位于RtpReceiver的上层,它包含了下面的子模块:
- 1、RtpReceiver
- 2、UlpfecReceiver
- 3、RtpRtcp
- 4、KeyFrameRequestSender
- 5、NackModule
- 6、video_coding::PacketBuffer
- 7、video_coding::RtpFrameReferenceFinder
- 8、video_coding::H264SpsPpsTracker
- 9、RtpPacketSinkInterface
- 10、video_coding::OnCompleteFrameCallback
- 11、PacketRouter
- 12、RemoteNtpTimeEstimator
- 13、RTPPayloadRegistry
VideoReceiveStream,位于RtpVideoStreamReceiver的上层,它还包含下面的模块:
- 1、TransportAdapter
- 2、ReceiveStatistics
- 3、VCMTiming
- 4、vcm::VideoReceiver
- 5、rtc::VideoSinkInterface
- 6、ReceiveStatisticsProxy
- 7、RtpVideoStreamReceiver
- 8、VideoStreamDecoder
- 9、VCMJitterEstimator
- 10、video_coding::FrameBuffer
- 11、RtpStreamReceiverInterface
- 12、RtxReceiveStream
- 13、RtpStreamReceiverInterface
Call,位于VideoReceiveStream的上层