github:https://github.com/bigonelby/webrtcUml/tree/master/latest
这个图展示了webrtc中的发送端数据统计的架构
画这个图的背景是这样的,需要得到发送码流的分辨率信息,究竟如何获取才好呢?因为webrtc中有adapter模块,因此分辨率实际上也在动态变化中。所以我们这里要拿到的,实际上是编码器的分辨率。因此需要调查下,是否有保存这个信息
通过调查,发现这个信息可以通过这张图所示的路径获取。就是WebrtcVideoChannel的GetStats方法。这个方法,会返回结构体VideoMediaInfo,这里有成员senders,其类型为VideoSenderInfo,保存了发送的分辨率以及帧率信息
这个信息是如何获取到的呢?实际上遍历了WebrtcVideoChannel的所有发送流,send_streams_,最终通过VideoSendStream,调到了SendStatisticsProxy,从类名就可以知道,这个类是负责统计发送端的相关信息的,其成员stats_,类型为VideoSendStream::Stats,这里记录了很多信息,比如输入帧率和编码帧率。其成员substreams,类型为StreamState,记录了分辨率信息。通过SendStatisticsProxy的stats_成员,就可以生成之前描述的VideoSenderInfo!
最后来看看StreamState是如何赋值的。这就用到了SendStatisticsProxy的第二个身份:VideoStreamEncoderObserver,即视频编码器的观察者。通过OnSendEncodedImage就可以得到编码后帧的信息,即EncodedImage
这个回调是在编码器的编出一帧图像后回调的,即在OnEncodedImage中,调用了VideoStreamEncoderObserver的OnSendEncodedImage方法。这个方法的参数为EncodedImage,就编码后的图像,这里有编码的相关参数,比如_encodedWidth,encodedHeight。另外,还有个成员timing,用来记录编码相关的时间
最后来看看StreamState的赋值。首先是触发了SendStatisticsProxy的OnSendEncodedImage方法,然后通过RtpConfig的ssrcs,获取当前的ssrc,进而,通过GetStatsEntry方法,得到指定ssrc所对应的StreamState,最后再根据EncodedImage中的相关信息,为StreamState赋值
小结一下,Webrtc中统计信息,发送信息,是通过SendStatisticsProxy进行统计,这个类具有多重身份,还是很多模块的观察者,因此这些模块的关键信息,被汇聚到这个类中,从而为对应的VideoSendStream::Stats赋值