WebRTC编译以及服务端环境配置
鸣谢:
https://blog.csdn.net/xiaoS/article/details/89474037官方文档: https://webrtc.org/native-code/android/
本地环境:ubuntu 16.04 虚拟机,服务器为局域网ubuntu机器,目前浏览器端还存在问题
一、编译环境
1. 搭建上网环境
- a. 采用ss方式进行,由于还需要http的代理,这里直接使用electron-ssr-0.2.6.AppImage进行配置;
- b. 配置ss之后,配置http和git的代理:
# git直接用socks5代理使用,这里默认为1080端口
git config --global http.proxy 'socks5://127.0.0.1:1080'
git config --global https.proxy 'socks5://127.0.0.1:1080'
# git取消代理
git config --global --unset http.proxy
git config --global --unset https.proxy
# http的代理需要用http代理,这里默认为12333端口。export只在当前shell环境下生效
export https_proxy=127.0.0.1:12333
export http_proxy=127.0.0.1:12333
- c. 此时可以用curl或者git进行测试是否可以使用
命令行方式:
- 安装sslocal进行socks5代理: sudo apt-get install ss-local
- 安装privoxy进行http代理: sudo apt-get install privoxy
- 配置sslocal,根据自己代理配置填写服务器ip、端口、密码和加密方式
sslocal -s serverIp -p serverPort -l 1080 -k 'password' -m aes-256-cfb- 修改privoxy配置文件
/etc/privoxy/config, 其中listen-address为监听地址和端口,然后把forward-socks5t注释去掉,转发http请求到ip和端口- 启动privoxy
sudo service privoxy start
2. 下载depot_tools
- google的代码管理工具下载
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
# 下载之后需要加入path,这里直接加入profile中
vim ~/.profile
# 需要替换为实际路径
export PATH=$PATH:/home/linux/code/depot_tools
3. 下载webRTC源码
mkdir webrtc
cd webrtc
fetch --nohooks webrtc_android
# 之后会自动下载代码,如果有中断,可以用gclient sync进行同步代码继续下载
4. 编译源码
- a. 下载编译依赖包
./build/install-build-deps-android.sh #针对android项目,其他项目选择对应文件编译
./build/install-build-deps.sh
- b. 生成编译配置
gn gen out/Debug --args='target_os="android" target_cpu="arm" isDebug=false'
- c. 编译代码
# 编译android测试demo
ninja -C out/Debug AppRTCMobile
- d. 生成android studio使用的项目
# 项目地址位于 out/Debug/gradle
build/android/gradle/generate_gradle.py --output-directory $PWD/out/Debug \
--target "//examples:AppRTCMobile" --use-gradle-process-resources \
--split-projects --canary
二、服务端环境搭建
1. 环境安装
# 下载相关代码
wget https://cloud.google.com/appengine/downloads?csw=1
git clone https://github.com/webrtc/apprtc.git
git clone https://github.com/coturn/coturn.git
# 安装go运行环境
sudo apt-get install golang
mkdir GoProject
cd GoProject
mkdir src
mkdir bin
export GOPATH=/home/ubuntu/Project/webrtc/GoProject
# 注意使用全路径
ln -s /home/ubuntu/Project/webrtc/apprtc/src/collider/collider $GOPATH/src
ln -s /home/ubuntu/Project/webrtc/apprtc/src/collider/collidermain $GOPATH/src
ln -s /home/ubuntu/Project/webrtc/apprtc/src/collider/collidertest $GOPATH/src
2. 服务端环境配置
a. 信令服务器搭建
// 编辑$GOPATH/collidermain/main.go,修改房间服务器为我们前面的房间服务器:
//var roomSrv = flag.String("room-server", "https://appr.tc", "The origin of the room server")
var roomSrv = flag.String("room-server", "http://10.18.31.123:8080", "The origin of the room server")
# 安装信令服务器依赖和collidermain
go get collidermain
go install collidermain
# 启动collider信令服务器
/home/ubuntu/Project/webrtc/GoProject/bin/collidermain -port=8089 -tls=false
b. coturn服务搭建
1. 编译
cd coturn
# coturn服务器编译三连
# 会依赖libevent库,sudo apt-get install libevent-dev
./configure
make
sudo make install
2. 配置 /usr/local/etc/turnserver.conf
listening-port=3478
#本地用于转发的网卡设备,这里根据自己的实际情况填写
relay-device=eth0
#指定的转发端口的分配范围,测试时,可以将防火墙全部关闭,防止 UDP 端口被屏蔽
min-port=3480
max-port=3500
#日志输出级别,turnserver 启动时加上 -v,可以得到更清晰的日志输出
Verbose
#消息验证,WebRTC 的消息里会用到
fingerprint
#webrtc 通过 turn 中继,必须使用长验证方式
lt-cred-mech
# ICE REST API 认证需要(如果打开了这行,turn就不工作了)
use-auth-secret
# REST API 加密所需的 KEY
# 这里我们使用“静态”的 KEY,Google 自己也用的这个
static-auth-secret=4080218913
#用户登录域,下面的写法可以不改变它,因为再启动 turnserver 时,可以通过指定参数覆盖它
realm=10.18.31.123 #这个特别关键,如果这里不是你的服务器的IP,数据就不通
#可为 TURN 服务提供更安全的访问(这个我没用,不知道干啥的)
#stale-nonce
#在Coturn代码中的/etc/examples/目录下有秘钥文件,可以直接用
cert=/home/ubuntu/Project/webrtc/coturn/pem/1989159_www.bgylde.com.pem
pkey=/home/ubuntu/Project/webrtc/coturn/pem/1989159_www.bgylde.com.key
#屏蔽 loopback, multicast IP地址的 relay
no-loopback-peers
no-multicast-peers
#启用 Mobility ICE 支持(不懂)
mobility
#禁用本地 telnet cli 管理接口
no-cli
这里用的证书是自己购买的域名证书,也可以自己进行生成,注意匹配路径 sudo openssl req -x509 -newkey rsa:2048 -keyout /coturn/pem/turnserverpkey.pem -out /coturn/pem/turnservercert.pem -days 99999 -nodes
c. 部署与启动room服务
# 解压google的web引擎
unzip google_appengine.tar
# 最好注入到~/.bashrc中
export PATH=$PATH:/google_appengine/
# 安装nodejs,可以直接安装
sudo apt-get install nodejs
# 如果有版本问题的话可以自己下载安装,解压后添加到PATH中
wget https://nodejs.org/dist/v9.5.0/node-v9.5.0-linux-x64.tar.gz
# 安装grunt
sudo apt-get install npm
sudo npm -g install grunt-cli
# 打开 apprtc/src/app_engine/constants.py 修改以下内容。配置是为了动态获取 stun/turn 服务器的密码,所以其IP地址与端口号应该与下面的 ICE REST API 服务中的一样,即端口号为 3033。
#ICE_SERVER_BASE_URL = 'http://10.18.31.123:3033'
ICE_SERVER_BASE_URL = 'http://www.bgylde.com:3033'
ICE_SERVER_URL_TEMPLATE = '%s/iceconfig?key=%s'
ICE_SERVER_API_KEY = os.environ.get('ICE_SERVER_API_KEY')
# 这个配置是为了使房间服务器与信令服务器 collider 进行通讯,所以配置的 IP 和 端口要与上面设置collider时的一样。
# Dictionary keys in the collider instance info constant.
WSS_INSTANCE_HOST_KEY = 'host_port_pair'
WSS_INSTANCE_NAME_KEY = 'vm_name'
WSS_INSTANCE_ZONE_KEY = 'zone'
WSS_INSTANCES = [{
WSS_INSTANCE_HOST_KEY: '10.18.31.123:8089',
WSS_INSTANCE_NAME_KEY: 'wsserver-std',
WSS_INSTANCE_ZONE_KEY: 'us-central1-a'
}]
# 修改apprtc.py,直接使用ws和http
if wss_tls and wss_tls == 'false':
wss_url = 'ws://' + wss_host_port_pair + '/ws'
wss_post_url = 'http://' + wss_host_port_pair
else:
wss_url = 'ws://' + wss_host_port_pair + '/ws'
wss_post_url = 'http://' + wss_host_port_pair
# 编译apprtc
sudo npm install # 安装 apprtc 中需要的 nodejs 依赖包,其存放在 package.json 文件中
sudo grunt build
# 编译失败的话
sudo ln -s /usr/bin/nodejs /usr/bin/node
# 会要求使用requests库
sudo apt-get install python-pip
sudo pip install requests
# 启动服务器,使用localhost:8080
dev_appserver.py /apprtc/out/app_engine
d. 配置 ICE REST API 服务
客户端连接 Room Server apprtc 后,通过 Room Server 得到用于获取 ICE Server 信息的 iceServerRequestUrl,然后浏览器和 AppRTC Demo 通过请求此 URL,得到 ICE Server 相关信息(返回 json)
首先安装 Express,Express 是一种保持最低程度规模的灵活 Node.js Web 应用程序框架,为 Web 和移动应用程序提供一组强大的功能。
# 全局安装,避免本地安装没有package.json
npm install express -gd
生成 index.js 代码文件,配置 REST API
mkdir iceserver
cd iceserver
vim index.js
index.js 文件,内容如下:
var express = require('express')
var crypto = require('crypto')
var app = express()
var hmac = function (key, content) {
var method = crypto.createHmac('sha1', key)
method.setEncoding('base64')
method.write(content)
method.end()
return method.read()
}
// 这里需要使用post方法,因为demo默认使用post方法,get会404
app.post('/iceconfig', function (req, resp) {
var query = req.query
var key = '4080218913'
var time_to_live = 600
var timestamp = Math.floor(Date.now() / 1000) + time_to_live
var turn_username = timestamp + ':gobert'
var password = hmac(key, turn_username)
resp.setHeader("Access-Control-Allow-Origin", "*"); //设置跨域访问
return resp.send({
iceServers: [
{
urls: [
'turn:10.18.31.123:3478?transport=udp',
'turn:10.18.31.123:3478?transport=tcp',
'turn:10.18.31.123:3479?transport=udp',
'turn:10.18.31.123:3479?transport=tcp'
],
username: turn_username,
credential: password
}
]
})
})
app.listen('3033', function () {
console.log('server started')
})
最后通过 node 启动脚本,即可访问:
node index.js
最终启动了四个服务,分别是:
# 可能还需要dnsmasq
collidermain -port=8089 -tls=false
turnserver -v /usr/local/etc/turnserver.conf
dev_appserver.py out/app_engine/
node index.js
3. nginx配置使用https
这里是自己申请的www.bgyde.com的证书,支持https。内网的话可以使用dnsmasq设置局域网dns服务器,在手机端设置dns将域名www.bgylde.com指向10.18.31.123可以直接进行访问。
server {
listen 443;
server_name www.bgylde.com;
ssl on;
ssl_certificate /etc/nginx/bgylde-ssl/1989159_www.bgylde.com.pem;
ssl_certificate_key /etc/nginx/bgylde-ssl/1989159_www.bgylde.com.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://localhost:8080;
}
}
4. 最终效果
这里在android端的demo设置room server url为:https://www.bgylde.com



5万+

被折叠的 条评论
为什么被折叠?



