WebRTC之服务器搭建

news2024/12/23 15:44:58

前言

在前面的WebRTC介绍中我们已经介绍了WebRTC的编译以及成功地把WebRTC在Android Studio中运行了起来,详情请猛击<WebRTC之Android编译> 《WebRTC导入Android Studio》

在后面的学习过程中,我们将进一步使用WebRTC实现Android端的实时通信对话。为了方便后续的开发和测试,今天我们来搭建WebRTC的服务器环境。

安装环境

笔者使用的云服务器是Ubuntu 16.04。

注意尽量使用与笔者相同版本的系统,不然可能因为安装的各种环境版本不同而导致搭建失败
需要在云服务器后台开放(出入规则)端口: 3478、8080、8089、80、443
本服务器的搭建教程主要来源于WebRTC的开源项目apprtc:github.com/webrtc/appr…

1、安装JDK
 

#如果是全新的系统则需要更新一下apt
apt-get update 
apt-get upgrade
# 安装JDK8
apt-get install openjdk-8-jdk 
# 检测下java是否安装成功,如果成功输出版本号则安装成功
java -version

2、安装node.js

apt install nodejs-legacy

# 查看一下版本 v4.2.6
node --version

apt-get install npm 
# 查看一下版本 3.5.2
npm --version

# 安装gnurt,尽量带上版本号,不然可能报node版本太低的错
 npm -g install grunt-cli@1.3.2
# 查看下版本  grunt-cli v1.3.2
grunt --version

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

apt-get install python 
apt-get install python-webtest

python -V
#Python 2.7.12

4、安装go

apt install golang-go

# 查看版本 go version go1.6.2 linux/amd64
go version 

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

在使用vi命令行的时候可能会遇到方向键乱位的问题,由于ubuntu 预安装的是tiny版本,所以会导致我们在使用时候产生上述不便,但是我们安装vim的full版本后,键盘所在键在vi下就很正常了。 解决方法:卸载tiny 版本 sudo apt-get remove vim-common,安装full 版本 sudo apt-get install vim

5、安装google_appengine

#当前目录:root/webrtc/
wget https://storage.googleapis.com/appengine-sdks/featured/google_appengine_1.9.40.zip
# 安装unzip
apt-get install unzip
unzip google_appengine_1.9.40.zip

#配置环境变量:在/etc/profile文件最后增加一行:
export PATH=$PATH:/root/webrtc/google_appengine
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
make install

7、安装apprtc

#当前目录:root/webrtc/
# 注意如果没有git的话,需要apt install git安装一下git
git clone git://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"

这时候我们只要单独使用git下载net即可:

mkdir -p $GOPATH/src/golang.org/x/
cd $GOPATH/src/golang.org/x/
git clone git://github.com/golang/net.git net 
go install net

# 重新获取一下collidermain
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
./configure
make install


【免费分享】音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击788280672加群免费领取~

配置运行服务器

1、coturn Nat穿透服务器

注意这里需要设置一下用户名和密码,后面会配置apprtc的时候需要使用到。

#启动内网ip,这个是172开头的,在你云服务器的后台可以查询到,比如笔者的是172.16.16.4,用户名设置为flyer,密码为123456
nohup turnserver -L 172.16.16.4 -a -u flyer:123456 -v -f -r nort.gov &

# 可以通过命令lsof -i:3478查询下是否启动成功,成功的话一般会输出以下信息
#COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
#turnserve 14754 root   16u  IPv4 112232      0t0  UDP instance-5i00bk4l:3478 
#turnserve 14754 root   17u  IPv4 112233      0t0  UDP instance-5i00bk4l:3478 
#turnserve 14754 root   32u  IPv4 112263      0t0  TCP instance-5i00bk4l:3478 (LISTEN)
#turnserve 14754 root   33u  IPv4 112267      0t0  TCP instance-5i00bk4l:3478 (LISTEN)

2、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
nohup $GOPATH/bin/collidermain -port=8089 -tls=true  -room-server="https://你服务器的公网ip:8080" &

#使用命令lsof -i:8089检查下是否启动成功,如果成功则会输出以下相似的信息
#COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
#colliderm 14817 root    3u  IPv6 112969      0t0  TCP *:8089 (LISTEN)

3、搭建apprtc房间服务器

主要是修改配置文件/root/webrtc/apprtc/src/app_engine/constants.py中的相关参数即可:

注意这里就需要使用到前面配置coturn Nat穿透服务器时锁设置的用户名和密码

首先修改穿透服务器配置:
 

修改前
# ICE_SERVER_OVERRIDE  = [
#   {
#     "urls": [
#       "turn:hostname/IpToTurnServer:19305?transport=udp",
#       "turn:hostname/IpToTurnServer:19305?transport=tcp"
#     ],
#     "username": "TurnServerUsername",
#     "credential": "TurnServerCredentials"
#   },
#   {
#     "urls": [
#       "stun:hostname/IpToStunServer:19302"
#     ]
#   }
# ]

#修改后
ICE_SERVER_OVERRIDE  = [
   {
     "urls": [
       "turn:你服务器的公网ip:3478?transport=udp",
       "turn:你服务器的公网ip:3478?transport=tcp"
     ],
     "username": "coturn Nat穿透服务器的用户名",
     "credential": "coturn Nat穿透服务器密码"
   },
   {
     "urls": [
       "stun:你服务器的公网ip:3478"
     ]
   }
 ]

然后修改ICE配置:

#未修改前
ICE_SERVER_BASE_URL = 'https://appr.tc'
#修改后
ICE_SERVER_BASE_URL = 'https://你服务器的公网ip'

最后修改WSS_INSTANCE_HOST_KEY:

#修改前
WSS_INSTANCE_HOST_KEY = 'host_port_pair'
WSS_INSTANCE_NAME_KEY = 'vm_name'
WSS_INSTANCE_ZONE_KEY = 'zone'
WSS_INSTANCES = [{
    WSS_INSTANCE_HOST_KEY: 'apprtc-ws.webrtc.org:443',
    WSS_INSTANCE_NAME_KEY: 'wsserver-std',
    WSS_INSTANCE_ZONE_KEY: 'us-central1-a'
}, {
    WSS_INSTANCE_HOST_KEY: 'apprtc-ws-2.webrtc.org:443',
    WSS_INSTANCE_NAME_KEY: 'wsserver-std-2',
    WSS_INSTANCE_ZONE_KEY: 'us-central1-f'
}]

# 修改后
WSS_INSTANCE_HOST_KEY = '你服务器的公网ip:8089'
WSS_INSTANCE_NAME_KEY = 'vm_name'
WSS_INSTANCE_ZONE_KEY = 'zone'
WSS_INSTANCES = [{
    WSS_INSTANCE_HOST_KEY: '你服务器的公网ip:8089',
    WSS_INSTANCE_NAME_KEY: 'wsserver-std',
    WSS_INSTANCE_ZONE_KEY: 'us-central1-a'
}]

最后修改完成保存即可。

编译下apprtc

#编译
cd /root/webrtc/apprtc

# 以下这一步可能会报错,提示node版本太低
# 如果报错我们需要使用npm install -g n和sudo n stable更新以下node然后再继续执行以下命令即可
npm install --no-fund
# 这一步有可能报错,下面有解决方法
grunt build

在上面执行grunt build的时候有可能会报错提示requests模块不存在,我们使用pip安装一下即可,

报错信息:

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 import requests ImportError: No module named requests Use --force to continue.
Aborted due to warnings.
 

##### 安装pip
cd /root/webrtc
wget https://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg  --no-check-certificate
chmod +x setuptools-0.6c11-py2.7.egg
./setuptools-0.6c11-py2.7.egg
wget https://pypi.python.org/packages/source/p/pip/pip-1.5.4.tar.gz 
tar -xf pip-1.5.4.tar.gz
cd pip-1.5.4
python setup.py install
pip install requests
# 安装完成后再执行编译:
cd /root/webrtc/apprtc
# 重新执行下编译
grunt build

启动apprtc

#注意以下内网ip是172开头的
nohup dev_appserver.py --host=服务器的内网ip /root/webrtc/apprtc/out/app_engine --skip_sdk_update_check &

到了这一步WebRTC的服务器基本就算搭建完成了,这时候在你的浏览器输入http://服务器公网IP:8080/如果能顺利打开,那么恭喜你环境算是搭建成功啦!!!

4、安装nginx代理https

为什么需要安装nginx,因为chrome浏览器不支持在非https方式下打开音/视频设备。 而且apprtc中的信令服务器(collider)也不支持非 https 服务。

但是我们在前面配置中都是使用http的服务,没有直接配置成https的,因此我们需要使用nginx做一次代理,实现https的服务。 当然如果在前面的配置中我们直接使用https的服务,那么这一步就没有必要了,但是需要我们有第三方的证书,而不是使用私有证书。

下面下载安装以下nginx:
 

# 下载nginx
wgwt http://nginx.org/download/nginx-1.16.1.tar.gz
# 解压
tar xvf nginx-1.16.1.tar.gz
# 安装PCRE
apt-get install libpcre3-dev
cd nginx-1.16.1
./configure --with-http_ssl_module
make install
#默认安装在/usr/local/nginx
#配置nginx.conf
vim /usr/local/nginx/conf/nginx.conf

修改nginx配置/usr/local/nginx/conf/nginx.conf

events {
 	worker_connections 1024;
}
http{
	upstream roomserver {
        server 你服务器的公网ip:8080;
	}
	server {
		listen 80;
		server_name 你服务器的公网ip;  
		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 4你服务器的公网ip;
		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;
		}
	}
}

启动nginx:

/usr/local/nginx/sbin/nginx

这时候再次在浏览器输入服务器的ip就能打开apprtc了,打开后大概如图这样子的:

然后点击加入房间,允许相关权限就能通过摄像头看到自己的画面了...

吐槽两句

不得不说为了准备一个WebRTC的开发测试环境还是有点坑的,虽然说按照步骤来不难,但是需要搭建的内容实在是太多,而且极容易一步错步步错。

笔者也是尝试了好几天,查了很多的资料做了很多尝试才搭建成功。最后还是为互联网人的网络不能互联而WTF发泄一下...

共勉!!!

作者:思想觉悟
原文链接 WebRTC之服务器搭建 - 掘金

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1407705.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JAVA】Java并发编程中的锁升级机制

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 四个级别锁 锁升级的过程&#xff1a; 偏向锁升级为轻量级锁&#xff1a; 轻量级锁升级为重量级锁&#xff1a; 结语 我的其他…

vue3 中组合键 command+Enter / shift+Enter / alt + Enter 实现换行,详细实现

vue3 中组合键实现换行 需求背景 有一个聊天室功能&#xff0c;采用输入框的形式&#xff0c;输入完毕使用Enter&#xff0c;可以直接进行发送。使用一些组合键 比如 commandEnter / shiftEnter / alt Enter … 可以实现换行操作。但现实的情况是&#xff0c;原生 Enter 天然…

DC-9靶机做题记录

靶机下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1LR44-oFnO6NU6bTNs7VNrw?pwdhzke 提取码&#xff1a;hzke 参考&#xff1a; 【DC系列靶机DC9通关讲解】 https://www.bilibili.com/video/BV1p24y1s78C/?share_sourcecopy_web&vd_source12088c392…

推特Twitter账号被冻结?IP代理选对了吗?

Twitter 拥有庞大的用户群和日常内容流&#xff0c;是沟通、网络和营销的重要平台。然而&#xff0c;处理其限制和潜在的帐户问题可能很棘手。有许多跨境社媒小伙伴反馈&#xff0c;账号无故被冻结&#xff0c;导致内容与客户尽失&#xff01;其实除了账户养号、被举报、广告信…

MySQL--删除数据表(6)

MySQL中删除数据表是非常容易操作的&#xff0c;但是你在进行删除表操作时要非常小心&#xff0c;因为执行删除命令后所有数据都会消失。 语法 以下为删除 MySQL 数据表的通用语法&#xff1a; DROP TABLE table_name ; -- 直接删除表&#xff0c;不检查是否存在 或 DROP…

【MIdjourney】五个特殊物体关键词

1.碳酸(Carbonate) 这一词语的本意是指包含碳&#xff08;C&#xff09;、氧&#xff08;O&#xff09;和氢&#xff08;H&#xff09;元素的化合物。而在MIdjourney中添加该词汇会使得生成的图片具有水滴效果且富有动态感。 2.灯丝(Filament) Filament效果可能包括更逼真的…

Unity中URP下获取额外灯数量

文章目录 前言一、SimpleLit下额外灯数量的获取1、在 SimpleLit 下&#xff0c;先获取了额外灯的数量2、对其进行循环计算每一个额外灯3、GetAdditionalLightsCount在这里插入图片描述 二、GetAdditionalLightsCount实现了什么1、_AdditionalLightsCount.x2、unity_LightData.y…

【Leetcode】2765. 最长交替子数组

文章目录 题目思路代码结果 题目 2765. 最长交替子数组 题目&#xff1a;给你一个下标从 0 开始的整数数组 nums 。如果 nums 中长度为 m 的子数组 s 满足以下条件&#xff0c;我们称它是一个 交替子数组 &#xff1a; m 大于 1 。 s1 s0 1 。 下标从 0 开始的子数组 s 与…

JL-03-Q6 校园气象站

产品概述 校园气象站针对测量与环境、科学研究等相关的气象指标进行设计制造&#xff0c;气象站对采集数据信息以图表、数据的形式真实、直观的反应当前环境数据指标。可通过各种传感器对气压、气温、相对湿度、风向、风速、雨量、太阳辐射、乃至空气质量等要素进行采集、存储…

【数学建模】综合评价方法

文章目录 综合评价的基本理论和数据预处理综合评价的基本概念综合评价体系的构建综合指标的预处理方法评价指标预处理示例 常用的综合评价数学模型线性加权综合评价模型TOPSIS法灰色关联度分析熵值法秩和比&#xff08;RSR&#xff09;法综合评价示例 综合评价的基本理论和数据…

基于SSM的企业文档管理系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是何时&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML 我欲乘风归去 又恐琼楼玉宇 高处不胜寒 -苏轼 一、项目简介 现代经济快节奏发展以及不断完善升级的信息化技术&…

火热报名中:2024山西国际人工智能展览会(世亚智博会)

2024山西国际人工智能展览会&#xff08;世亚智博会&#xff09;是由中国人工智能学会、山西省科学技术学会联合主办&#xff0c;旨在推动全球人工智能技术的交流与合作。展会将于2024年6月在山西潇河国际会展中心举行&#xff0c;主题为“数字新时代链接新未来”&#xff0c;将…

刷题总结1.24(补充版)

可以把第三个for提出来&#xff0c;因为和其它的都没什么关联&#xff0c;然后第一个和第二个for是12。。。的和&#xff0c;这个是n^2数量级的&#xff0c;最后总的是n^3数量级的。 在使用邻接表表示图时&#xff0c;拓扑排序算法的时间复杂度为O(ne)。 首先&#xff0c;对于…

openGauss学习笔记-205 openGauss 数据库运维-常见故障定位案例-业务运行时整数转换错

文章目录 openGauss学习笔记-205 openGauss 数据库运维-常见故障定位案例-业务运行时整数转换错205.1 业务运行时整数转换错205.1.1 问题现象205.1.2 原因分析205.1.3 处理办法 openGauss学习笔记-205 openGauss 数据库运维-常见故障定位案例-业务运行时整数转换错 205.1 业务…

生成芭比系列咒语

咒语&#xff1a;Close-up of a man with golden hair and a necklace,Digital Art Inspired by Cheng Yanjun, Tumblr,Rococo,Portrait of Josie in Black Pink,Portrait Zhixiu Black Pink,flowing golden hair,long flowing golden hair,Bubble Gum Long Hair,blond hair,Pi…

Oracle BIEE 示例(一)数据透视表2

1 背景 版本:BIEE 12C 视图:数据透视表 实现内容(顺序与具体内容不一致): 2 空列显示(方法一) 2.1 问题 列为空时,标题栏不显示信息。 2.2 期望 即使数据为空,也要显示列名。 2.3 官方资料 2.3.1 操作步骤 2.3.1.1 要在分析级别关闭空值隐藏,请执行以下操作…

MATLAB实现逐步回归数学建模算法

逐步回归&#xff08;Stepwise Regression&#xff09;是一种逐步选择特征的回归方法&#xff0c;通过逐步地添加或删除特征来构建模型。这种方法的目标是在保持模型预测准确性的同时&#xff0c;减少特征的数量&#xff0c;以防止过拟合或提高模型的解释性。逐步回归通常分为前…

如何群发邮件outlook?外贸邮件群发教程?

outlook怎么设置邮件群发&#xff1f;outlook邮箱群发邮件方法&#xff1f; 在日常生活中&#xff0c;我们经常需要给多个人发送相同的邮件。这时候&#xff0c;群发邮件就显得尤为重要。Outlook作为一款常用的办公软件&#xff0c;提供了强大的邮件群发功能。蜂邮EDM就教大家…

JAVA文件操作IO流(一)

File 文件对象 文件 在计算机中&#xff0c;文件是非常重要的存储方式&#xff0c;JAVA的标准库java.io提供了File对象来操作文件和目录。要构建一个File对象&#xff0c;需要通过构建方法&#xff0c;传入该文件的本地物理路径。 例如&#xff1a; 获取文件对象的1.绝对路径…

11.前端--CSS-背景属性

1.背景颜色 样式名称&#xff1a; background-color 定义元素的背景颜色 使用方式: background-color:颜色值; 其他说明&#xff1a; 元素背景颜色默认值是 transparent&#xff08;透明&#xff09;      background-color:transparent; 代码演示&#xff1a; 背景色…