WebRTC ,名称源自 网页即时通信 (英语:Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的 API。它于 2011 年 6 月 1 日开源并在 Google、Mozilla、Opera 支持下被纳入万维网联盟的 W3C 推荐标准。
首先,他即是 API 也是协议。
其次,他是浏览器进行音频与视频通话的 API,其实还有屏幕共享的功能。
最后,它现在已经处于 W3C 标准,各大浏览器厂商已经对他进行兼容了。
但是如果我们想使用好 webrtc,就得先了解 websocket。而对于 websocket,大家应该都比较熟悉了,比如社交聊天、多人 游戏 、协同编辑、视频会议、基于位置的应用(地图)、等等需要高实时的场景。我们比较常用的微信、QQ、某些直播软件等等也都是基于 websocket 实现消息与信令的转发。大家看到这里可能在信令这里迟疑了,接着看。
webrtc 是 P2P 的一种技术,什么是 P2P?其实就是 端对端,就说是你的音频、视频流不经过服务器中转,直接由一端发送到另一端。
不经过服务器中转,也就说时候,如果通过过程中服务器突然崩溃,是不是通话还能继续?
是的!但是发送音频视频流前,一定是需要建立 P2P 连接的,建立连接前一定需要服务器进行信令转发,这个信令就是通话两端的标识。
而如果想用 webrtc 实现通话,就得先中转信令、建立连接。而建立连接的话最好是要用 websocket 进行信令转发的。大家都知道,websocket 是个通道,在这个通道的所有端,都可以收到任意一端的消息流,包括发消息的本人。
为什么不经过服务器就可以直接获取到对方的视频音频流呢?是因为建立了 P2P 通道,这个 P2P 在中转信令的时候就已经通了,传输视频音频流的时候还要啥服务器啊。这个时候,肯定有小伙伴表示怀疑,音频视频流可以不通过服务器?是的,我骗了大家,确实要经过服务器,但是只是线上需要服务器转发,如果我们是本地两台或者多台同一局域网的端 进行 webrtc 音频视频流的转发,确实不需要中转服务器,但是线上有可能需要,也有可能不需要,这里又涉及到了一个 打洞 的概念。
我们平常可能会听到比较牛 x 的词汇,什么打洞、内网穿透、NAT 穿越,各种高大上的东西,其实也是蛮好理解的。大家都知道,两个不同网络下的两台主机不可以直接进行通信,而是需要走公网或者说各自的网关。打洞、内网穿透、NAT 穿越其实就是一个意思,就是使用 udp 让我们两台非同一网络的主机互联,不走公网,直接实现连接。有玩过花生壳的同学一定能理解内网穿透这个概念。
本地开发的话,两台主机连同一局域网,根本不需要内网穿透,就可以直接通信。
线上开发的话,如果能够 STUN 打洞成功,也不需要中转服务器。但是,有打洞不成功的概率,为什么呢,因为没有走公网,没有给运营商带来收益却带来通信成本,肯定要限制。国外打洞成功的概率在 70%,但是国内 50%都不到。
所以,为了防止打洞不成功的情况,我们使用 TURN 中转服务器 转发流媒体数据进行一个最后保障。此外还有一种方式为 逆向连接 ,也可以帮助我们实现 P2P 建立,他的原理是必须是一方走公网,也是有局限性的。
coturn 中继服务器由两部分组成 STUN 与 TURN,STUN 帮助我们打洞,TURN 帮助我们转发流媒体数据。
##连接过程
以下所有 API 截止到 20211206 为最新
##我有疑问
给大家看看 sdp 的本质,就是自身的媒体信息和编解码信息
一个 offer,一个 answer,我们彼此都知道对方的媒体信息与编解码信息,这样我们才能好好协商,我这边该用什么方式对你的视频音频流进行解码、渲染。
过程有些繁杂,具体流程小伙伴们可以看这篇文章 WebRTC TURN 协议初识及 turnserver 实践。
了解 webrtc 的音视频采集、桌面采集;
了解 websocket 和 webrtc 的整个链路建立过程;
实现 1V1 文字传输、视频通话、语音通话、屏幕共享;
实现视频通话、语音通话、屏幕共享过程中的截图、录音、录屏及 截图、录音、录屏的在线播放与下载;
将以上功能部署上线;
在这里,我们要对音视频建立过程画一个基本的流程图。
基本流程图
对于这些信令,我们使用 websocket 进行转发,这里大家会问,为什么不使用 >
sessionStorage 数据创建到浏览器页签关闭
localStorage 数据创建到用户手动清除,或者使用clear(), removeItem(key)删除
sessionStorage 条件:同一个浏览器页签
localStorage 条件:相同域名(协议,域名,端口)的不同网址
频繁 *** 作且安全性不高的数据
增加一条数据
根据key值获取一条数据
根据指定的key删除一条数据
清除所有数据
获取指定索引位的key值
数据项个数
宽高不要写单位,宽高不要在css中设置
默认从左到右,从上到下绘制,宽高为负值的时候往返方向绘制
设置填充颜色(可设置渐变色)
合法的颜色值,rgba(255,255,255,5)
设置描边颜色(可设置渐变色)
填充矩形
设置画笔宽度
描边矩形
开始绘制新的路径,相当于抬起画笔
把路径移动到画布中的指定点,不创建线条
添加一个新点,然后在画布中创建从该点到最后指定点的线条
设置或返回线条末端线帽的样式
设置或返回两条线相交时,所创建的拐角类型
创建从当前点回到起始点的路径,创建线条
绘制已定义的路径
清除指定区域内的像素
创建弧/曲线(用于创建圆形或部分圆)
绘制两条切线之间的弧线
设置或返回文本内容的当前字体属性
设置或返回文本内容的当前对齐方式,水平对齐方式
可选值: center,start ,end,left,right
设置或返回在绘制文本时使用的当前文本基线
可选值: alphabetic ,top ,hanging ,middle , ideographic ,bottom
在画布上绘制文本
创建线性渐变(用在画布内容上)
创建放射状/环形的渐变(用在画布内容上)
设置或返回用于阴影的颜色
设置或返回用于阴影的模糊级别
paintshadowBlur = 100;
设置阴影偏移
向画布上绘制图像、画布或视频
转换有叠加效果,如果之前有转换,会在之前转换的基础上再次转换
缩放当前绘图
旋转当前绘图
重新映射画布上的 (0,0) 位置
可选值:
设置或返回绘图的当前 alpha 或透明值
保存之前paint设置的样式
重新回到之前保存的样式
建立连接成功
接收服务器信息, evendata 包含返回的信息
发生错误
关闭通信
当音频元数据加载完毕时触发。
播放过程中实时触发
声音改变时触发
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)