webrtc 联播数据编码发送流程
1 创建 VideoSendStreamImpl
WebRtcVideoChannel::WebRtcVideoSendStream::RecreateWebRtcStream
media/engine/webrtc_video_engine.h
->
CreateVideoSendStream
call/call.h
参数: config
webrtc::VideoSendStream::Config config
ebrtc::VideoEncoderConfig encoder_config
->
CreateVideoStreamEncoder
video/video_send_stream.h
->
VideoStreamEncoder
video/video_stream_encoder.h
备注: 这是只是创建了VideoStreamEncoder, 并没有创建真正的编码类
->
VideoSendStreamImpl::VideoSendStreamImpl()
video/video_send_stream_impl.h
2 创建RTPSenderVideo
RtpVideoSenderInterface* RtpTransportControllerSend::CreateRtpVideoSender
call/rtp_transport_controller_send.h
->
RtpVideoSender::RtpVideoSender
call/rtp_video_sender.h
// 参数:const RtpConfig& rtp_config,
->
std::vector<RtpStreamSender> CreateRtpStreamSenders
call/rtp_video_sender.cc
for (size_t i = 0; i < rtp_config.ssrcs.size(); ++i) {
auto sender_video = std::make_unique<RTPSenderVideo>(video_config);
rtp_streams.emplace_back(std::move(playout_delay_oracle),
std::move(rtp_rtcp), std::move(sender_video));
}
// 遍历rtp_config.ssrcs 创建:RtpStreamSender 创建RTPSenderVideo
3 创建编码器
VideoStreamEncoder::OnFrame
video/video_stream_encoder.h
->
VideoStreamEncoder::MaybeEncodeVideoFrame
video/video_stream_encoder.h
->
VideoStreamEncoder::ReconfigureEncoder()
video/video_stream_encoder.h
->
EncoderStreamFactory::CreateEncoderStreams
media/engine/webrtc_video_engine.h
作用: 将 encoder_config 中的联播信息 设置到 std::vector<webrtc::VideoStream> streams
->
获取编码参数:
VideoCodec codec;
if (!VideoCodecInitializer::SetupCodec(encoder_config_, streams, &codec)) {
RTC_LOG(LS_ERROR) << "Failed to create encoder configuration.";
}
将streams 的联播信息 拷贝到 codec.simulcastStream[]
->
VideoEncoder::InitEncode(const VideoCodec* codec_settings,
const VideoEncoder::Settings& settings)
modules/video_coding/codecs/h264/h264_encoder_impl.h
// 1 将VideoCodec联播信息 设置到 h264编码器中
// 2 同时也会创建多个h264编码器
创建编码器用的主要联播参数是: encoder_config, 创建RTPSenderVideo 主要的联播参数是:webrtc::VideoSendStream::Config::RtpConfig rtp;
4 编码后数据流向
H264EncoderImpl::Encode
modules/video_coding/codecs/h264/h264_encoder_impl.h
->
VideoStreamEncoder::OnEncodedImage
video/video_stream_encoder.h
->
VideoSendStreamImpl::OnEncodedImage
video/video_send_stream_impl.h
->
RtpVideoSender::OnEncodedImage
call/rtp_video_sender.h
->
rtp_streams_[stream_index].sender_video->SendVideo
// 不同编码的数据通过不同的RTPSenderVideo发送数据