百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

WebRTC 云服务器搭建 AppRTC 环境

ztj100 2024-12-11 18:22 9 浏览 0 评论


apprtc 服务器搭建,搭建的主要目的是为了学习 Android 、Web 等各端基于 webrtc 音视频通信。

搭建得出了几点结论:

1、非 https 协议在 chrome 浏览器不支持打开音视频设备。

2、如果想要使各端都能通信,那么必须所有请求访问都使用 https 协议,证书可以在购买服务器平台上免费申请。

以下是最终效果图(手机跟 Web 互通需要所有 http 更换为 https 协议,该篇最终结果还未达到各端互通的条件,后续会更新补上)

搭建环境

  • 服务器: 腾讯云
  • 系统: centos

app2app

web2web

介绍

领取音视频开发资料包音视频流媒体高级开发FFmpegWebRTCRTMPRTSPHLSRTP播放器

搭建 apprtc 需要用到以下几个服务。

apprtc AppRTC 是用来创建和管理通话状态的房间服务器。

coturn coturn 是一种 TURN 内网穿透服务器(也就是中转服务器),该服务器用于 VOIP 或通用数据流的 NAT 穿越和数据转发。

collider

collider 它是用 go 语言实现的基于 WebSocket 的信令服务器。 为了建立一个 webrtc 的通信过程,一般是需要有如下通信信息: 1、会话控制信息,用来开始和结束通话,即开始视频、结束视频这些操作指令。 2、发生错误时用来相互通告的消息 3、元数据,如各自的音视频解码方式、带宽。 4、网络数据,对方的公网 IP、端口、内网 IP 及端口。

搭建 AppRTC 服务的基本步骤

1、搭建 AppRTC 房间服务器

2、搭建 Coturn 穿透服务器

3、搭建 Collider 信令服务器

4、搭建 ICE 信息服务器

如何搭建 AppRTC

1、install JDK

yum install java-1.8.0-openjdk

#查看 Java 版本
java -version

2、install node.js

curl -sL https://rpm.nodesource.com/setup_10.x | bash -
yum install -y nodejs
# 确认是否成功
node --version
npm --version

# 构建 apprtc 用到
npm -g install grunt-cli
grunt --version

3、安装Python和Python-webtest (python2.7)

yum -y install epel-release
yum install python python-webtest python-pip
pip install --upgrade pip

4、安装google_appengine

wget https://storage.googleapis.com/appengine-sdks/featured/google_appengine_1.9.40.zip
unzip google_appengine_1.9.40.zip

#配置环境变量:在/etc/profile文件最后增加一行:
vim /etc/profile
#添加如下代码
export google_appengine_path=/root/webrtc/google_appengine
export PATH=$PATH:$google_appengine_path

#最后保存,使之生效
source /etc/profile

5、安装 go

yum install golang
#查看是否安装成功
go version 

#创建go工作目录
mkdir -p /root/webrtc/goWorkspace/src
#配置环境变量:在 vim /etc/profile 文件最后增加一行:
export GOPATH=/root/webrtc/goWorkspace
#保存
source /etc/profile

6、安装libevent

#当前目录:root/webrtc/
#https://github.com/coturn/coturn/wiki/CoturnConfig
wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
tar xvf libevent-2.0.21-stable.tar.gz
cd libevent-2.0.21-stable
./configure
make install

7、安装 AppRTC

#当前目录:root/webrtc/
git clone https://github.com/webrtc/apprtc.git
#将collider的源码软连接到go的工作目录下
ln -s /root/webrtc/apprtc/src/collider/collider $GOPATH/src
ln -s /root/webrtc/apprtc/src/collider/collidermain $GOPATH/src
ln -s /root/webrtc/apprtc/src/collider/collidertest $GOPATH/src
#编译collidermain
go get collidermain
go install collidermain

#go get collidermain: 被墙
#报错: package golang.org/x/net/websocket: unrecognized import path "golang.org/x/net/websocket"
#执行: 
#mkdir -p $GOPATH/src/golang.org/x/
#cd $GOPATH/src/golang.org/x/
#git clone https://github.com/golang/net.git net 
#go install net

#再执行编译collidermain
#修改房间服务器为我们前面的房间服务器:
vim $GOPATH/src/collidermain/main.go
var roomSrv = flag.String(“room-server”, “https://49.235.159.44:8080”, “The origin of the room server”)

vim $GOPATH/src/collider/collider.go
#修改放入自己私有证书,目前这里放入腾讯云申请的 证书测试 app -> pc 通不了,固还是用自签名
e = server.ListenAndServeTLS(“/root/key/chat.codecocoa.com.pem”,   “/root/key/chat.codecocoa.com.key”)

go get collidermain
go install collidermain

8、安装coturn

#目录:root/webrtc/
#https://github.com/coturn/coturn/wiki/Downloads
wget http://coturn.net/turnserver/v4.5.0.7/turnserver-4.5.0.7.tar.gz
tar xvfz turnserver-4.5.0.7.tar.gz
cd turnserver-4.5.0.7
#如果没有 openssl-devel 需要安装
yum install openssl-devel
./configure --prefix=./bin
make install

9、配置并运行 coturn Nat 穿透服务器

#内网:172.17.0.11 :DevYk:用户 12345 密码 & ctr+c 不会停止
nohup turnserver -L 172.17.0.11 -a -u DevYK:12345 -v -f -r nort.gov &
#或者 作者用的该方案
nohup turnserver -L 172.17.0.11 -a -u DevYK:12345 -v -f -r www.devyk.cn & 
#netstat -ntulp 查看 5766,3478 端口是否启动

10、collider 信令服务器

配置防火墙,允许访问8089端口(tcp,用于客户端和collider建立websocket信令通信)

#创建自签名的数字证书
#如果没有openssl,需要安装
mkdir -p /cert
cd /cert
# CA私钥
openssl genrsa -out key.pem 2048 
# 自签名证书
openssl req -new -x509 -key key.pem -out cert.pem -days 1095

#app 与 app 通信由于 ssl 问题需要将 tls =false
nohup $GOPATH/bin/collidermain -port=8089 -tls=true -room-server="https://49.235.159.44:8080" > /root/webrtc/collidermain.log 2>&1 &

#检查 8089 端口是否启动
netstat -ntulp

11. apprtc 房间服务器

配置防火墙,允许访问8080端口(tcp,此端口用于web访问)

配置文件修改(主要是配置apprtc对应的conturn和collider相关参数)

#49.235.159.44 外网ip
vim /root/webrtc/apprtc/src/app_engine/constants.py
#ICE_SERVER_OVERRIDE = None
# Enable by uncomment below and comment out above, then specify turn and stun
ICE_SERVER_OVERRIDE  = [
   {
     "urls": [
       "turn:49.235.159.44:3478?transport=udp",
       "turn:49.235.159.44:3478?transport=tcp"
     ],
     "username": "DevYK",
     "credential": "12345"
   },
   {
     "urls": [
       "stun:49.235.159.44:8089"
     ]
   }
 ]
#ICE_SERVER_OVERRIDE = None

#pc 必须使用 https
#ICE_SERVER_BASE_URL = 'https://49.235.159.44'
#在 APP 上因为没有 SSL 证书,那么只能用 http
ICE_SERVER_BASE_URL = 'http://49.235.159.44:8088'
ICE_SERVER_URL_TEMPLATE = '%s/v1alpha/iceconfig?key=%s'
ICE_SERVER_API_KEY = os.environ.get('ICE_SERVER_API_KEY')

# Dictionary keys in the collider instance info constant.
WSS_INSTANCE_HOST_KEY = '49.235.159.44:8089'
WSS_INSTANCE_NAME_KEY = 'vm_name'
WSS_INSTANCE_ZONE_KEY = 'zone'
WSS_INSTANCES = [{
    WSS_INSTANCE_HOST_KEY: '49.235.159.44:8089',
    WSS_INSTANCE_NAME_KEY: 'wsserver-std',
    WSS_INSTANCE_ZONE_KEY: 'us-central1-a'
}
#,{
#    WSS_INSTANCE_HOST_KEY: '49.235.159.44:8089',
#    WSS_INSTANCE_NAME_KEY: 'wsserver-std-2',
#    WSS_INSTANCE_ZONE_KEY: 'us-central1-f'
#}
]
#编译
cd /root/webrtc/apprtc
npm install
grunt build

#如果出现下面错误,使用 cnpm 编译
/root/webrtc/apprtc/node_modules/mkdirp/lib/opts-arg.js 
...

#npm 安装出现问题 使用 cnpm 安装
npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm install
grunt build

启动:

#172.31.247.136 : 内网ip
nohup dev_appserver.py --host=172.17.0.11 --port 8080 /root/webrtc/apprtc/out/app_engine --skip_sdk_update_check > /root/webrtc/apprtc.log 2>&1 &

#
检查 8080 Python 是否起来
netstat -ntulp

12、 配置 ICE Service

mkdir /root/webrtc/iceService

vim ice.js

var http = require('http');
var crypto = require('crypto')
var hmac = function(key, content) {
  var method = crypto.createHmac('sha1', key)
  method.setEncoding('base64')
  method.write(content)
  method.end()
  return method.read()
}
http.createServer(function(request, response) {
  //账户
  var timestamp = Math.floor(Date.now() / 1000)
  var turn_username = timestamp + ':DevYK'
  //密码
  var key = '12345'
  var password = hmac(key, turn_username)
  // 发送 HTTP 头部 
  // HTTP 状态值: 200 : OK
  // 内容类型: text/plain
  response.writeHead(200, {'Content-Type': 'text/plain'});
  console.log(turn_username);
  console.log(password);
  // 发送响应数据 "ice服务器"
  response.end('{"iceServers":[{"username":"'+turn_username+'","credential":"'+password+'","urls":["stun:49.235.159.44:3478","turn:49.235.159.44:3478"]}]}\n');
  }).listen(8088);
  // 终端打印如下信息
  console.log('ICE Server running');

启动 ICE REST API 服务

nohup node ice.js &

#检查 8088 服务是否启动
netstat -ntulp

13、nginx 设置反向代理

nginx 已存在进行配置

11.1 配置反向代理

events {
        worker_connections 1024;
  }
  http{
   #apprtc 服务
        upstream roomserver {
        server 49.235.159.44:8080;
        }
        server {
                listen 80;
                server_name 49.235.159.44;
                return  301 https://$server_name$request_uri;
        }
        server {
                root /root/webrtc/nginx-1.17.8/html;
                index index.php index.html index.htm;
                listen      443 ssl;
                #腾讯云证书
                #ssl_certificate /root/ssl/1_www.devyk.cn_bundle.crt;
                #ssl_certificate_key /root/ssl/2_www.devyk.cn.key;
                #ssl_session_timeout 5m;
                 #请按照以下协议配置
                #ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
                #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
                #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
                #ssl_prefer_server_ciphers on;
                #自签名
                ssl_certificate /cert/cert.pem;
                ssl_certificate_key /cert/key.pem;
                server_name 49.235.159.44;
                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;
                }
        }
}

11.1.1已安装但是没有配置 ssl

#开启 nginx 服务 error
nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in 
/bin/conf/nginx.conf

解决:

#切换到源码包:
cd /nginx/nginx-1.17.9

#查看nginx原有的模块
/bin/sbin/nginx -V
#在configure arguments:后面显示的原有的configure参数如下:
--prefix=./bin

重新编译, 加入 --with-http_ssl_module

./configure --prefix=./bin  --with-http_ssl_module

#编译
make

ps: 这里千万别 make install 覆盖安装,因为之前还有 nginx 配置。

将之前的 nginx rm 替换为 objs/nginx

#在 nginx/1.17 模块下
rm -rf bin/sbin/nginx

cp objs/nginx bin/sbin/

最后重启服务

#启动
bin/sbin/nginx
#重启
bin/sbin/nginx -s reload

nginx 未安装配置

11.2 下载 nginx

wget http://nginx.org/download/nginx-1.17.9.tar.gz
tar -zxvf nginx-1.17.9.tar.gz

11.2.1编译 nginx

./configure --prefix=./bin --with-http_ssl_module
make install

11.2.2 配置 nginx.conf

vim /root/webrtc/nginx-1.17.8/bin/conf/nginx.conf
#apprtc 服务
  events {
    worker_connections 1024;
  }
  http{
        upstream roomserver {
        server 49.235.159.44:8080;
        }
        server {
                listen 80;
                server_name www.devyk.cn;
                return  301 https://$server_name$request_uri;
        }
        server {
                root /root/nginx/nginx-1.17.8/html;
                index index.php index.html index.htm;
                listen      443 ssl;
                #腾讯云证书
                #ssl_certificate /root/nginx/nginx-1.17.8-http-rtmp/ssl/rtc.crt;
                #ssl_certificate_key /root/nginx/nginx-1.17.8-http-rtmp/ssl/rtc.key;
                #自签名证书
                ssl_certificate /cert/cert.pem;
                ssl_certificate_key /cert/key.pem;
                server_name 49.235.159.44;
                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;
                }
        }
        }

11.2.3 启动 nginx

#启动
bin/sbin/nginx
#重启
bin/sbin/nginx -s reload

搭建中遇见的问题

  • 浏览器通话跨域问题 :pushState
vim /root/webrtc/apprtc/out/app_engine/js/apprtc.debug.js
#全局搜索 pushState 增加:
roomLink=roomLink.substring("http","https");

Websocket open error:

Messages:  
WebSocket open error: WebSocket error.
WebSocket register error: WebSocket error.

PC 上如果遇见这个问题,一般需要检查 apprtc 、 constants.py 、签名的配置信息。

  • 自签名证书只能在浏览器上使用,不能用于浏览器与 Android 等端进行通信。
  • 相关推荐

    干货 | 各大船公司VGM提交流程(msc船运公司提单查询)

    VGM(VerifiedGrossMass)要来了,大外总管一本正经来给大家分享下各大船公司提交VGM流程。1,赫伯罗特(简称HPL)首先要注册账户第一,登录进入—选择product------...

    如何修改图片详细信息?分享三个简单方法

    如何修改图片详细信息?分享三个简单方法我们知道图片的详细信息里面包含了很多属性,有图片的创建时间,修改时间,地理位置,拍摄时间,还有图片的描述等信息。有时候为了一些特殊场景的需要我们需要对这些信息进行...

    实用方法分享:没有图像处理软件,怎么将一张照片做成九宫格?

    在发朋友圈时,如果把自己的照片做成九宫格,是不是更显得高大上?可能你问,是不是要借助图片处理软件,在这里,我肯定告诉你,不需要!!!你可能要问,那怎么实现呢?下面你看我是怎么做的,一句代码都不写,只是...

    扫描档PDF也能变身“最强大脑”?RAG技术解锁尘封的知识宝藏!

    尊敬的诸位!我是一名物联网工程师。关注我,持续分享最新物联网与AI资讯和开发实战。期望与您携手探寻物联网与AI的无尽可能。今天有网友问我扫描档的PDF文件能否做知识库,其实和普通pdf处理起来差异...

    这两个Python库,轻而易举就能实现MP4与GIF格式互转,太好用了

    mp4转gif的原理其实很简单,就是将mp4文件的帧读出来,然后合并成一张gif图。用cv2和PIL这两个库就可以轻松搞定。importglobimportcv2fromPILimpo...

    python图片处理之图片切割(python把图片切割成固定大小的子图)

    python图片切割在很多项目中都会用到,比如验证码的识别、目标检测、定点切割等,本文给大家带来python的两种切割方式:fromPILimportImage"""...

    python+selenium+pytesseract识别图片验证码

    一、selenium截取验证码#私信小编01即可获取大量Python学习资源#私信小编01即可获取大量Python学习资源#私信小编01即可获取大量Python学习资源importjso...

    如何使用python裁剪图片?(python图片截取)

    如何使用python裁剪图片如上图所示,这是一张包含了各类象棋棋子的图片。我们需要将其中每一个棋子都裁剪出来,此时可以利用python的...

    Python rembg 库去除图片背景(python 删除图片)

    rembg是一个强大的Python库,用于自动去除图片背景。它基于深度学习模型(如U^2-Net),能够高效地将前景物体从背景中分离,生成透明背景的PNG图像。本教程将带你从安装到实际应用...

    「python脚本」批量修改图片尺寸&视频安帧提取

    【python脚本】批量修改图片尺寸#-*-coding:utf-8-*-"""CreatedonThuAug2316:06:352018@autho...

    有趣的EXCEL&vba作图(vba画图表)

    还记不记得之前有个日本老爷爷用EXCEL绘图,美轮美奂,可谓是心思巧妙。我是没有那样的艺术细胞,不过咱有自己的方式,用代码作图通过vba代码将指定的图片写入excel工作表中,可不是插入图片哦解题思...

    怎么做到的?用python制作九宫格图片,太棒了

    1.应用场景当初的想法是:想把一张图切割成九等份,发布到微信朋友圈,切割出来的图片,上传到朋友圈,发现微信不按照我排列的序号来排版。这样的结果是很耗时间的。让我深思,能不能有一种,直接拼接成一张...

    Python-连续图片合成视频(python多张图叠加为一张)

    前言很多时候,我们需要将图片直接转成视频。下面介绍用python中的OpenCV将进行多张图合成视频。cv2安装不要直接用pipinstallcv2,这会报错。有很多人建议用打开window自带的...

    如何把多个文件夹里的图片提取出来?文件夹整理合并工具

    在项目管理中,团队成员可能会将项目相关的图片资料分散存储在不同的文件夹中,以便于分类和阶段性管理。然而,当项目进入汇报或总结阶段时,需要将所有相关图片整合到一个位置,以便于制作演示文稿、报告或进行项目...

    超简单!为图片和 PDF 上去掉水印(pdf图片和水印是一体,怎么去除)

    作者:某某白米饭...

    取消回复欢迎 发表评论: