一文梳理HTTP、TCP、Socket和WebSocket的区别和联系

一文梳理HTTP、TCP、Socket和WebSocket的区别和联系,第1张


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 包含返回的信息

发生错误

关闭通信

当音频元数据加载完毕时触发。

播放过程中实时触发

声音改变时触发


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/13461379.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-11
下一篇 2023-08-11

发表评论

登录后才能评论

评论列表(0条)

保存