webrtc(7) 编码数据发送模块

编码数据发送模块

  • VideoSendStream把VideoStreamEncoder和VideoSendStreamImpl作为子模块,就可以很好的处理编码和发送之间的关系了

  • 前面说到编码之后的数据通过VideoSendStreamImpl::OnEncodedImage传到了VideoSendStreamImpl模块中

  • VideoSendStreamImpl包含的功能和模块非常多:

    • 1、FEC控制模块,FecController
    • 2、FEC发送模块,FlexfecSender
    • 3、RTCP的feedback信息处理,EncoderRtcpFeedback
    • 4、带宽监控,RtcpBandwidthObserver
    • 5、rtp、rtcp模块,RtpRtcp
    • 6、数据输出,PayloadRouter
  • VideoSendStreamImpl::OnEncodedImage收到编码数据之后,开始调用:

    • 1、PayloadRouter::OnEncodedImage
    • 2、ModuleRtpRtcpImpl::SendOutgoingData,把数据传到RtpRtcp模块
    • 3、RTPSender::SendOutgoingData,RTP模块发送数据
    • 4、RTPSenderAudio::SendAudio,音频模块发送数据
    • 5、RTPSenderVideo::SendVideo,视频模块发送数据
    • 6、FEC编码:
      • 1、RTPSenderVideo::SendVideoPacketWithFlexfec
      • 1、RTPSenderVideo::SendVideoPacketAsRedMaybeWithUlpfec
    • 7、RTPSenderVideo::SendVideoPacket
    • 8、RTPSender::SendToNetwork
    • 9、RtpPacketHistory::PutRtpPacket,用于重传
    • 10、PacedSender::InsertPacket,平滑发送
    • 11、RTPSender::SendPacketToNetwork
    • 12、Transport::SendRtp
  • 可以看到,调用流程非常复杂,但是可以简化一下用语言描述:

    • 1、对编码之后的帧数据进行分包,一个帧可以分成多个包
    • 2、对数据包打包,加上rtp头部
    • 3、按照音视频的不同,把媒体数据发送到不同的模块
    • 4、如果有需要,那么进行fec冗余
    • 5、包数据包放进一个历史队列中,方便丢包的时候进行重传
    • 6、为了防止瞬时数据对网络造成冲击,需要把数据(实际上并不是媒体数据而是它们的信息)放进平滑发送模块中
    • 7、平滑发送模块把数据发送到网络上
  • VideoSendStreamImpl并不执行具体的发送操作,而是把细节交给子模块去完整

你可能感兴趣的:(webrtc(7) 编码数据发送模块)