webrtc 联播数据编码发送流程

文章目录

  • [webrtc 联播数据编码发送流程](#webrtc 联播数据编码发送流程)
    • [1 创建 VideoSendStreamImpl](#1 创建 VideoSendStreamImpl)
    • [2 创建RTPSenderVideo](#2 创建RTPSenderVideo)
    • [3 创建编码器](#3 创建编码器)
    • [4 编码后数据流向](#4 编码后数据流向)

webrtc 联播数据编码发送流程

1 创建 VideoSendStreamImpl

c++ 复制代码
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

c++ 复制代码
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 创建编码器

c++ 复制代码
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 编码后数据流向

c++ 复制代码
 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发送数据
相关推荐
OpenLoong 开源社区13 天前
打破 NAT 限制,零侵入跨网络通信:基于 WebRTC 的透明 TCP 隧道跨网络通信方案
网络协议·tcp/ip·开源·webrtc·openloong开源社区
探鸽小钛16 天前
4G 终端 ES8311 - 挂断一次,下次说话就没声了之解决办法
物联网·音视频·嵌入式·esp32·webrtc
草根大哥17 天前
AI 编程实践之自建视频CDN
音视频·webrtc·低延迟直播·视频cdn·低延迟cdn
EasyCVR17 天前
应急指挥怕延迟?聊聊视频汇聚/视频融合/视频分析EasyCVR平台WebRTC低延迟方案
音视频·webrtc·easycvr
TrueDei18 天前
WebRTC ICE 候选变成 mDNS 地址导致连接失败:原因分析与解决方案
webrtc
中屹指纹浏览器svip21 天前
WebRTC泄露是什么,怎么关闭?
webrtc
海边捡石子22 天前
从零设计一个通用智能电话平台:FreeSWITCH + ESL + AI 实战架构
人工智能·架构·webrtc
音视频牛哥22 天前
不换摄像机,也能接入 WebRTC?SmartMediaKit RTSP/RTMP 转 WHIP 技术实践
音视频·webrtc·smartmediakit·rtsp转whip·rtmp转whip·whip推流·rtsp转webrtc播放
直播技术开发交流24 天前
Android 端 WHIP 协议推流技术实践:相机/录屏/多路转发WHIP实现测试
webrtc·android whip·rtsp转whip·毫秒级实时媒体流·whip低延时推送·whip推送实现·rtsp转webrtc
程序员阿明1 个月前
docker搭建视频流服务go2rtc,webRTC
docker·容器·webrtc