背景
自己决定整理整理之前的笔记,今天整理的这一篇是webrtc相关的,自己在这方面已经工作了几年了,之前也总结了一些文档,正好借助网络的平台整理整理
对象图
channelmanager_class.png对象图分析
这张图我觉得是一个非常宏观的图了,我们研究的最多的音视频模块,居然在这张图里,也只是一小部分而已。现在重新来看这张图,回忆当时绘图的思路,总结总结。
WebRtcSession
这个Session,可以说是webrtc对通话模型的一个抽象,那么在进行webrtc通话的时候,可以有音频,也可以有视频,还可以有一些数据(信息,文件等)。因此可以理解为WebRtcSession是一个最宏观的抽象了
BaseChannel
在webrtc通话的过程中,显然形式是丰富多彩的,如上面介绍的,可以有视频,音频,以及数据。因此webrtc对这些元数据也进行了抽象封装,这就是BaseChannel,即基本通道。这是一个基类,继承这个基类的,有VideoChannel,VoiceChannel以及DataChannel,分别负责传输视频数据,音频数据以及其他数据。
ChannelManager
介绍完了BaseChannel,以及其三种多态形式,下面介绍ChannelManager,这其实也是常见的思路,在Android中会经常有类似的命名方式,xxxMaster,xxxManager,xxxHolder等等,其实都是一个控制类。控制什么呢?从名字就可以看出来,就是控制Channel的,究竟是哪个channel呢?就是上面介绍的BaseChannel。再具体一点,实际上上述的三个channel,都是由channelmanager创建出来的。从对象图中我们可以看到这种关系,WebRtcSession有一个成员变量(has-a)ChannelManager,而ChannelManager创建了(create)三种Channel(VoiceChannel,VIdeoChannel以及DataChannel)
MediaChannel
下面看看MediaChannel,前面介绍了BaseChannel,以及其三个衍生品,但BaseChannel的主要职责是发送数据,那么数据究竟是怎么产生的呢?我们知道,无论是音频数据,还是视频数据,都要经过一系列的流程才可以产生,比如采集,编码,分包。这个过程显然并不是BaseChannel的职责,专门有对象负责这些事情,就是MediaChannel,也就是媒体通道。由此可见,Webrtc中的通道很多,但是实际上是各司其职,每个通道都由各自的用途。那么MediaChannel和BaseChannel之间的关系是什么样呢?实际上也是has-a的关系,即每个BaseChannel中都有一个MediaChannel。
WebRtcVideoChannel2
提起WebRtcVideoChannel2我们应该再熟悉不过了,相信对于开发webrtc视频底层相关同学,都很熟悉这个对象了,正是这个对象,封装了视频的采集,编解码,以及分包,解包。实际上这个结构体的本质,就是一个MediaChannel,从对象图中我们可以看见这个继承关系。如果要是个性化开发的话,实际上也就是从WebRtcVideoChannel2入手就可以了,在52版本上,拿到camera的数据,并和WebRtcVideoChannel2挂钩,并且配置WebRtcVideoChannel2的发送/接受码流,以及其参数,视频就可以打通了。
MediaEngineInterface
既然介绍了MediaChannel,自然就要想到,究竟是谁创建了MediaChannel呢?就如同上面介绍的,ChannelManager创建了BaseChannel,这里MediaEngineInterface创建了MediaChannel。即媒体引擎创建了媒体通道。这里的媒体引擎,是一个Interface,显然,webrtc的思想是基于抽象进行编程,因此这里提取了Interface层。这种解耦的设计方式也值得我们学习。
CompositeMediaEngine
这个对象是MediaEngineInterface的实现类,从命名上来看,实际上是一个组合的媒体引擎,何谓组合呢?就是其有两个成员,其一为WebRtcVoiceEngine,专门负责创建音频的MediaChannel;其二为WebRtcVideoEngine2,专门负责创建视频的MediaChannel,也就是WebRtcVideoChannel2。这种组合的方式的设计,让整个框架更有弹性,比如其中的一个好处,就是音频,视频引擎可以独立的升级。我们注意到WebRtcVideoEngine2和WebRtcVideoChannel2都有一个2,表明是一个升级版本。由于采用了组合模式,音频和视频的升级相对独立。
WebRtcMediaEngine2
最后要说说WebRtcMediaEngine2了,这个对象我们也应该非常熟悉。实际上初次了解Webrtc媒体相关的同学,可能就是从WebRtcVideoEngine2以及WebRtcVideoChannel2看起的。但是可能这两个结构体在整个webrtc中的位置就不是很清晰了。从对象图上可以很容易的看出两者的关系,WebRtcMediaEngine2本质上是一个MediaEngineInterface,其作用就是为BaseChannel创建MediaChannel。
小结
- WebRtcSession是一个最宏观的抽象
- WebRtcSession中有一个成员是ChannelManager
- ChannelManager的作用是创建BaseChannel
- BaseChannel分为VoiceChannel,VideoChannel以及DataChannel
- BaseChannel有一个MediaChannel
- ChannelManager的成员MediaEngineInterface负责创建MediaChannel
- 具体到视频,WebRtcVideoEngine2创建了WebRtcVideoChannel2
- MediaChannel负责媒体数据的采集,编解码,以及分包解包数据
网友评论