0%

janus各文件及目录的作用

janus架构图

《音视频会议系统-janus的安装与布署》一文中我已经向你介绍了如何布署janus,今天我们再来了解一下janus的源码,看看janus包括哪些文件以及它们所起的作用是什么。

下载 janus 源码

janus源码可以在这里找到,执行下面命令就可将其下载下来:

1
2
git clone https://github.com/meetecho/janus-gateway.git
cd janus-gateway

janus各源码文件的作用

下载好janus源码后,你可以看到janus目录下有很多文件,这里我列出了比较重要的几个文件,下面来说明一下它们起所的作用是什么。目录列表如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
events           # 主要用于各种事件消息的分析
plugins # 各种业务插件,所有的业务应用都在这里实现
transports # 用于处理各种网络信令,HTTP、WebSocket、MQTT等
docs # janus的文档,它是通过 Doxygen 生成的,janus的文档还是很全面的
html # Web端的Demo都放在这里
rtcp.h # RTCP 是RTP的控制协议
rtcp.c # RTCP 协议的具体实现
rtp.c # RTP协议的实现,它用于传输音视频数据
rtp.h # RTP 协议的头文件
rtpsrtp.h # SRTP 协议
sctp.c # SCTP 协议的实现
sctp.h # SCTP 协议的头文件
sdp.c # SDP 协议的实现
sdp.h # SDP 协议的头文件
sdp-utils.c # 处理 SDP 的常用工具
sdp-utils.h
test # 测试文件所在目录
record.c # janus的录制功能在该文件中实现
record.h
ice.c # janus 使用 libnice 实现 ICE 功能,该文件是对libnice库的封装
ice.h
janus.c # 该文件是janus的主框架程序,里边做了很多事儿
janus.h
log.c # 日志
log.h
dtls-bio.c # DTLS 中 BIO 的实现
dtls-bio.h
dtls.c # DTLS 协议实现
dtls.h
events.c # 配合events插件与janus core连接用的
events.h

对于上面的文件我们可能将它们分成几大类:

  • 业务插件,plugins目录下的所有文件都属于该类,其主要作用是实现不同的业务逻辑的服务端,如echotestvideoroomvideocall等。
  • 事件分析,events目录下的所有文件以及events.c|h,其作用是收集事件消息,做分析使用。这个功能只能高级用户才会用,对于一般用户来说可以不关注它。
  • 协议,包括 rtp.c|hrtcp.c|hrtpsrtp.hstcp.c|hsdp.c|hdtls.c|hdtls-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
2
3
4
5
6
7
8
transport.h             # 定义了`信令传输`插件的接口
transport.c # 定义了几个通用的释放资源的函数
janus_http.c # HTTP 接口,默认使用的接口
janus_mqtt.c # MQTT 接口,编译时需要明确指定才会编入janus
janus_pfunix.c # UNIX 接口
janus_nanomsg.c # NanoMSG 接口
janus_rabbitmq.c # RabbitMQ 接口
janus_websockets.c # Websocket 接口

janus支持的信令接口方式还是蛮全的,这是它的一大优势。用户可以选择自己喜欢的接入方式进行接入。通过上面的描述你应该很容易判断出每个文件的作用,你对那个感兴趣就可以专门看那个文件。默认情况下janus使用的是HTTP接口,因此该接口也是最成熟的。

业务插件

janus支持很多业务插件,这对于很多用户来说也是一个非常棒的特点,我们来看一下它都支持那些插件吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
plugin.h                # 定义了业务插件的接口
plugin.c # 实现了一些公用的释放资源的函数
janus_echotest.c # 回显业务插件
janus_videocall.c # 1:1视频通讯业务插件
janus_videoroom.c # 会议业务插件
janus_textroom.c # 文本聊天室插件
janus_streaming.c # 传输直接流插件,可以播放视频文件,或其它的RTP数据流
streams
janus_recordplay.c # 录制回放业务插件
recordings
janus_sip.c # sip 业务插件,主要用于与电话业务的互通
janus_nosip.c # 包含sip信令业务插件,用它可以中转RTP数据
janus_audiobridge.c # 音频会议插件
janus_voicemail.c # 语言信箱业务插件
janus_lua.c # lua 语言开发插件
janus_lua_extra.h
janus_lua_extra.c
janus_lua_data.h
lua
janus_duktape.c # duktape语言插件
janus_duktape_extra.h
janus_duktape_extra.c
janus_duktape_data.h
duktape
duktape-deps

通过上面的文件列表,我们看到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做个初步分析,后面会对它的一些性能做下详细分析,静请期待!

参考

欢迎关注我的其它发布渠道