Janus是一个开源的 WebRTC SFU 服务器,可以作为 WebRTC 的一个端将其收到的数据进行转发,同时提供了一些的控制能力。Janus 是基于插件架构的,其功能都是通过一个个插件来提供,我们可以为 Janus 开发插件,来扩展其功能。

一、编译部署

Janus 可以方便的在 Linux 和 MacOS 上面编译部署,暂时不支持 Windows 系统,但可以在 Win10 的Windows Subsystem for Linux上编译部署。

1.1 安装依赖项

在编译 Janus 之前,需要安装如下依赖项:

  • Jansson
  • libconfig
  • libnice (at least v0.1.15 suggested, master recommended)
  • OpenSSL (at least v1.0.1e)
  • libsrtp (at least v1.5 suggested)
  • usrsctp (only needed if you are interested in Data Channels)
  • libmicrohttpd (only needed if you are interested in REST support for the Janus API)
  • libwebsockets (only needed if you are interested in WebSockets support for the Janus API)
  • cmake (only needed if you are interested in WebSockets and/or BoringSSL support, as they make use of it)
  • rabbitmq-c (only needed if you are interested in RabbitMQ support for the Janus API or events)
  • paho.mqtt.c (only needed if you are interested in MQTT support for the Janus API or events)
  • nanomsg (only needed if you are interested in Nanomsg support for the Janus API)
  • libcurl (only needed if you are interested in the TURN REST API support)

Janus 的某些插件可能还依赖下面的库:

  • Sofia-SIP (only needed for the SIP plugin)
  • libopus (only needed for the bridge plugin)
  • libogg (needed for the voicemail plugin and/or post-processor)
  • libcurl (only needed if you are interested in RTSP support in the Streaming plugin or in the sample Event Handler plugin)
  • Lua (only needed for the Lua plugin)

另外,还需要安装如下工具:

上面的所有库通常在多数 Linux 发行版中都有提供,可以直接安装。以在Fedora中安装为例:

1
2
3
4
yum install libmicrohttpd-devel jansson-devel \
openssl-devel libsrtp-devel sofia-sip-devel glib2-devel \
opus-devel libogg-devel libcurl-devel pkgconfig gengetopt \
libconfig-devel libtool autoconf automake

需要注意的是,如果你尝试在CentOS上面安装这些依赖项,需要先执行yum install epel-release .

UbuntuDebian系统上,执行如下命令:

1
2
3
4
aptitude install libmicrohttpd-dev libjansson-dev \
libssl-dev libsrtp-dev libsofia-sip-ua-dev libglib2.0-dev \
libopus-dev libogg-dev libcurl4-openssl-dev liblua5.3-dev \
libconfig-dev pkg-config gengetopt libtool automake

在低版本的系统上(如低于Ubuntu 14.04 LTS版本),可能没有提供的libopus的预编译包,如果遇到这种情况,需要手动编译opus.

1.1.1 libnice

libnice虽然在大多数系统上都提供了预编译包,但可能会导致一些问题,所以建议先卸载老版本,然后下载 libnice 的master的版本,手动编译:

1
2
3
4
5
git clone https://gitlab.freedesktop.org/libnice/libnice
cd libnice
./autogen.sh
./configure --prefix=/usr
make && sudo make install

确保已经移除老版本,否则会产生冲突。如果需要保留多个版本的 libnice,可以执行pkg-config --cflags --libs nice确保 Janus 可以找到正确的版本,如果无法找到,可以在编译 Janus 之前设置PKG_CONFIG_PATH环境变量,如export PKG_CONFIG_PATH=/path/to/libnice/lib/pkgconfig

1.1.2 libcurl

如果后期需要编译安装 Janus 的Event Handler插件,还需要安装 libcurl 库的开发版本,在 Fedora/CentOS 上通常为libcurl-devel,在 Ubuntu/Debian 上通常为libcurl4-openssl-dev

1.1.3 libsrtp

假如已经安装了libsrtp 1.5 之前的版本,需要先卸载,然后手动安装1.5x 或 1.6x版本。因为 1.4x 版本会导致 WebRTC 出现一些问题。
以安装2.2.0版本为例:

1
2
3
4
5
wget https://github.com/cisco/libsrtp/archive/v2.2.0.tar.gz
tar xfv v2.2.0.tar.gz
cd libsrtp-2.2.0
./configure --prefix=/usr --enable-openssl
make shared_library && sudo make install

Janus 的 configure 脚本可以自动检测到使用的 libsrtp 的版本,如果同时安装了 1.5x 和 2.x 版本,会优先使用 2.x 版本,如果想强制使用 1.5 或者 1.6 版本,可以在 configure 命令传入--disable-libsrtp2 参数。

假如安装的是 x86/x64 版本的 libsrtp,需要在 configure 命令传入--libdir=/usr/lib64参数。

1.1.4 BoringSSL

如果需要使用BoringSSL代替OpenSSL (因为使用BoringSSL可以使用--enable-dtls-settimeout功能),可以通过如下命令手动安装,并且在 configure 命令传入--enable-boringssl参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
git clone https://boringssl.googlesource.com/boringssl
cd boringssl
# Don't barf on errors
sed -i s/" -Werror"//g CMakeLists.txt
# Build
mkdir -p build
cd build
cmake -DCMAKE_CXX_FLAGS="-lrt" ..
make
cd ..
# Install
sudo mkdir -p /opt/boringssl
sudo cp -R include /opt/boringssl/
sudo mkdir -p /opt/boringssl/lib
sudo cp build/ssl/libssl.a /opt/boringssl/lib/
sudo cp build/crypto/libcrypto.a /opt/boringssl/lib/

Janus 默认 BoringSSL 安装在/opt/boringssl,如果不是,可以通过--enable-boringssl=/path/to/boringssl指定。

1.1.5 usrcstp

1
2
3
4
git clone https://github.com/sctplab/c
cd usrsctp
./bootstrap
./configure --prefix=/usr && make && sudo make install
  • Note: 假如安装的是 x8/x64 版本的 usrcstp,需要在 configure 命令传入 --libdir=/usr/lib64 参数。

1.1.6

如果需要提供 websockets 信令支持,还需要安装 libwebsockets 库:

1
2
3
4
5
6
7
8
9
git clone https://libwebsockets.org/repo/libwebsockets
cd libwebsockets
# If you want the stable version of libwebsockets, uncomment the next line
# git checkout v2.4-stable
mkdir build
cd build
# See https://github.com/meetecho/janus-gateway/issues/732 re: LWS_MAX_SMP
cmake -DLWS_MAX_SMP=1 -DCMAKE_INSTALL_PREFIX:PATH=/usr -DCMAKE_C_FLAGS="-fpic" ..
make && sudo make install

1.1.7 文档

如果需要编译 Janus 文档,需要安装如下工具:

Fedora:

1
yum install doxygen graphviz

Ubuntu/Debian:

1
aptitude install doxygen graphviz

二、编译

在安装完依赖项之后,使用下面命令获取 Janus 代码:

1
2
3
4

- [ ] git clone https://github.com/meetecho/janus-gateway.git cd
janus-gateway

然后使用sh autogen.sh命令生成 configure 文件。
最后,执行 configure 和编译命令开始编译:

1
2
3
./configure --prefix=/opt/janus --enable-boringssl
make
make install

编译完成之后,使用make configs命令生成默认配置文件,配置文件位于/opt/janus/etc/janus/janus.jcfg。需要注意的是,每次执行make configs命令都会将/opt/janus/etc/janus/janus.jcfg文件还原为默认配置。

三、运行、测试

我们可以先不修改任何配置,将 Janus 运行起来,然后使用测试 html,测试一下效果。
执行如下命令,运行 Janus:

1
/opt/janus/bin/janus

Janus 启动完成之后,我们另寻一台客户机,将 Janus 源码下载下来,修改janus-gateway\html\echotest.js文件中server变量为:"ws://47.93.47.150:8188",如:

1
2
3
4
5
6
7
var server = null;
if(window.location.protocol === 'http:')
server = "http://" + window.location.hostname + ":8088/janus";
else
server = "https://" + window.location.hostname + ":8089/janus";

server = "ws://47.93.47.150:8188";

在浏览器中打开echotest.html,点击“Start”即可看到效果。

如果无法连接成功,可能是因为iceServers默认使用的是 google 的 turn 服务器,国内无法访问导致,可以参考 如何搭建WebRTC的TURN服务器 搭建自己的 TURN 服务器。