webrtc 快速搭建 视频通话 视频会议
webrtc 快速搭建 视频通话 视频会议
1
Android:https://github.com/ddssingsong/webrtc_android
Node服务器:https://github.com/ddssingsong/webrtc_server_node
Java服务器:https://github.com/ddssingsong/webrtc_server_java/tree/nodejs_copy
java版需要看清楚分支是:nodejs_copy
2 安装node和npm
wget https://nodejs.org/dist/v10.16.0/node-v10.16.0-linux-x64.tar.xz
# 解压
tar -xvf node-v10.16.0-linux-x64.tar.xz -C /usr/local
# 改名
mv node-v10.16.0-linux-x64 nodejs
# 进入目录
cd nodejs/
# 确认一下nodejs下bin目录是否有node和npm文件,如果有就可以执行软连接
sudo ln -s /usr/local/nodejs/bin/npm /usr/local/bin/
sudo ln -s /usr/local/nodejs/bin/node /usr/local/bin/
node -v
npm -v
3准备工作
yum -y install openssl-devel
openssl req -x509 -newkey rsa:2048 -keyout /etc/turn_server_pkey.pem -out /etc/turn_server_cert.pem -days 99999 -nodes

生成了key,并保存再 /etc/turn_server_pkey.pem;
生成了cert,并保存再 /etc/turn_server_cert.pem;
有效期99999天。

如果报错: openssl error while loading shared libraries: libssl.so.1.1
ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
4 安装libevent
这是一个c的扩展库
Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大;源代码相当精炼、易读;跨平台,支持 Windows、 Linux、 *BSD 和 Mac Os;支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。Libevent 已经被广泛的应用,作为底层的网络库;比如 memcached、 Vomit、 Nylon、 Netchat等
wget --no-check-certificate https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz
tar -zxvf libevent-2.1.12-stable.tar.gz
cd libevent-2.1.12-stable/
./configure
make
make install
ls -al /usr/local/lib | grep libevent

5 安装coturn(turn服务器)穿透和转发服务器
5.1 安装 coturn
ubuntu安装
sudo apt install coturn
centos安装
wget --no-check-certificate https://github.com/coturn/coturn/archive/4.5.1.1.tar.gz
tar -zxvf 4.5.1.1.tar.gz
cd coturn-4.5.1.1
./configure
make
make install

5.2 生成用户
turnadmin -a -u chr -p 11111 -r xiaosi.com
上面的命令,将创建用户chr,密码为11111 ,同时指定realm为xiaosi.com,大家根据实际情况修改(包括那个xiaosi.com都是随便写)
5.3 修改配置文件
cd /usr/local/etc ##去到配置文件目录
cp turnserver.conf.default turnserver.conf

vim turnserver.conf
里面都是注释,直接再最下面插入
#与前ifconfig查到的网卡名称一致
relay-device=eth0
#内网IP
listening-ip=10.0.8.3
#公网IP
external-ip=119.91.104.48
#用户名密码,创建IceServer时用
user=chr:11111
#一般与turnadmin创建用户时指定的realm一致
realm=xiaosi.com
#端口号
listening-port=3478
#不开启会报CONFIG ERROR: Empty cli-password, and so telnet cli interface is disabled! Please set a non empty cli-password!错误
cli-password=qwerty
cert=/etc/turn_server_cert.pem
pkey=/etc/turn_server_pkey.pem
5.4 开启3478的tcp和udp端口
firewall-cmd --zone=public --add-port=3478/udp --permanent
firewall-cmd --zone=public --add-port=3478/tcp --permanent
firewall-cmd --reload
查看端口是否开放
firewall-cmd --zone=public --query-port=3478/tcp
firewall-cmd --zone=public --query-port=3478/udp
5.5 开启服务
需要注意的是,-r参数后面是上一步的-r的值
turnserver -a -f -r xiaosi.com

然后ctrl+C退出,使用 -o 参数后台启动
turnserver -a -o -f -r xiaosi.com
5.6 测试turn服务器
webrtc-samples官网提供了一个测试用的地址
https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/
进去之后是这个样子

添加turn服务器

同理,添加两个,一个stun,一个turn,

测试

6 安装webrtc服务器和浏览器端
git clone https://github.com/ddssingsong/webrtc_server_node.git
cd webrtc_server
public/dist/js/SkyRTC-client.js,设置穿透服务器
vim public/dist/js/SkyRTC-client.js

vim public/dist/js/conn.js
最后一行
如果没有配wss代理
rtc.connect(“ws:” + window.location.href.substring(window.location.protocol.length).split(‘#’)[0], window.location.hash.slice(1));
如果配了nginx wss代理
rtc.connect(“wss:” + window.location.href.substring(window.location.protocol.length).split(‘#’)[0]+“/wss”, window.location.hash.slice(1));
后面的那个“/wss”是根据自己配的代理路径
7 nginx配置
mkdir /cert
openssl genrsa -out cert.pem 1024
openssl req -new -key cert.pem -out cert.csr

openssl x509 -req -days 3650 -in cert.csr -signkey cert.pem -out cert.crt
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
#代理https
upstream web {
server 0.0.0.0:3000;
}
#代理websocket
upstream websocket {
server 0.0.0.0:3000;
}
server {
listen 443;
server_name localhost;
ssl on;
ssl_certificate /cert/cert.crt;#配置证书
ssl_certificate_key /cert/cert.key;#配置密钥
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 50m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 SSLv2 SSLv3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
#wss 反向代理
location /wss {
proxy_pass http://websocket/; # 代理到上面的地址去
proxy_read_timeout 300s;
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'Upgrade';
}
#https 反向代理
location / {
proxy_pass http://web/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
测试浏览器
#访问
https://serverIp#roomName
如:
外网:https://192.168.1.123/#123
内网:http:192.168.1.123:3000#123
查看效果,其中roomName为进入的房间名,不同房间的用户无法互相通话
测试客户端
将这个项目下下来使用 android studio 编译并安装
https://github.com/ddssingsong/webrtc_android
修改WebrtcUtil.java,要去掉界面上的地址哦
// turn and stun
// 外网测试才需要
private static MyIceServer[] iceServers = {
new MyIceServer("stun:stun.l.google.com:19302"),
new MyIceServer("118.25.25.147:3478?transport=udp"),
new MyIceServer("118.25.25.147:3478?transport=udp",
"ddssingsong",
"123456"),
new MyIceServer("118.25.25.147:3478?transport=tcp",
"ddssingsong",
"123456"),
};
// 外网测试
private static String WSS = "wss://47.254.34.146/wss";
//本地内网信令地址
private static String WSS = "ws://192.168.1.122:3000";


更多推荐
所有评论(0)