简单介绍
WebRTC实现了基于网页的视频会议,是一个支持网页浏览器进行实时语音对话或视频对话的API(来自百度),由google开发,并于2011年6月3日开源。
和直播推流不同,这是点对点通讯,服务器只是帮助建立连接,以满足视频通话的低延迟要求
分为三个服务器:
1.房间服务器:创建房间,让用户可以在一个房间内通讯
2.信令服务器:用于用户交换信令,建立连接,类似TCP握手
3.ICE服务器(内网穿透服务器):用于穿透内网IP,实现外网连接
本文基于CentOS7系统
一.安装部署房间服务器
1.安装unzip,解压zip文件时使用
yum install -y unzip
2.安装git,用于获取WebRTC源码
yum install -y git
3.安装编译需要的一些工具
yum install -y automake autoconf libtool
python 和 python-webtest
- yum -y install epel-release
- yum install python python-webtest python-pip
4.安装nodejs(需要最新的版本,从https://nodejs.org/dist查看下最新的版本),房间服务器需要使用nodejs编译
wget https://nodejs.org/dist/v16.4.2/node-v16.4.2-linux-x64.tar.gz
下载完成后解压
- mkdir nodejs
- tar -xvf node-v16.4.2-linux-x64.tar.gz -C ./nodejs/
将上面的地址配置到环境变量中
vi /etc/profile
将下面内容追加到文件最后
export PATH=/root/nodejs/node-v16.4.2-linux-x64/bin:$PATH
执行命令,使环境变量生效,如果可以执行npm命令,说明配置成功了
source /etc/profile
6.安装编译工具
- npm -g install grunt-cli
- grunt --version
7.编译apprtc(房间服务器)
首先使用git拉取apprtc源码
git clone https://github.com/webrtc/apprtc.git
进入到apprtc目录
cd apprtc
安装node依赖
npm install
完成后会生成一个node_modules的文件夹
再执行编译命令
grunt build
发现报错:
按照提示重新安装node依赖,顺便指定下python版本(看自己安装的python版本)
- rm -rf node_modules
- npm install --dev coffeescript --python=python2.7
再执行编译命令
grunt build
又出现报错:
- Running "shell:buildAppEnginePackage" (shell) task
- Traceback (most recent call last):
- File "./build/build_app_engine_package.py", line 12, in <module>
- import requests
- ImportError: No module named requests
- Warning: Command failed: python ./build/build_app_engine_package.py src out/app_engine
- Traceback (most recent call last):
- File "./build/build_app_engine_package.py", line 12, in <module>
- import requests
- ImportError: No module named requests
- Use --force to continue.
python安装requests模块
pip install requests
再执行编译命令
grunt build
顺利编译通过
- Running "shell:buildAppEnginePackage" (shell) task
-
- Running "shell:genJsEnums" (shell) task
- src >>> src/web_app/js
-
- Running "shell:copyAdapter" (shell) task
-
- Running "shell:copyJsFiles" (shell) task
-
- Done.
编译后会生成一个out目录,里面有app_engine文件夹
- [root@localhost apprtc]# ls
- build ISSUE_TEMPLATE.md node_modules package-lock.json requirements.txt
- CONTRIBUTING.md karma.conf.js out PULL_REQUEST_TEMPLATE.md src
- Gruntfile.js LICENSE.md package.json README.md tools
- [root@localhost apprtc]# cd out/
- [root@localhost out]# ls
- app_engine
8.配置服务器
进入到app_engine目录,编辑constants.py文件
vi constants.py
只要修改下面中文注释的地方,列出的并不是全部内容
ICE服务器端口设置为3478,信令服务器端口设置为8089
- # Turn/Stun server override. This allows AppRTC to connect to turn servers
- # directly rather than retrieving them from an ICE server provider.
- # 将原来的注释掉
- # ICE_SERVER_OVERRIDE = None
- # Enable by uncomment below and comment out above, then specify turn and stun
- # 将注释放开,并配置ICE服务器ip加端口
- ICE_SERVER_OVERRIDE = [
- {
- "urls": [
- "turn:192.168.43.3:3478?transport=udp",
- "turn:192.168.43.3:3478?transport=tcp"
- ],
- "username": "admin",
- "credential": "123456"
- },
- {
- "urls": [
- "stun:192.168.43.4:3478"
- ]
- }
- ]
-
- # 改成本机ip
- ICE_SERVER_BASE_URL = ''https://192.168.43.4''
- ICE_SERVER_URL_TEMPLATE = ''%s/v1alpha/iceconfig?key=%s''
- ICE_SERVER_API_KEY = os.environ.get(''ICE_SERVER_API_KEY'')
- HEADER_MESSAGE = os.environ.get(''HEADER_MESSAGE'')
-
- # Dictionary keys in the collider instance info constant.
- WSS_INSTANCE_HOST_KEY = ''192.168.43.4:8089''
- WSS_INSTANCE_NAME_KEY = ''vm_name''
- WSS_INSTANCE_ZONE_KEY = ''zone''
- # 配置信令服务器ip和端口
- WSS_INSTANCES = [{
- WSS_INSTANCE_HOST_KEY: ''192.168.43.4:8089'',
- WSS_INSTANCE_NAME_KEY: ''wsserver-std'',
- WSS_INSTANCE_ZONE_KEY: ''us-central1-a''
- }, {
- WSS_INSTANCE_HOST_KEY: ''192.168.43.4:8089'',
- WSS_INSTANCE_NAME_KEY: ''wsserver-std-2'',
- WSS_INSTANCE_ZONE_KEY: ''us-central1-f''
- }]
9.启动房间服务器
先安装 google_appengine
- #回到apprtc同级目录(我是直接在用户目录下)
- cd ~
- wget https://storage.googleapis.com/appengine-sdks/featured/google_appengine_1.9.40.zip
- unzip google_appengine_1.9.40.zip
运行房间服务器命令,ip是你服务器ip:
./google_appengine/dev_appserver.py --host 0.0.0.0 ./apprtc/out/app_engine
- INFO 2021-07-08 13:05:56,300 api_server.py:205] Starting API server at: http://localhost:40547
- INFO 2021-07-08 13:05:56,327 dispatcher.py:197] Starting module "default" running at: http://192.168.42.4:8080
- INFO 2021-07-08 13:05:56,332 admin_server.py:116] Starting admin server at: http://localhost:8000
说明房间服务器启动成功了
二.编译信令服务器
1.安装go语言(翻墙)
- wget https://storage.googleapis.com/golang/go1.5.1.linux-amd64.tar.gz
- tar -xvf ./go1.5.1.linux-amd64.tar.gz
- cd go/bin
设置go的环境变量
vi /etc/profile
追下如下内容
- export GOROOT=/root/go
- # 原有PATH 定义过了只需加上$GOROOT/bin:
- export PATH=$GOROOT/bin:/root/nodejs/node-v16.4.2-linux-x64/bin:$PATH
使环境变量生效
source /etc/profile
2.编译信令服务器,源码位于之前下载的apprtc/src/目录下
复制到用户目录下
- cp ./collider -r /root/
- cd /root/collider
- mkdir src
- mv co* src
3.配置信令服务器地址端口
vi /root/collider/src/collidermain/main.go
找到以下内容改成自己房间服务器的ip和端口(房间服务器默认8080端口)
var roomSrv = flag.String("room-server", "http://192.168.43.4:8080", "The origin of the room server")
4.编译信令服务器
- export GOPATH=/root/collider/
- go get collidermain
在collider目录下会生成bin文件夹
5.生成SSL证书(没有openssl,需要安装)
- mkdir -p /cert
- cd /cert
- openssl genrsa -out key.pem 2048
- openssl req -new -x509 -key key.pem -out cert.pem -days 1095
6.启动信令服务器
- cd /root/collider/bin
- ./collidermain -port=8089 -tls=true
2021/07/09 17:14:47 Starting collider: tls = true, port = 8089, room-server=http://192.168.42.4:8080
说明信令服务器启动完毕
三.安装ICE服务器
1.回到用户目录/root,拉取ICE服务器源码
- wget http://coturn.net/turnserver/v4.5.0.7/turnserver-4.5.0.7.tar.gz
- tar -xvf turnserver-4.5.0.7.tar.gz
- yum -y install openssl-devel libevent-devel
可以看下INSTALL文件,里面有ICE服务器的文档,其中有段内容如下,说明ICE服务器必须要openssl和libevent
- OpenSSL, SQLite, libevent2, PostgreSQL, MySQL (or MariaDB) and Hiredis
- libraries can be downloaded from their web sites:
- - http://www.openssl.org (required);
- - http://www.libevent.org (required);
- - http://www.sqlite.org (optional);
- - http://www.postgresql.org (optional);
- - http://www.mysql.org (or http://mariadb.org) (optional);
- - https://github.com/mongodb/mongo-c-driver (optional);
- - http://redis.io (optional).
2.编译ICE服务器
- ./configure
- make install
编译完成后,会生成bin目录
3.启动ICE服务器
- cd ./bin
- ./turnserver --syslog -a -f --min-port=32355 --max-port=65535 --user=admin:123456 -r admin --cer /cert/cert.pem --pkey /cert/key.pem --log-file=stdout -v
四.使用Nginx反向代理房间服务器
由于房间服务器默认为http,直接访问无法采集音视频,要使他支持https,需要反向代理,好在我们在之前已经安装过nginx服务器了(没安装的可以参考我之前的博客:Nginx流媒体服务器搭建)
1.重新编译nginx,这时候我们不需要rtmp模块了,而需要ssl模块
- cd /root/nginx/nginx-1.12.1
- ./configure --prefix=`pwd`/bin --with-http_stub_status_module --with-http_ssl_module
- make install
2.修改配置文件
- cd bin
- vi conf/nginx.conf
改成自己服务器的ip
- events {
- worker_connections 1024;
- }
- http{
- upstream roomserver {
- server 192.168.43.4:8080;
- }
- server {
- listen 80;
- server_name 192.168.43.4;
- return 301 https://$server_name$request_uri;
- }
- server {
- root /usr/share/nginx/html;
- index index.php index.html index.htm;
- listen 443 ssl;
- ssl_certificate /cert/cert.pem;
- ssl_certificate_key /cert/key.pem;
- server_name 192.168.43.4;
- location / {
- proxy_pass http://roomserver$request_uri;
- proxy_set_header Host $host;
- }
- location ~ .php$ {
- fastcgi_pass unix:/var/run/php5-fpm.sock;
- fastcgi_index index.php;
- include fastcgi_params;
- }
- }
- }
3.启动nginx
- cd sbin
- .nginx -s stop
- .nginx
五.配置防火墙端口
由于用的模拟器,我是直接把防火墙关了
systemctl stop firewalld.service
最后放下打开各个服务器的方法
1.房间服务器
./google_appengine/dev_appserver.py --host 0.0.0.0 ./apprtc/out/app_engine
2.信令服务器
./collidermain -port=8089 -tls=true
3.ICE服务器
./turnserver --syslog -a -f --min-port=32355 --max-port=65535 --user=admin:123456 -r admin --cer /cert/cert.pem --pkey /cert/key.pem --log-file=stdout -v
4.Nginx服务器
./nginx
使用chrome浏览器打开房间服务器
使用另一个设备进入同一个房间(我是用的手机上的浏览器)
效果如下: