Webrtc中的各种Channel

背景

自己决定整理整理之前的笔记,今天整理的这一篇是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。

小结

  1. WebRtcSession是一个最宏观的抽象
  2. WebRtcSession中有一个成员是ChannelManager
  3. ChannelManager的作用是创建BaseChannel
  4. BaseChannel分为VoiceChannel,VideoChannel以及DataChannel
  5. BaseChannel有一个MediaChannel
  6. ChannelManager的成员MediaEngineInterface负责创建MediaChannel
  7. 具体到视频,WebRtcVideoEngine2创建了WebRtcVideoChannel2
  8. MediaChannel负责媒体数据的采集,编解码,以及分包解包数据



作者:bigonelby
链接:https://www.jianshu.com/p/d6030e7aa282
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值