使用WebRTC技术搭建小型的视频聊天页面
目录
参考资料
- WebRTC详细文档
- WebRTC samples(官方)
- 如何搭建一个简单的webrtc服务器(其他博主文档)
- WebRTC官方Demo
- webRTC开源库
- coturn Server部署和Docker
- WebRTC服务器测试地址
什么是WebRTC?
- WebRTC(Web实时通信)技术
- 浏览器之间交换任意数据,而无需中介
- 不需要用户安装插件或任何其他第三方软件
能做什么?
与Media Capture和Streams API一起
- 支持音频和视频会议
- 文件交换
- 屏幕共享
- 身份管理
- 以及与传统电话系统的接口,包括支持发送DTMF(按键拨号)信号
架构图

个人理解(类比)
官方文档晦涩难懂,所以按照自己的思路,整理总结。
核心知识点
先整理官方核心知识点,这里不理解,没关系,我们继续按自己的思路总结
- ICE(框架)允许您的Web浏览器与对等端连接
- STUN(协议)用于发现您的公共地址并确定路由器中阻止与对等体直接连接的任何限制
- NAT 用于为您的设备提供公共IP地址
- TURN 是指通过打开与TURN服务器的连接并通过该服务器中继所有信息来绕过对称NAT限制
- SDP 从技术上讲会话描述协议(SDP并不是一个真正的协议,而是一种数据格式)
核心知识点类比
我们使用餐厅(或者其他)来类比WebRTC核心概念, 想象一下,你现在正在餐厅里面。顾客(用户)可以直接与厨房(服务器)进行交流,而不需要通过服务员(中介)。在这个餐厅里,顾客可以点菜(发送音视频请求)、享用美食(接受音视频流),还可以与其他顾客(其他用户)直接交流(数据传输),而这一切都不要额外的工具或设备(插件)
备注:如果你明白,上面描述,那我们就继续。
ICE框架
想象一下ICE就像餐厅整体布局和设计,它确保顾客(用户)能够顺利找到座位并与厨房(对等端)建立联系。ICE负责协调顾客和厨房之间的所有连接方式,确保他们能顺利交流。
STUN(协议)
STUN就像餐厅门口接待员,负责帮助顾客找到餐厅的公共入口。接待员会告诉顾客他们的公共地址(公共IP地址),并帮助他们了解是否有任何障碍(比如路由器的限制、防火墙等)阻止他们直接进入餐厅(与对等端直接连接)。
NAT(网络地址转换)
NAT就像餐厅外墙,它为餐厅提供一个公共门牌号(公共IP地址)。虽然餐厅内部有很多桌子(设备),但外面的人只知道这个公共门牌号,而不知道内部具体位置。
TURN
TURN就像餐厅的外卖服务。如果顾客无法直接进入餐厅(由于对称NAT限制),他们可以选择通过外卖服务(TURN服务器)来获取食物。所有的订单和交流通过外卖服务进行,这样即使顾客无法直接到达餐厅,他们仍然可以享用美食。
SDP(会话描述协议)
SDP就像餐厅的菜单,它描述了可供选择的菜品和饮料(音视频流的格式和参数),虽然菜单本身不是一个真正协议,但它提供顾客和厨房之间所需的信息,以便他们能达成共识,确保顾客点的菜品能够被厨房正确准备。
WebRTC的核心API
- getUserMedia(点菜):
这个API就像顾客在餐厅里点菜。顾客告诉厨房他们想要什么(音频或视频),厨房就会准备好这些食材(获取用户的音频和视频流)。
- RTCPeerConnection(厨房的工作台):
这个API就像厨房的工作台,负责处理顾客的订单(建立连接)。它确保顾客和厨房之间的交流顺畅,处理音视频流的传输,就像厨房准备和发送食物一样。
- RTCDataChannel(顾客之间的交流):
这个API就像顾客之间的对话。顾客可以直接与其他顾客交流(传输数据),比如分享他们的用餐体验或交换食谱,而不需要通过服务员。
总结
在这个餐厅的类比中,WebRTC就像一个高效的餐厅,顾客可以直接与厨房和其他顾客交流,享受美食和分享信息,而不需要中介的干预。核心API则是实现这一切的工具,帮助顾客点菜、厨房准备食物和顾客之间的交流。这样,WebRTC使得实时通信变得简单而高效。
现在开始做饭
如果你看到这里,恭喜你,我们达成共识,现在开始做饭。
准备阶段
环境准备
安装Docker、Nginx、Nodejs等,请查询其他文档
- 一台服务器
- Debian 12 x86_64 操作系统
- Docker
- Nginx
- Nodejs
服务器搭建
首先我们需要两个服务,STUN/TURN、Signal Server, What's Signal Server? 别紧张我待会,会解释现在我们先专注与STUN/TURN,再次之前我们需要了解 Coturn TURN server(开源框架,感谢开发人员)
- STUN/TURN
- Signal Server 信令服务
Coturn TURN server(开源服务) 部署
对的你没有看错,就一行命令,这就是我为什么推荐使用Docker的原因,详细的Dockerfile请看 参考资料
docker run -d --network=host coturn/coturn
测试
打开我们的测试网站 https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/ 添加服务器,等等我们的密码哪里来的?
用户名和密码
用户名和密码在Dockerfile文件里面,我使用的是默认配置,没设置任何配置文件,所以密码是默认密码,自己可以修改
https://github.com/coturn/coturn/blob/master/docker/coturn/debian/Dockerfile

Signal Server信令服务
想象一下,在这个餐厅中,顾客(用户)需要与厨房(对等端)进行交流,但他们并不能直接看到厨房内部情况,信令服务器就像餐厅的接待员或前台,负责协调顾客之间的交流和信息传递。
- 传递消息,比如顾客A想与顾客B进行视频通话,顾客A请求会先发送到信令服务器,然后由信令服务器转发给顾客B
信令服务与客户端源代码
注意事项: WebRTC需要使用 SSL/TLS 证书,也就是https 协议。
测试

总结
- 搭建Signal Server信令服务
- 搭建STUN/TURN 服务
- Docker 部署Coturn TURN server(节省大量部署时间)
常见问题
- 稍后补充
源代码
使用WebRTC技术搭建小型的视频聊天页面的更多相关文章
- 实时音视频互动系列(下):基于 WebRTC 技术的实战解析
在 WebRTC 项目中,又拍云团队做到了覆盖系统全局,保证项目进程流畅.这牵涉到主要三大块技术点: 网络端.服务端的开发和传输算法 WebRTC 协议中牵扯到服务端的应用协议和信令服务 客户端iOS ...
- 使用WebRTC搭建前端视频聊天室——信令篇
博客原文地址 建议看这篇之前先看一下使用WebRTC搭建前端视频聊天室——入门篇 如果需要搭建实例的话可以参照SkyRTC-demo:github地址 其中使用了两个库:SkyRTC(github地址 ...
- 使用WebRTC搭建前端视频聊天室——点对点通信篇
WebRTC给我们带来了浏览器中的视频.音频聊天体验.但个人认为,它最实用的特性莫过于DataChannel——在浏览器之间建立一个点对点的数据通道.在DataChannel之前,浏览器到浏览器的数据 ...
- 使用WebRTC搭建前端视频聊天室——入门篇
http://segmentfault.com/a/1190000000436544 什么是WebRTC? 众所周知,浏览器本身不支持相互之间直接建立信道进行通信,都是通过服务器进行中转.比如现在有两 ...
- WebRTC搭建前端视频聊天室——信令篇
这篇文章讲述了WebRTC中所涉及的信令交换以及聊天室中的信令交换,主要内容来自WebRTC in the real world: STUN, TURN and signaling,我在这里提取出的一 ...
- WebRTC实现网页版多人视频聊天室
因为产品中要加入网页中网络会议的功能,这几天都在倒腾 WebRTC,现在分享下工作成果. 话说 WebRTC Real Time Communication 简称 RTC,是谷歌若干年前收购的一项技术 ...
- 5分钟快速打造WebRTC视频聊天
百度一下WebRTC,我想也是一堆.本以为用这位朋友( 搭建WebRtc环境 )的SkyRTC-demo 就可以一马平川的实现聊天,结果折腾了半天,文本信息都发不出去,更别说视频了.于是自己动手. 想 ...
- 5分钟快速打造WebRTC视频聊天<转>
原文地址: 5分钟快速打造WebRTC视频聊天 百度一下WebRTC,我想也是一堆.本以为用这位朋友( 搭建WebRtc环境 )的SkyRTC-demo 就可以一马平川的实现聊天,结果折腾了半天,文本 ...
- 在Ubuntu上部署一个基于webrtc的多人视频聊天服务
最近研究webrtc视频直播技术,网上找了些教程最终都不太能顺利跑起来的,可能是文章写的比较老,使用的一些开源组件已经更新了,有些配置已经不太一样了,所以按照以前的步骤会有问题.折腾了一阵终于跑起来了 ...
- 基于webRTC技术 音频和视频,IM解
由于原来的文章 http://blog.csdn.net/voipmaker 转载注明出处. 基于WebRTC技术可实现点对点音视频.即时通信.视频会议.最新的系统组件包含: TeleICE NAT ...
随机推荐
- Java元注解介绍
Java四种元注解相关介绍 概述 注解从Java1.5引入以来,不断地简化我们编写代码的流程,逐渐的也成为了我们必学的一项技术.我们学习了各种注解,学习了他们的用法,学习了他们的限制,是否想过他们的组 ...
- CSEC:香港城市大学提出SOTA曝光矫正算法 | CVPR 2024
在光照条件不佳下捕获的图像可能同时包含过曝和欠曝.目前的方法主要集中在调整图像亮度上,这可能会加剧欠曝区域的色调失真,并且无法恢复过曝区域的准确颜色.论文提出通过学习估计和校正这种色调偏移,来增强既有 ...
- 开源大模型占GPU显存计算方法
运行大模型GPU占用计算公式: \(M=\frac{(P * 4B)}{32 / Q} * 1/2\) M : 以GB标识的GPU内存 P : 模型中的参数数量,例如一个7B模型有70亿参数 4B : ...
- JS插入排序完全理解
插入排序是JS中的一种常见数组排序算法,记录一下如何理解并实现插入排序的功能; 首先看一下最直观的动态图 图片来源:https://www.javascriptc.com/ 从图像可以很直观的看出,插 ...
- echarts的x轴显示不全的解决办法
echarts的x轴显示不全的解决办法 一.背景 当x轴类目较多时,label显示时会自动间隔显示,也就是会隐藏掉中间的label,如下图: 二.解决办法 通过设置 xAxis.axisLabel.i ...
- css+div实现各种常见边框
css+div实现各种常见边框 一.效果图如下 二.实现代码 div { width: 120px; height: 100px; margin: 10px; float: left; text-al ...
- 暑假集训CSP提高模拟 ∫[0,6] (x^2)/6 dx
\[\text{暑假集训CSP提高模拟}\int^{6}_{0}\frac{x^{2}}{6}dx \] 关于这个东西怎么求的良心教程 含义:求出 \(f(x)=\frac{x^{2}}{6}\) 在 ...
- Java项目笔记(四)
1.包装类判断是否相等时,建议用equals 而不是 == 号 2.+= 默认包含了强制类型转换,单纯的s = s+1;编译是无法通过的,因为1属于int类型,必须显示声明强制类型转换 short s ...
- springboot整合shiro框架详解
在ShiroRealm 中 对所有 引入的service 加上注解 @Lazy ,防止 事务回滚失败.具体原因看该文章 新增整合swagger2,因为之前整合了shiro,所以再访问swagger的时 ...
- 2024年7月中国数据库排行榜:PolarDB独领云风骚,达梦跨越新巅峰
在7月发布的中国数据库流行度排行榜中,各大国产数据库厂商在不同领域表现势如破竹,PolarDB以800分刷新记录,并在SIGMOD 2024上获得"最佳论文奖":OceanBase ...