WebRTC 服务器之Janus概述和环境搭建

1 概述

Janus 是由 Meetecho 开发的通用 WebRTC 服务器,它为构建 WebRTC 应用程序提供了一个模块化框架。服务器目标:Janus WebRTC 网关被设计为轻量级、通用的 WebRTC 服务器,除了实现以下方法外,它本身不提供任何功能:

  • 设置与浏览器的 WebRTC 媒体通信
  • 在客户端和服务器之间交换 JSON 消息
  • 在浏览器和服务器端应用程序逻辑之间中继 RTP/RTCP 和消息

实际功能是在浏览器通过 Janus 核心连接的服务器端插件中实现的。这种模块化架构允许占用空间小,同时提供最大的灵活性。

1.1 主要特点

  • 模块化架构:将核心 WebRTC 功能与应用程序特定逻辑分离
  • 轻量级核心:用 C 语言编写,占用空间小
  • 插件系统:可通过各种应用程序(视频会议、流媒体、SIP 网关等)的插件进行扩展
  • 多种传输机制:支持 HTTP/REST、WebSockets、RabbitMQ、MQTT 和 Unix 套接字
  • 会话管理:处理连接、WebRTC 会话和插件附件
  • 媒体处理:处理媒体协商、编码和传输
  • 录制功能:支持录制 WebRTC 会话

2 janus搭建

**云服务器端口开放(本地虚拟机环境则关闭防火墙即可)**需要在安全组开放端口:

TCP/UDP 3478

UDP 30000-60000

2.1基础环境

复制代码
sudo aptitude install libmicrohttpd-dev libjansson-dev libnice-dev libsofia-sip-ua-dev libopus-dev libogg-dev libcurl4-openssl-dev pkg-config gengetopt libtool automake libglib2.0-dev cmake libconfig-dev libssl-dev doxygen graphviz libavcodec-dev libavformat-dev libswscale-dev libavutil-dev

2.2 源码安装依赖

2.2.1 安装 WebSocket

复制代码
git clone https://github.com/warmcat/libwebsockets.git
cd libwebsockets
git branch -a 查看选择最新的稳定版本, 
git checkout v4.3.0 切换到较新稳定版本
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -DCMAKE_C_FLAGS="-fpic" ..
make && sudo make install

2.2.2 安装 libsrtp

复制代码
git clone https://gitee.com/MediaNext/libsrtp.git
cd libsrtp
git checkout v2.3.0
./configure --prefix=/usr --enable-openssl
make shared_library && sudo make install

2.2.3 安装libmicrohttpd

复制代码
wget https://ftp.gnu.org/gnu/libmicrohttpd/libmicrohttpd-0.9.71.tar.gz
tar zxf libmicrohttpd-0.9.71.tar.gz
cd libmicrohttpd-0.9.71/
./configure
make
sudo make install

2.2.4安装nginx

复制代码
wget http://nginx.org/download/nginx-1.15.8.tar.gz
tar xvzf nginx-1.15.8.tar.gz
cd nginx-1.15.8/

# 配置,一定要支持https
./configure --with-http_ssl_module 

make
sudo make install 

2.3 编译 Janus

复制代码
git clone https://github.com/meetecho/janus-gateway.git
git tag 查看当前的 tag,选择最新稳定的版本v0.10.4
git  checkout v0.10.4
sh autogen.sh
./configure --prefix=/opt/janus --enable-websockets --enable-post-processing 
make
sudo make install

3 配置文件和运行janus

3.1 基础环境配置

3.1.1 基于https生成ssl证书

复制代码
mkdir -p ~/cert
cd ~/cert
# CA私钥
openssl genrsa -out key.pem 2048
# 自签名证书
openssl req -new -x509 -key key.pem -out cert.pem -days 1095

3.1.2设置全局域名IP对应关系

后面需要填写一大堆ip,为了方便修改ip我们在 Ubuntu 中将 IP 作为全局域名的常见设置。

vim /etc/hosts

复制代码
#新增域名 格式你的云服务器ip+本地环境的域名。后续填写域名即可
#本地就用127.0.0.1
117.111.111.111 janusserver.com

3.1.3修改nginx配置文件

janus服务器程序文件夹在/opt/janus/

基于nginx配置文件重定向至 /opt/janus/share/janus/demos

复制代码
# HTTPS server
    server {
        listen       443 ssl;
        server_name  localhost;
		# 配置相应的key
        ssl_certificate      /home/ubuntu/cert/cert.pem;
        ssl_certificate_key  /home/ubuntu/cert/key.pem;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
				
        location / {
           # 指向janus demo所在目录
            root   /opt/janus/share/janus/demos;
            index  index.html index.htm;
        }
    }

启动nginx

复制代码
sudo /usr/local/nginx/sbin/nginx

然后通过访问 https://127.0.0.1/ 。可以看到界面,但此时还不能正常通话。

3.1.4 安装和启动coturn

打洞服务器,本地测试可忽略。

复制代码
sudo apt-get install libssl-dev
sudo apt-get install libevent-dev


#git clone https://github.com/coturn/coturn 
#cd coturn
# 提供另一种安装方式turnserver是coturn的升级版本
wget http://coturn.net/turnserver/v4.5.0.7/turnserver-4.5.0.7.tar.gz
tar xfz turnserver-4.5.0.7.tar.gz
cd turnserver-4.5.0.7
 
./configure 
make && sudo make install

sudo nohup turnserver -L 0.0.0.0 --min-port 50000 --max-port 60000  -a -u 用户名:密码-v -f -r nort.gov &

3.2 janus 配置文件之Video room功能

janus配置

janus安装目录在/opt/janus。文件结构:

|-------|-----------|-----------|--------|-----------------------|
| ./bin | ./etc | ./include | ./lib | ./share |
| 可执行文件 | janus配置文件 | janus头文件 | janus库 | 存放脚本或者文档,web demo也在这里 |

需要配置的文件为(目录/opt/janus/etc/janus)先备份。先把.sample后缀的文件拷贝成jcfg后缀

复制代码
# 进到对应的目录
cd /opt/janus/etc/janus
# 拷贝文件
 cp janus.jcfg.sample janus.jcfg
 cp janus.transport.http.jcfg.sample janus.transport.http.jcfg
 cp janus.transport.websockets.jcfg.sample janus.transport.websockets.jcfg
 cp janus.plugin.videoroom.jcfg.sample janus.plugin.videoroom.jcfg
 cp janus.transport.pfunix.jcfg.sample janus.transport.pfunix.jcfg
 cp janus.plugin.streaming.jcfg.sample	 janus.plugin.streaming.jcfg
 cp janus.plugin.recordplay.jcfg.sample janus.plugin.recordplay.jcfg
 cp janus.plugin.voicemail.jcfg.sample janus.plugin.voicemail.jcfg
 cp janus.plugin.sip.jcfg.sample janus.plugin.sip.jcfg
 cp janus.plugin.nosip.jcfg.sample janus.plugin.nosip.jcfg
 cp janus.plugin.textroom.jcfg.sample  janus.plugin.textroom.jcfg
 cp janus.plugin.echotest.jcfg.sample janus.plugin.echotest.jcfg

3.2.1 配置janus.jcfg

复制代码
#大约202行左右,设置udp端口范围。
rtp_port_range = "50000-60000"
# 237行
stun_server = janusserver.com
        stun_port = 3478
        nice_debug = false
# 大概267行 填写云服务器外网ip地址
nat_1_1_mapping = janusserver.com

#打洞服务器配置大概274行
# credentials to authenticate...
        turn_server = janusserver.com
        turn_port = 3478
        turn_type = "udp"
        turn_user = 用户名
        turn_pwd = 密码
rtp_port_range = "50000-60000"

3.2.2 配置janus.transport.http.jcfg

复制代码
general: {
        json = "indented"                              
        base_path = "/janus"                    
        threads = "unlimited"                  
        http = true                                            
        port = 8088                                           
        https = true                                   
        secure_port = 8089                             
}

certificates: {
        cert_pem = "/root/cert/cert.pem"
        cert_key = "/root/cert/key.pem"
        #cert_pwd = "secretpassphrase"
        #ciphers = "PFS:-VERS-TLS1.0:-VERS-TLS1.1:-3DES-CBC:-ARCFOUR-128"
}

3.2.3 配置janus.transport.websockets.jcfg

复制代码
general: {
        json = "indented"                             
        ws = true                                             
        ws_port = 8188                                 
        wss = true                                             
        wss_port = 8989                       
}
certificates: {
	cert_pem = "/root/cert/cert.pem"
	cert_key = "/root/cert/key.pem"
	#cert_pwd = "secretpassphrase"
	#ciphers = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256"
}

3.3 修改.js文件,指定wss协议

/opt/janus/share/janus/demos/videoroomtest.js

复制代码
var server = "wss://" + window.location.hostname + ":8989";

3.4 配置coturn地址

本地测试无需打洞,部署云服务且使用打洞才需要这一步。

/opt/janus/share/janus/demos/videoroomtest.js

这里要写你的服务器ip,使用本地域名方式解析不出来

复制代码
#83行添加
					server: server,
					iceServers :[{
						urls: [
							"turn:127.0.0.1(这里要写你的服务器ip,使用域名解析不出来):3478?transport=udp",
							"turn:127.0.0.1(同理):3478?transport=tcp"      
						],
						username: "jbj",
						credential: "123456"
					},
					{
						urls: [
							"stun:127.0.0.1:3478"
						]
					}],
					success: function() 

3.5 运行

涉及服务启动有点多,在这里进行总结。

复制代码
#nginx启动
sudo /usr/local/nginx/sbin/nginx  
#启动coturn
sudo nohup turnserver -L 0.0.0.0 --min-port 50000 --max-port 60000  -a -u 用户名:123456 -v -f -r nort.gov &
#jauns运行
/opt/janus/bin/janus --debug-level=5 --log-file=$HOME/janus-log

访问

复制代码
https://IP/
或者
https://IP/videoroomtest.html

4.效果

学习资料分享

0voice · GitHub

相关推荐
_可乐无糖18 小时前
AWS WebRTC:获取ICE服务地址(part 2): ICE Agent的作用
服务器·网络·webrtc
lqj_本人1 天前
鸿蒙OS&基于UniApp的WebRTC视频会议系统实践:从0到1的HarmonyOS适配之路#三方框架 #Uniapp
uni-app·webrtc·harmonyos
邪恶的贝利亚1 天前
webrtc初了解
webrtc
_可乐无糖3 天前
AWS WebRTC:获取ICE服务地址(part 3):STUN服务和TURN服务的作用
云计算·webrtc·aws
_可乐无糖5 天前
AWS WebRTC:获取ICE服务地址(part 1)
webrtc
_可乐无糖6 天前
AWS WebRTC:获取信令服务节点和ICE服务节点
webrtc
metaRTC7 天前
君正Ingenic webRTC P2P库libyangpeerconnection7编程指南
webrtc·p2p
超级土豆粉8 天前
WebRTC:实时通信的未来之路
webrtc
diygwcom10 天前
个人理解 火山引擎的实时对话 AI 如何利用 WebRTC、大模型、语音识别(ASR)、语音合成(TTS)等技术实现低延迟的实时对话功能。
人工智能·webrtc·火山引擎
谷云龙GGBond11 天前
【WebRTC】源码更改麦克风权限
webrtc