以mediaosoup-broadcaster-demo为例说明:
函数调用流程:
获取视频帧:
webrtc::test::FrameGeneratorCapturer::InsertFrame
webrtc::test::TestVideoCapturer::OnFrame
rtc::VideoBroadcaster::OnFrame
webrtc::VideoStreamEncoder::OnFrame
编码:
VideoStreamEncoder::OnFrame
VideoStreamEncoder::MaybeEncodeVideoFrame
VideoStreamEncoder::EncodeVideoFrame
EncoderSimulcastProxy::Encode
LibvpxVp8Encoder::Encode
LibvpxVp8Encoder::GetEncodedPartitions
VideoStreamEncoder::OnEncodedImage
发送:
webrtc::internal::VideoSendStreamImpl::OnEncodedImage
webrtc::RtpVideoSender::OnEncodedImage
webrtc::RTPSenderVideo::SendVideo
以上调用流程是如何在代码中体现的?
1. createSquaresVideoTrack
1). 创建factory (peerconnectionfactory) 如果没有
2). 创建videosource (FrameGeneratorCapturerVideoTrackSource)
videosource 里边有TestVideoCapturer, FrameGeneratorCapturer,这里边会根据初始化的帧率来连续的产生原始视频数据(yuv数据) webrtc::test::FrameGeneratorCapturer::InsertFrame; 这个是后续编码, 发送的数据源头.
3). 创建videotrack
actory->CreateVideoTrack(rtc::CreateRandomUuid(), video_track_source_);
2. pc->AddTransceiver(track, transceiverInit)
该函数建立videotrack 和 rtpsender之间的关系; RtpTransceiverInterface 代表一个双向的数据通道, 包含rtpsender/rtpreceiver;
从以上流程来看, 我们调用的一些webrtc api 是为了建立各个流程各个模块之间的关联关系, 以至于我们产生的数据能够在后续被处理. 内部通过正常调用, 注册回调等方式把数据往下传递.
网友评论