前言
未编译及测试,直接裸看Janus WebRTC Server代码。
WebRTC本身只支持点对点,群聊只能客户端通过发多路音视频数据给别的客户端,对于客户端压力非常大,所以无法支持更多人的群聊,而且有些NAT是无法通过点对点对连的,所以需要一个中转服务器来中转,经过初步考察有kurento、 licode、 janus三个主要的开源项目,其中又以janus的star最多,所以就先拿这个项目研究一下,我个人是有点想写个golang版本来替代。
janus github地址:https://github.com/meetecho/janus-gateway
janus原理
初看了一下janus源码,大概原理如下:
janus使用ICE模拟WebRTC客户端与真实的WebRTC客户端进行交换candidate然后进行连接,当收到客户端数据后,转交给plugin比如janus_videoroom.c
进行处理,videoroom把RTP音视频包和RTCP包转发给同一个room的所有订阅者。
janus本身只是做一个被调用的框架,使用plugin来实现具体的业务逻辑,比如videoroom、textroom等等。
janus内置了http和websocket服务,html目录下的html+js例子通过http或者websocket来调用janus的具体功能组成业务逻辑。
janus本身使用了大量的第三方开源库,比较核心的是ICE使用libnice,SRTP使用libsrtp等等。
另个开源的WebRTC server:licode也同样使用了libnice和libsrtp,只不过licode是c++写的所以又加了一层c++封装来使用libnice。
ICE库:libnice
janus使用的ICE库是开源的libnice,libnice依赖于GLIB,而且不仅仅是有简单的ICE功能,还有STUN,TURN等等功能。
看了一下jauns只用到不多的API,我想用golang实现一个就janus有使用到的ICE功能。
未完待续...