webrtc getStats 内部调用流程分析
webrtc GetStats 内部调用流程分析
本次PeerConnection::GetStats梳理只记录了video "outbound-rtp"类型, 其他部分可参下面调用流程再具体分析。
一 调用流程
//备注:举 "type": "outbound-rtp" 的例子pc/peer_connection.h
PeerConnection::GetStatspc/rtc_stats_collector.h
RTCStatsCollector::GetStatsReportpc/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::GetStatsfor (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.hWebRtcVideoChannel::GetStatsmedia/engine/webrtc_video_engine.hWebRtcVideoChannel::FillSenderStatsmedia/engine/webrtc_video_engine.hWebRtcVideoChannel::WebRtcVideoSendStream::GetVideoSenderInfo备注: <1>在联播情况下,此函数返回的VideoSenderInfo视频数据是统计后的即(bytesSent, packetsSent 等数据是所有联播数据的总和) <2>如果想看所有联播数据,可以看 RTC_LOG(LS_INFO) << stats.ToString(rtc::TimeMillis()); 打印(2)统计并返回结果
pc/rtc_stats_collector.h
RTCStatsCollector::ProducePartialResultsOnNetworkThreadpc/rtc_stats_collector.hRTCStatsCollector::ProducePartialResultsOnNetworkThreadImplpc/rtc_stats_collector.hRTCStatsCollector::ProduceRTPStreamStats_npc/rtc_stats_collector.hProduceVideoRTPStreamStats_npc/rtc_stats_collector.hSetOutboundRTPStreamStatsFromVideoSenderInfoSetOutboundRTPStreamStatsFromMediaSenderInfo作用: 完成对outbound_video的设置pc/rtc_stats_collector.h
RTCStatsCollector::MergeNetworkReport_spc/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"
},
