webrtc GetStats 内部调用流程分析

本次PeerConnection::GetStats梳理只记录了video "outbound-rtp"类型, 其他部分可参下面调用流程再具体分析。

一 调用流程

//备注:举  "type": "outbound-rtp" 的例子

pc/peer_connection.h
PeerConnection::GetStats

pc/rtc_stats_collector.h
RTCStatsCollector::GetStatsReport

pc/rtc_stats_collector.h
RTCStatsCollector::GetStatsReportInternal

情况1 如果有报告,并且时间在可用范围
pc/rtc_stats_collector.h
RTCStatsCollector::DeliverCachedReport
调用 request.callback()->OnStatsDelivered 返回结果

情况2 没有可用报告
(1): 获取 transceiver_stats_infos_ 和 其他信息
获取 transceiver_stats_infos_ 流程
pc/rtc_stats_collector.h
RTCStatsCollector::PrepareTransceiverStatsInfos_s
    关键代码:
        创建对象:
        video_stats[video_channel->media_channel()] =
              std::make_unique<cricket::VideoMediaInfo>();
        赋值:
        备注: 这里调用到了WebRtcVideoChannel::GetStats
        for (const auto& entry : video_stats) {
          if (!entry.first->GetStats(entry.second.get())) {
            RTC_LOG(LS_WARNING) << "Failed to get video stats.";
          }
        }
              
    media/engine/webrtc_video_engine.h
    WebRtcVideoChannel::GetStats

    media/engine/webrtc_video_engine.h
    WebRtcVideoChannel::FillSenderStats

    media/engine/webrtc_video_engine.h
    WebRtcVideoChannel::WebRtcVideoSendStream::GetVideoSenderInfo
    备注: 
    	<1>在联播情况下,此函数返回的VideoSenderInfo视频数据是统计后的即(bytesSent, packetsSent 等数据是所有联播数据的总和) 
    	<2>如果想看所有联播数据,可以看 RTC_LOG(LS_INFO) << stats.ToString(rtc::TimeMillis()); 打印
    	
(2)统计并返回结果
pc/rtc_stats_collector.h
RTCStatsCollector::ProducePartialResultsOnNetworkThread

        pc/rtc_stats_collector.h
        RTCStatsCollector::ProducePartialResultsOnNetworkThreadImpl

        pc/rtc_stats_collector.h
        RTCStatsCollector::ProduceRTPStreamStats_n

        pc/rtc_stats_collector.h
        ProduceVideoRTPStreamStats_n

        pc/rtc_stats_collector.h
        SetOutboundRTPStreamStatsFromVideoSenderInfo
        SetOutboundRTPStreamStatsFromMediaSenderInfo
        作用: 完成对outbound_video的设置

pc/rtc_stats_collector.h
RTCStatsCollector::MergeNetworkReport_s

pc/rtc_stats_collector.h
RTCStatsCollector::DeliverCachedReport
调用 request.callback()->OnStatsDelivered 返回结果

二 GetStats数据

// outbound-rtp类型数据
{
	"bytesSent": 6165216,
	"codecId": "RTCCodec_0_Outbound_100",
	"encoderImplementation": "OpenH264",
	"firCount": 0,
	"framesEncoded": 833,
	"headerBytesSent": 146776,
	"id": "RTCOutboundRTPVideoStream_3834178515",
	"isRemote": false,
	"keyFramesEncoded": 62,
	"kind": "video",
	"mediaSourceId": "RTCVideoSource_1",
	"mediaType": "video",
	"nackCount": 4,
	"packetsSent": 5880,
	"pliCount": 67,
	"qpSum": 14691,
	"qualityLimitationReason": "none",
	"qualityLimitationResolutionChanges": 2,
	"retransmittedBytesSent": 0,
	"retransmittedPacketsSent": 0,
	"ssrc": 3834178515,
	"timestamp": 1761045889639000,
	"totalEncodeTime": 3.859,
	"totalEncodedBytesTarget": 11870379,
	"totalPacketSendDelay": 140.626,
	"trackId": "RTCMediaStreamTrack_sender_1",
	"transportId": "RTCTransport_0_1",
	"type": "outbound-rtp"
},
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐