前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WebRTC--从编译到部署,打造点对点音视频通话服务器

WebRTC--从编译到部署,打造点对点音视频通话服务器

作者头像
aruba
发布2021-07-16 11:49:51
2.6K0
发布2021-07-16 11:49:51
举报
文章被收录于专栏:android技术
简单介绍

WebRTC实现了基于网页的视频会议,是一个支持网页浏览器进行实时语音对话或视频对话的API(来自百度),由google开发,并于2011年6月3日开源。

和直播推流不同,这是点对点通讯,服务器只是帮助建立连接,以满足视频通话的低延迟要求

分为三个服务器:

1.房间服务器:创建房间,让用户可以在一个房间内通讯

2.信令服务器:用于用户交换信令,建立连接,类似TCP握手

3.ICE服务器(内网穿透服务器):用于穿透内网IP,实现外网连接

本文基于CentOS7系统

一.安装部署房间服务器

1.安装unzip,解压zip文件时使用

代码语言:javascript
复制
yum install -y unzip

2.安装git,用于获取WebRTC源码

代码语言:javascript
复制
yum install -y git

3.安装编译需要的一些工具

代码语言:javascript
复制
yum install -y automake autoconf libtool

python 和 python-webtest

代码语言:javascript
复制
yum -y install epel-release
yum install python python-webtest python-pip

4.安装nodejs(需要最新的版本,从https://nodejs.org/dist查看下最新的版本),房间服务器需要使用nodejs编译

代码语言:javascript
复制
wget https://nodejs.org/dist/v16.4.2/node-v16.4.2-linux-x64.tar.gz

下载完成后解压

代码语言:javascript
复制
mkdir nodejs
tar -xvf node-v16.4.2-linux-x64.tar.gz -C ./nodejs/

将上面的地址配置到环境变量中

代码语言:javascript
复制
vi /etc/profile 

将下面内容追加到文件最后

代码语言:javascript
复制
export PATH=/root/nodejs/node-v16.4.2-linux-x64/bin:$PATH

执行命令,使环境变量生效,如果可以执行npm命令,说明配置成功了

代码语言:javascript
复制
source /etc/profile

6.安装编译工具

代码语言:javascript
复制
npm -g install grunt-cli
grunt --version

7.编译apprtc(房间服务器)

首先使用git拉取apprtc源码

代码语言:javascript
复制
git clone https://github.com/webrtc/apprtc.git

进入到apprtc目录

代码语言:javascript
复制
cd apprtc

安装node依赖

代码语言:javascript
复制
npm install

完成后会生成一个node_modules的文件夹

再执行编译命令

代码语言:javascript
复制
grunt build

发现报错:

按照提示重新安装node依赖,顺便指定下python版本(看自己安装的python版本)

代码语言:javascript
复制
rm -rf node_modules
npm install --dev coffeescript --python=python2.7

再执行编译命令

代码语言:javascript
复制
grunt build

又出现报错:

代码语言:javascript
复制
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模块

代码语言:javascript
复制
pip install requests

再执行编译命令

代码语言:javascript
复制
grunt build

顺利编译通过

代码语言:javascript
复制
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文件夹

代码语言:javascript
复制
[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文件

代码语言:javascript
复制
vi constants.py

只要修改下面中文注释的地方,列出的并不是全部内容

ICE服务器端口设置为3478,信令服务器端口设置为8089

代码语言:javascript
复制
# 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

代码语言:javascript
复制
#回到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:

代码语言:javascript
复制
./google_appengine/dev_appserver.py --host 0.0.0.0  ./apprtc/out/app_engine
代码语言:javascript
复制
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语言(翻墙)

代码语言:javascript
复制
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的环境变量

代码语言:javascript
复制
vi /etc/profile

追下如下内容

代码语言:javascript
复制
export GOROOT=/root/go
# 原有PATH 定义过了只需加上$GOROOT/bin:
export PATH=$GOROOT/bin:/root/nodejs/node-v16.4.2-linux-x64/bin:$PATH

使环境变量生效

代码语言:javascript
复制
source /etc/profile

2.编译信令服务器,源码位于之前下载的apprtc/src/目录下

复制到用户目录下

代码语言:javascript
复制
cp ./collider -r /root/
cd /root/collider
mkdir src
mv co* src

3.配置信令服务器地址端口

代码语言:javascript
复制
vi /root/collider/src/collidermain/main.go

找到以下内容改成自己房间服务器的ip和端口(房间服务器默认8080端口)

代码语言:javascript
复制
var roomSrv = flag.String("room-server", "http://192.168.43.4:8080", "The origin of the room server")

4.编译信令服务器

代码语言:javascript
复制
export GOPATH=/root/collider/
go get collidermain

在collider目录下会生成bin文件夹

5.生成SSL证书(没有openssl,需要安装)

代码语言:javascript
复制
mkdir -p /cert
cd /cert
openssl genrsa -out key.pem 2048 
openssl req -new -x509 -key key.pem -out cert.pem -days 1095

6.启动信令服务器

代码语言:javascript
复制
cd /root/collider/bin
./collidermain -port=8089 -tls=true
代码语言:javascript
复制
2021/07/09 17:14:47 Starting collider: tls = true, port = 8089, room-server=http://192.168.42.4:8080

说明信令服务器启动完毕

三.安装ICE服务器

1.回到用户目录/root,拉取ICE服务器源码

代码语言:javascript
复制
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

代码语言:javascript
复制
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服务器

代码语言:javascript
复制
./configure
make install

编译完成后,会生成bin目录

3.启动ICE服务器

代码语言:javascript
复制
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模块

代码语言:javascript
复制
cd /root/nginx/nginx-1.12.1
./configure --prefix=`pwd`/bin --with-http_stub_status_module --with-http_ssl_module
make install

2.修改配置文件

代码语言:javascript
复制
cd bin
vi conf/nginx.conf

改成自己服务器的ip

代码语言:javascript
复制
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

代码语言:javascript
复制
cd sbin
.nginx -s stop
.nginx
五.配置防火墙端口

由于用的模拟器,我是直接把防火墙关了

代码语言:javascript
复制
systemctl stop firewalld.service

最后放下打开各个服务器的方法

1.房间服务器

代码语言:javascript
复制
./google_appengine/dev_appserver.py --host 0.0.0.0  ./apprtc/out/app_engine

2.信令服务器

代码语言:javascript
复制
./collidermain -port=8089 -tls=true

3.ICE服务器

代码语言:javascript
复制
./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服务器

代码语言:javascript
复制
./nginx

使用chrome浏览器打开房间服务器

使用另一个设备进入同一个房间(我是用的手机上的浏览器)

效果如下:

视频通话.gif

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简单介绍
  • 一.安装部署房间服务器
  • 二.编译信令服务器
  • 三.安装ICE服务器
  • 四.使用Nginx反向代理房间服务器
  • 五.配置防火墙端口
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档