最近研究webrtc视频直播技术,网上找了些教程最终都不太能顺利跑起来的,可能是文章写的比较老,使用的一些开源组件已经更新了,有些配置已经不太一样了,所以按照以前的步骤会有问题。折腾了一阵终于跑起来了,记录一下。

一个简单的聊天室html页面

这个页面使用simple-webrtc来实现webrtc的通讯,simple-webrtc是对几个webrtc核心对象的封装,所以使用这个会比较简单。

<!DOCTYPE html>
<html>
<head><title>webrtc chat room </title><style>video {height: 200px;width: 200px;border: 1px solid cornflowerblue;border-radius: 3px;margin: 10px;}</style>
</head>
<body><div>roomid: <input id="roomid" type="text" value=""/>   <input type="button" id="btnStart" value="join room"></div><div>nick name: <input id ="nickname" readonly="readonly"  type = "text" value=""></div><h3>self:</h3><video id="localVideo"></video><div id="remoteVideos"><h3>remote clients:</h3></div><script src="https://cdn.bootcss.com/jquery/3.3.0/jquery.min.js"></script><script src="js/simplewebrtc-with-adapter.bundle.js"></script><script lang="javascript">$("#nickname").val(new Date().getTime());      var qs = function (key) {return (document.location.search.match(new RegExp("(?:^\\?|&)" + key + "=(.*?)(?=&|$)")) || ['', null])[1];};var roomid = qs("roomid");if (roomid) {$('#roomid').val(roomid);}else {$('#roomid').val('99999');}// $('#roomid').val(roomid);var smUrl = 'https://webrtc.xxx.com:8800';var webrtc = new SimpleWebRTC({// the id/element dom element that will hold "our" videolocalVideoEl: 'localVideo',// the id/element dom element that will hold remote videosremoteVideosEl: 'remoteVideos',// immediately ask for camera accessautoRequestMedia: true,url: smUrl,nick: $('#nickname').val(),});webrtc.on('readyToCall', function () {// you can name it anythingconsole.log('connectioned .');});webrtc.on("createdPeer", function (peer) {console.log('createdPeer', peer, peer.nick );if (peer.nick) {alert('client '+ peer.nick + ' joined');}});webrtc.on("joinedRoom", (roomName )=>{console.log('joinedRoom', roomName );alert('joined room ' + roomName );});webrtc.on("leftRoom", (roomName )=>{console.log('leftRoom', roomName );});webrtc.on("videoAdded", (videoEl, peer )=>{console.log('videoAdded', videoEl, peer );if (peer.nick) {alert('client '+ peer.nick + ' joined');}});webrtc.on("videoRemoved", (videoEl, peer )=>{console.log('videoRemoved', videoEl, peer );});$('#btnStart').click(function(){var roomId = $('#roomid').val();webrtc.joinRoom(roomId);   // alert('join room '+ roomId +' success')})//$('#btnStart').click();</script>
</body>
</html>

安装nginx并部署聊天室页面

安装nginx:

sudo apt-get install nginx

配置nginx:

server {listen 80;listen 443;server_name webrtc.xxx.com;location / {index index.html;root html/www;}ssl on;ssl_certificate /ssl/xxx.crt;ssl_certificate_key /ssl/xxx.key;ssl_session_timeout 5m;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;}

安装完成nginx后把上面的html页面使用nginx部署到服务器。注意需要走https,因为chrome的设定不走https没法调用起摄像头跟麦克风。

安装并配置signalmaster信令服务

信令服务是用来在客户端之间传输webrtc的客户端信息。因为在webrtc建立p2p连接的时候需要对方客户端的相关信息,所以需要一个渠道来转发客户端之间的信息。signalmaster是一个基于nodejs的服务,使用socket.io实现websocket长连接。

安装signalmaster:

git clone https://github.com/simplewebrtc/signalmaster.git

配置signalmaster:

cd signalmaster
cd config
vim development.json
//编辑
{"isDev": true,"server": {"port": 8800,"/* secure */": "/* whether this connects via https */","secure": true,"cert": "/ssl/xxx.crt","key": "/ssl/xxx.key","password": null},"rooms": {"/* maxClients */": "/* maximum number of clients per room. 0 = no limit */","maxClients": 0},"stunservers": [{"urls": "stun:webrtc.xxx.com:3478"}],"turnservers": [{"urls": ["turn:webrtc.xxx.com:3478"],"username": "abc","credential": "123","secret": "","expiry": 86400}]
}
~

这里主要注意的是也需要配置ssl证书,证书使用上面nginx那个证书即可。另外trunserver如果设置了密码也需要配置正确的用户名跟密码。

安装并配置coturn穿透服务

我们的客户端一般都在局域网之内,所以p2p连接建立的时候需要进行内网穿透。使用coturn建立turnserver作为穿透服务。

安装coturn:

# deps
apt-get install -y \emacs-nox \build-essential \libssl-dev sqlite3 \libsqlite3-dev \libevent-dev \g++ \libboost-dev \libevent-dev
# download
wget https://github.com/coturn/coturn/archive/4.5.0.7.tar.gz
tar xvf 4.5.0.7.tar.gz
# build & install
cd coturn-4.5.0.7
./configure --prefix=/opt
make
make install
# env
echo "export PATH=/opt/bin:$PATH" >> ~/.bashrc
source ~/.bashrc

配置coturn:

cd coturn-4.5.0.7
vim coturn.conf
#server
listening-port=3478
listening-ip=
relay-ip=
alt-listening-port=0
external-ip=
realm=abc
# server-name={YOUR_SERVER_NAME}
no-tls
no-dtls
mobility
no-cli
verbose
fingerprint
# auth
lt-cred-mech
stale-nonce=3600
# user
# 这里是演示,不配置数据库,通过 use={name}:{password} 方式配置
# userdb=/opt/var/db/turndb
# 多用户则写多行
user=abc:123

这里主要需要注意的是ip的配置listening-ip=内网ip,relay-ip=内网ip,external-ip=外网ip。还有user配置了话,信令服务器也要配置对应的用户名密码。

运行所有服务

运行信令服务:

cd signalmaster
node server.js

运行穿透服务器:

cd coturn-4.5.0.7
turnserver -c coturn.conf

访问一下nginx部署的静态页面就可以啦。开两个网页,自己可以跟自己试一下,最好找其他朋友试一下,有的时候穿透服务没配置好的时候,自己跟自己是可以的,但是跟其他人就不可以了。

参考

Coturn: TURN and STUN Server
5分钟快速打造WebRTC视频聊天
Real-time communication for the web
coturn
signalmaster

在ubuntu上实现基于webrtc的多人在线视频聊天服务相关推荐

  1. 基于Trtc的内贸站视频聊天服务

    基于Trtc的内贸站视频聊天服务分享 说到视频聊天,大家第一个想到的是啥,QQ! 其实最早的视频聊天工具应该是 : Netmeeting(我能找到的最早聊天工具) Netmeeting是Windows ...

  2. html5 视频语音对讲,一种基于WebRTC的多人语音视频通话方法及系统与流程

    本发明涉及视频通话领域,特别涉及一种基于WebRTC的多人语音视频通话方法及系统. 背景技术: 随着互联网技术和通信技术的快速发展,人们的交流方式与交流内容得到了极大的丰富和发展.在节奏越来越快的信息 ...

  3. 基于webrtc的一对多音视频通讯

    基于webrtc的一对多音视频通讯 本次实验使用windows平台,其他平台如html5.android.ios.linux.mac等思路大同小异,上一篇文章已经提及,在此不再赘述. 在此唯一对初学者 ...

  4. 基于webRTC的1V1在线视频聊天(网页版DEMO)

    给大家分享一个基于webRTC的1V1在线视频聊天DEMO: https://webrtc.jiuhoutech.com/ DEMO效果如下: 说明: 1. 可以显示本地画面以及对方画面 2. 可以发 ...

  5. WebRTC多人音视频聊天架构及实战

    三种模式 简单介绍一下基于 WebRTC 的多人通信的几种架构模式. 1.Mesh 架构 我们之前写过几个 1 v 1 的栗子,它们的连接模式如下: 这是典型的端到端对等连接,所以当我们要实现多人视频 ...

  6. 基于协同过滤算法的在线视频学习答题自动化批改平台 习题问答系统

    1 简介 今天向大家介绍一个计算机专业毕业设计项目,基于协同过滤算法的在线视频学习答题自动化批改平台 习题问答系统. 使用协同过滤算法完成习题推荐,在线视频学习,试卷自动化组卷,批改评分 在网络技术的 ...

  7. 【线上分享】安防视频上云趋势、痛点,华为云视频接入服务探索及实践

    近年来,视频安防行业一直处于高速发展阶段,据预测,2021全国在视频安防领域新增摄像头数量在1.2亿台,已经全面进入大视频时代,视频资源在我国的安全.治理.交通.警务.城管.环保等领域发挥着越来越重要 ...

  8. properties 配置回车_在Ubuntu上部署基于Docker的RSSHub,并配置SSL证书

    本文首发于简书,为同一作者 最近开始使用 RSS 这种信息聚合神器,再也不要打开各种 App 了.然而对于像微博.bilibili 这些不提供 RSS 订阅的网站还是有些头疼.于是尝试了 RSSHub ...

  9. Webrtc之2台电脑视频聊天

    *****************************2019-06-12*************************** 经过了几天的摸索,总算有点大概的概念了.现在开始一个很有挑战的事情 ...

最新文章

  1. 白平衡——图像处理中的一种增强技术
  2. CPU 和 GPU频率设置
  3. java定义一个course类,java集合,定义两个类,学生Student和课程Course,课程被学生选修,请在课程类中提供以下功能:...
  4. 备忘录怎么用红笔标注_备忘录丢失怎么找回来?教你轻松玩转备忘录
  5. Office文档转pdf和图片之NodeJS
  6. c语言变量声明举例,C语言变量的定义和声明
  7. Ionic生命周期与注意点
  8. 以编程方式管理IIS
  9. python 调用js_python调用JS方法
  10. [007]爬虫系列 | RPC调用简单示例
  11. 《王家视频教程图书馆》
  12. Linux中curl命令详解
  13. 面试官:什么是 Reactor 和 Proactor?
  14. 超级照片美化技法:炫目的舞台光斑效果
  15. PELU激活函数的tensorflow实现(一) Parametric Exponential Linear Unit
  16. 云存储:对象存储管理与安全
  17. linux游戏object怎么玩,用Object Detection玩第一人称射击游戏
  18. SPSS在电信行业中的应用
  19. 项目管理过程组–五大过程组
  20. linux页游一键端,页游一键端是什么意思

热门文章

  1. 大型网站技术架构:核心原理与案例分析笔记
  2. BZOJ1578: [Usaco2009 Feb]Stock Market 股票市场
  3. 通读AFN①--从创建manager到数据解析完毕
  4. hibernate注解方式来处理映射关系
  5. Java的LockSupport.park()实现分析
  6. 如何判断一个字符串是不是纯数字
  7. (转)学习密度与专注力
  8. Win7系统中必需记住的14个常用快捷键
  9. php token 验证,PHP如何实现Token验证
  10. ipad和iphone切图_如何在iPhone,iPad和Mac上使消息静音