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

相关推荐
web前端进阶者3 小时前
webRtc之指定摄像头设备绿屏问题
webrtc
livemetee1 天前
一个基于Netty和WebRTC的实时通讯系统
webrtc
音视频牛哥1 天前
WebRTC并非万能:RTMP与RTSP的工程级价值再认识
webrtc·大牛直播sdk·轻量级rtsp服务·rtsp播放器·rtmp播放器·rtmp一对一互动·rtmp同屏互动
从后端到QT1 天前
WebRTC 服务器之SRS服务器性能优化配置
运维·服务器·webrtc
livemetee2 天前
WebRTC ICE 服务器搭建
运维·服务器·webrtc
学而知不足~2 天前
WebRtc11:SDP详解
webrtc
shao9185163 天前
Gradio全解20——Streaming:流式传输的多媒体应用(5)——基于WebRTC的摄像头实时目标检测
人工智能·目标检测·webrtc·yolov10·twilio·yoloe·turn服务器
cuijiecheng20183 天前
Windows下编译WebRTC源码
webrtc
从后端到QT3 天前
WebRTC 服务器之Janus视频会议插件信令交互
webrtc