在《音视频会议系统-janus的安装与布署》一文中我已经向你介绍了如何布署janus
,今天我们再来了解一下janus
的源码,看看janus
包括哪些文件以及它们所起的作用是什么。
下载 janus 源码
janus
源码可以在这里找到,执行下面命令就可将其下载下来:
1 | git clone https://github.com/meetecho/janus-gateway.git |
janus各源码文件的作用
下载好janus
源码后,你可以看到janus
目录下有很多文件,这里我列出了比较重要的几个文件,下面来说明一下它们起所的作用是什么。目录列表如下:
1 | events # 主要用于各种事件消息的分析 |
对于上面的文件我们可能将它们分成几大类:
- 业务插件,
plugins
目录下的所有文件都属于该类,其主要作用是实现不同的业务逻辑的服务端,如echotest
、videoroom
、videocall
等。 - 事件分析,
events
目录下的所有文件以及events.c|h
,其作用是收集事件消息,做分析使用。这个功能只能高级用户才会用,对于一般用户来说可以不关注它。 - 协议,包括
rtp.c|h
、rtcp.c|h
、rtpsrtp.h
、stcp.c|h
、sdp.c|h
、dtls.c|h
、dtls-bio.c|h
,这些都是用于处理不同协议的,每个文件都比较独利。 - 日志,包括
log.c|h
,这个应该一眼就可以看出来。 - 浏览器Demo,
html
目录中的所有文件,主要包括一些demo程序,如videoroom、echotest等。 - 信令传输,
transports
目录下的文件属于该类,作用是接收不同传输协议发送过来的消息,并使用同样的协议将响应消息返回。 - 数据传输,
ice.c|h
,它是对libnice
库的封装,用于媒体数据的传输。 - janus核心,
janus.c|h
,这是janus
中最核心的文件,程序的启动,插件的加载,数据的流转都是通过它来实现的。
在上面几个类别中, janus核心、数据传输、信令传输、业务插件、浏览器Demo 中的代码是比较重要的,所以是你在阅读代码时需要重点看的内容。由于信令传输、业务插件、浏览器Demo都是目录,里边还包括了很多文件,所以下面我们再来看看这三个目录中都包括了那些文件。
信令传输
进入到 transports
目录,你会它有以下几个文件:
1 | transport.h # 定义了`信令传输`插件的接口 |
janus
支持的信令接口方式还是蛮全的,这是它的一大优势。用户可以选择自己喜欢的接入方式进行接入。通过上面的描述你应该很容易判断出每个文件的作用,你对那个感兴趣就可以专门看那个文件。默认情况下janus
使用的是HTTP接口,因此该接口也是最成熟的。
业务插件
janus
支持很多业务插件,这对于很多用户来说也是一个非常棒的特点,我们来看一下它都支持那些插件吧。
1 | plugin.h # 定义了业务插件的接口 |
通过上面的文件列表,我们看到janus
支持的插件可真不少,有会议视会议的、1:1通话的、SIP、RTP、流…等等。这些插件几乎含盖的所有的业务场景。对于用户来话,要以根据自己的需求选择上面的业务插件进行修改即可完成自己的业务了。
最后我们再来看看客户端 Demo。
HTML Demo
在janus
的html目录中有很多文件,其中大部分文件是与上面业务插件
中的内容是对应的。也就是说一个业务插件对应一个HTML Demo。所以这块的内容大家自己看一下就可以了。我就不在这里一一列出来了。
通过上面的描述,我们大体上可以知道janus
的实现并不是特别复杂。它实现了RTP/RTCP、SRTP、SCTP、DTLS/DTLS-BIO、SDP 等 WebRTC 必要的协议,而对于数据的传输则是使用libnice
库,并通过ice.c|h
对libnice 做了一层封装。
除此之外,它所有的业务层都是以plugin
的方式实现的,这对于后面的业务拓展有很大的优势。当我们要实现一个新业务时,只要按照 plugin 的规则进行开发就好了,非常简单。
另外,janus是用纯C实现的,并且使用了Linux社区丰常优秀的库glib
(注意不是glibc),这个库的性能非常好,对于在Linux 下开发的同学来说对它应该十分熟悉。
小结
通过本文,你应该对janus
的源码有了一个大体功能的了解。由于WebRTC
使用了很多的协议(如 RTP/RTCP、DTLS、SDP等),因此作为服务端的janus
也必须实现这些协议,这样才能与WebRTC
进行通信。
对于janus
使用的这些协议可能很多同学会觉得一脸懵B,不知道其中的原理和作用,如果你对这块感兴趣的话,可以去看我的网课《WebRTC入门》,在课程里我对这些协议都做了详细介绍。
如果你有一定基础的话,现在应该知道janus
的实现并不是特别复杂,但它的架构设计还是很值得借鉴的,尤其是plugin
的设计方案。
今天我只是对janus
做个初步分析,后面会对它的一些性能做下详细分析,静请期待!