关于WebRTC的简单了解报告
1.什么是WebRTC
WebRTC是Google于2011年发布的一个开源项目,它提供基于API的Web浏览器和移动应用程序之间的通信,包括音频、视频和数据的传输。 它消除了对本机插件和应用程序安装的依赖,使这些连接易于使用,并得到所有主要浏览器和移动操作系统的支持。
在过去的几年中,WebRTC在技术社区中的应用迅速发展。 Facebook、Amazon和Google都是实现WebRTC的主要技术公司之一,这些公司实现了WebRTC,从而使他们的Web应用程序更快、更可靠和更安全。WebRTC还提供现成的解决方案,可以轻松地与其他软件集成。
WebRTC提供了视频会议的核心技术,包括音视频的采集、编解码、网络传输、显示等功能,并且还支持跨平台:windows,linux,mac,android。
2.WebRTC工作原理
WebRTC的主要焦点是在参与者之间提供实时音频和视频通信,参与者使用Web浏览器开始对话,相互定位并绕过防火墙(如果有的话)。WebRTC利用嵌入浏览器中的JavaScript API和HTML5。 WebRTC应用程序的典型功能如下:
代码语言:javascript复制(1)发送和接收流数据,包括音频和视频。
(2)检索网络配置数据,例如 使用WebRTC API向另一个客户端发送和接收数据所需的IP地址,应用程序端口,防火墙和NAT。
(3)打开/关闭连接并报告错误。
(4)传输媒体数据,例如图像分辨率和视频编解码器。
为了发送和接收数据流,WebRTC提供了以下可在Web应用程序中使用的API:
代码语言:javascript复制RTCPeerConnection,用于音频和视频传输,加密和带宽配置。
RTCDataChannel,用于传输通用数据。
MediaStream,用于从数码相机,网络摄像头,麦克风或共享桌面等设备访问多媒体数据流。
作为涉及私人信息传输的技术,WebRTC预先假定安全措施以保护用户免受恶意入侵。 当应用程序使用WebRTC时,没有必要安装辅助插件来保护其网络连接。 它使用经过验证可在传输过程中保护数据的标准加密技术。 WebRTC组件使用强制加密,并且所有JavaScript API都使用安全的HTTPS连接。 因此,实现WebRTC应用程序的开发人员需要注意的主要安全问题就是确保使用安全网络协议。
3.WebRTC后台服务
3.1.通话的房间服务器(Room Server)
房间服务器是用来创建和管理通话会话的状态维护,是双方通话还是多方通话,加入与离开房间等等,我们暂时沿用Google部署在GAE平台上的AppRTC这个房间服务器实现,该GAE App的源码可以在github.com上获取.该实现是一个基于Python的GAE应用,我们需要下载Google GAE的离线开发包到我们自己的Linux服务器上来运行该项目,搭建大陆互联网环境下的房间服务器.
3.2.通话的信令服务器(Signaling Server)
信令服务器是用来管理和协助通话终端建立去中心的点对点通话的一个角色.这个角色要负责一下任务:
- 用来控制通信发起或者结束的连接控制消息
- 发生错误时用来相互通告的消息
- 各自一方媒体流元数据,比如像解码器、解码器的配置、带宽、媒体类型等等
- 两两之间用来建立安全连接的关键数据
- 外界所能看到的网络上的数据,比如广域网IP地址、端口等信令服务器的具体协议实现没有严格规定,只要实现功能就OK.
我们这里依然沿用Google提供的基于GO语言和WebSocket的信令服务器Collider.和上面的房间服务器一并在Github上可以获取.获取到我们自己的Linux服务器上用GO语言的运行环境来运行该信令服务器.
3.3.防火墙打洞服务器(STUN/TURN/ICE Server)
我们目前大部分人连接互联网时都处于防火墙后面或者配置私有子网的家庭(NAT)路由器后面,这就导致我们的计算机的IP地址不是广域网IP地址,故而不能相互之间直接通讯. 正因为这样的一个场景,我们得想办法去穿越这些防火墙或者家庭(NAT)路由器,让两个同处于私有网络里的计算机能够通讯起来.
###3.4.房间服务器搭建案例(LINUX)
####3.4.1.安装依赖软件和环 安装必备软件像 git、解压、nodejs、python 、go语言编译等必备的软件
代码语言:javascript复制cd ~
sudo apt-get update
apt-get install git unzip lrzsz nodejs npm automake autoconf libtool nodejs-legacy python-webtest golang -y
哪个软件安装失败就重新装
代码语言:javascript复制apt-get 软件名称
3.4.2. java环境安装
下载jdk8 linux 64位版 jdk-8u191-linux-x64.tar.gz 下载地址下载完拿shell工具上传到服务器/usr/lib/jvm路径下,jvm 文件夹没有的话创建后上传。解压jdk压缩文件
代码语言:javascript复制cd /usr/lib/jvm/
tar -zxvf jdk-8u191-linux-x64.tar.gz
设置环境变量
代码语言:javascript复制cd /etc/
vim profile
打开文件后,在文件末尾追加
代码语言:javascript复制export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_191
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
修改后按键ESC ->shift :->wq 保存并退出 使配置生效
代码语言:javascript复制source /etc/profile
验证java环境
代码语言:javascript复制java -version
如果出现如下信息则环境配置成功
代码语言:javascript复制java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
3.4.3. git下载apprtc项目仓库,并编译
代码语言:javascript复制cd ~
git clone https://github.com/webrtc/apprtc.git
cd apprtc/
git checkout v1.0
安装编译工具
代码语言:javascript复制npm -g install grunt-cli
安装项目依赖
代码语言:javascript复制npm install
这里不会很顺利,出现各种问题 如果报错:SyntaxError: Use of const in strict mode,需要更新版本:
代码语言:javascript复制npm cache clean -f
npm install -g n
n stable
node -v
npm install // 再来安装一次
如果仍有错误还可以切换grunt-cli的源再重来一次
代码语言:javascript复制rm node_modules/ -rf //删掉
npm config set registry https://registry.npm.taobao.org //切换淘宝源
npm info underscore //使其生效
npm install // 再来安装一次
还有问题谷歌、百度、Stack Overflow 查询
依赖搞定之后,编译apprtc项目
代码语言:javascript复制grunt build
这里也会出现一些问题,缺少一些依赖,到相应缺少module目录下
代码语言:javascript复制npm install
再没有可能需要访问国外网站自己下载。 如果出现
代码语言:javascript复制requests.exceptions.SSLError
这个是证书,不需要,nginx来转发就好了,使用如下方式编译
代码语言:javascript复制grunt build -force
如果出现
代码语言:javascript复制Done.with warrings 或者 Done.with out error
表示成功
3.4.4.修改编译后的项目配置,源文件没有动
修改 constants.py
代码语言:javascript复制cd out/app_engine/
vim constants.py
修改的部分
代码语言:javascript复制TURN_BASE_URL = 'https://www.域名'
ICE_SERVER_BASE_URL = 'https://www.域名
WSS_INSTANCE_HOST_KEY = 'www.域名:8089'
WSS_INSTANCES = [{
WSS_INSTANCE_HOST_KEY: 'www.域名:8089',
WSS_INSTANCE_NAME_KEY: 'wsserver-std',
WSS_INSTANCE_ZONE_KEY: 'us-central1-a'
}, {
WSS_INSTANCE_HOST_KEY: 'www.域名:8089',
WSS_INSTANCE_NAME_KEY: 'wsserver-std-2',
WSS_INSTANCE_ZONE_KEY: 'us-central1-f'
}]
修改 index_template.html在 var loadingParams = { 这一行上面添加javaScript代码
代码语言:javascript复制var servers=[{
credential:"helloword",
username:"helloword",
urls:["turn:服务器外网ip:3478?transport=udp",
"turn:服务器外网ip:3478?transport=tcp",
"turn:服务器外网ip:3479?transport=udp",
"turn:服务器外网ip:3479?transport=tcp"
]
}];
修改debug.js
代码语言:javascript复制cd ~/apprtc/out/app_engine/js
vi apprtc.debug.js
做出如下修改
代码语言:javascript复制if (!isChromeApp()) {
roomLink=roomLink.substring("http","https"); //新增加的
window.history.pushState({"roomId":roomId, "roomLink":roomLink}, roomId, roomLink);
}
注释掉
代码语言:javascript复制//peerConnectionConfig: {{ pc_config | safe }},
//turnRequestUrl: '{{ turn_url }}',
//iceServerRequestUrl: '{{ ice_server_url }}',
添加
代码语言:javascript复制peerConnectionConfig:{"rtcpMuxPolicy":"require","iceServers":servers,"bundlePolicy":"max-bundle"},
3.4.5.安装google_appengine 谷歌Python服务器容器,apprtc跑在上面
https://cloud.google.com/appengine/downloads?csw=1
选择Standard environment下的python,下载到本地后后上传到服务器 ~ 目录
解压
代码语言:javascript复制cd ~
unzip google_appengine_1.9.80.zip
配置环境变量
代码语言:javascript复制vi /etc/profile
添加变量
代码语言:javascript复制export PATH=$PATH:/root/google_appengine/
使其生效
代码语言:javascript复制source /etc/profile
创建日志文件
代码语言:javascript复制mkdir logs
cd logs
touch room.log collider.log turn.log //创建文件
chmod 777 room.log collider.log turn.log //修改权限
3.4.6.启动房间服务器,观察日志
观察日志
代码语言:javascript复制tail -f ./logs/room.log
新建立连接启动服务器
代码语言:javascript复制cd ~
nohup ./google_appengine/dev_appserver.py --host
内网ip--enable_host_checking false ./apprtc/out/app_engine > ./logs/room.log 2>&1 &
3.4.7.结果验证
打开https://域名/
能正常访问,则成功
如果报错找不到
callstats.min.js 下载地址
代码语言:javascript复制https://download.csdn.net/download/qinxue24/10789910
socket.io.js 下载地址
代码语言:javascript复制https://download.csdn.net/download/xuelang532777032/10723395
下载后上传到
代码语言:javascript复制/root/apprtc/out/app_engine/third_party/callstats
重新打开网页就好
关于其他
依次将通话的房间服务器、通话的信令服务器、防火墙打洞服务器搭建完成后,进行一定的整合配置,使他们能一起工作,最后用谷歌浏览器打开 http://apprtc.diveinedu.com:8080/ ,注册房间之后就可以视频通话了。
一些开源的WebRTC框架
licode
代码语言:javascript复制http://chotis2.dit.upm.es/#
mediasoup
代码语言:javascript复制https://mediasoup.org/
jitsi
代码语言:javascript复制https://jitsi.org/
kurento
代码语言:javascript复制http://www.kurento.org/
进入这些网址后我们可以试用,找到相关的框架和相关的服务器搭建API和案例。