问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

使用WebRTC搭建前端视频聊天室——点对点通信篇

发布网友 发布时间:2022-10-11 17:50

我来回答

1个回答

热心网友 时间:2023-08-24 23:36

WebRTC给我们带来了浏览器中的视频、音频聊天体验。但个人认为,它最实用的特性莫过于DataChannel——在浏览器之间建立一个点对点的数据通道。在DataChannel之前,浏览器到浏览器的数据传递通常是这样一个流程:浏览器1发送数据给服务器,服务器处理,服务器再转发给浏览器2。这三个过程都会带来相应的消耗,占用服务器带宽不说,还减缓了消息从发送到接收的时间。其实最理想的方式就是浏览器1直接与浏览2进行通信,服务器不需要参与其中。WebRTC DataChannel就提供了这样一种方式。

如果对WebRTC和DataChannel不太了解的同学,可以先阅读如下文章:

- WebRTC的RTCDataChannel

- 使用WebRTC搭建前端视频聊天室——信令篇

- 使用WebRTC搭建前端视频聊天室——入门篇

当然服务器完全不参与其中,显然是不可能的,用户需要通过服务器上存储的信息,才能确定需要和谁建立连接。这里通过一个故事来讲述建立连接的过程:

不如钓鱼去

一些背景:

现在,老刘听说老姚钓鱼技术高超,想和老姚讨论钓鱼技巧。只要老刘和老姚相互之间知道对方的门牌号以及凭证,就可以串门了:

老刘和老姚相互之间知道了对方的门牌号和小区出入凭证,他们相互之间有什么需要交流的直接串门就行了,消息不再需要门卫老大爷来代为传达了

换个角度

我们把角色做一个映射:

于是乎故事就变成了这样:

这样,就建立了一个点对点的信道,流程如下所示:

故事

老刘和老姚已经可以相互串门了,经过一段时间的交流感情越来越深。老姚的亲友送了20斤葡萄给老姚,老姚决定送10斤给老刘。老姚毕竟年事已高,不可能一次带10斤。于是乎,老姚将葡萄分成了10份,每次去老刘家串门就送一份过去。

这里可以做如下类比:

这其实就是通过datachannel传输文件的方式,首先将文件分片,然后逐个发送,最后再统一的进行组合成一个新的文件

分片

通过HTML5的File API可以将type为file的input选中的文件读取出来,并转换成data url字符串。这也就为我们提供了很方便的分片方式:

组合

通过datachannel发送的分片数据,我们需要将其进行组合,由于是data url字符串,在接收到所有包之后进行拼接就可以了。拼接完成后就得到了一个文件完整的data url字符串,那么我们如何将这个字符串转换成文件呢?

方案一:直接跳转下载

既然是个dataurl,我们直接将其赋值给window.location.href自然可以下载,但是这样下载是没法设定下载后的文件名的,这想一想都蛋疼

方案二:通过a标签下载

这个原理和跳转下载类似,都是使用dataurl本身的特性,通过创建一个a标签,将dataurl字符串赋值给href属性,然后使用download确定下载后的文件名,就可以完成下载了。但是很快又有新问题了,稍微大一点的文件下载的时候页面崩溃了。这是因为dataurl有大小*

方案三:blob

其实可以通过给a标签创建blob url的方式来进行下载,这个没有大小*。但是我们手上是dataurl,所以需要先进行转换:

获得blob后,我们就可以通过URL API来下载了:

这里有几个点:

1. datachannel其实是可以直接传送blob的,但是只有ff支持,所以传data url

2. chrome下载是直接触发的,不会进行询问,firefox会先询问后下载,在询问过程中如果执行了revokeObjectURL,下载就会取消,囧

升级

如我们所知,WebRTC最有特点的地方其实是可以传输getUserMedia获得的视频、音频流,来实现视频聊天。但事实上我们的使用习惯来看,一般人不会一开始就打开视频聊天,而且视频聊天时很消耗内存的(32位机上一个连接至少20M左右好像,也有可能有出入)。所以常见的需求是,先建立一个包含datachannel的连接用于传输数据,然后在需要时升级成可以传输视频、音频。

看看我们之前传输的session description,它其实来自Session Description Protocol。可以看到wiki上的介绍:

这意味着什么呢?我们之前建立datachannel是没有加视频、音频流的,而这个流的描述是写在SDP里面的。现在我们需要传输视频、音频,就需要添加这些描述。所以就得重新获得SDP,然后构建offer和answer再传输一次。传输的流程和之前一样,没什么区别。但这一次,我们不需要传输任何的ice candidate,这里我曾经遇到了坑,经过国外大大的点拨才明白过来。

Peertc

我将datachannel和websocket组合,实现了一个构建点对点连接的库Peertc,它提供非常简洁的方式来建立连接和发送数据、文件和视频/音频流,详情见github。走过路过的记得star一下哦,有什么bug也非常希望能够提出来。

最后

WebRTC的点对点方式能够运用在很多场景:

- 如web qq这种Web IM工具,这就不说了

- 如象棋这种双人对战 游戏 ,每一步的数据服务器时不关心的,所以完全可以点对点发送

- 一对一在线面试、在线教育,这其实是即时通信的一个业务方向

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
万宁到连云港龙洞优选线路推荐 烟台到南京多远多少公里:距离762公里 762km是多少公里 连云港自驾游到北京国子监路费多少 螃蟹横行霸道是被逼无奈 帝国时代3 第6关把莉丝的美国土著朋友带回附近的岛怎么完成?那个土著... 帝国时代3亚洲王朝那个大国怎么召唤土著部落 组装电脑论坛哪个好电脑组装论坛都有哪些 推荐哪个网站的笔记本电脑好笔记本电脑在哪里买比较好 电脑diy网上哪个靠谱有哪些可靠的电脑DIY网站 想用html5实现一个随机视频聊天网站,需要学习哪些技术? 《病娇拯救计划》txt下载在线阅读全文,求百度网盘云资源 食药监局到幼儿园一般检查什么 被投诉了,食药局的过来,会检查食品许可证吗 摄政王是病娇百度网盘在线 软件工程师工作总结 建设工程监理员怎么考证? 执业医师各个单元考什么 《陈情令》完结 魏无羡最终结局如何 《陈情令》魏无羡结局如何 为了避免水管被冻坏怎样放水 告别耳鸣耳聋,只需一招轻松搞定? 失眠人士上网求助秒睡方法…这一堆刚看完就睡着了 撕扯指甲油一定要用亮油吗 涂指甲油是先打亮甲油还是免洗封层? 梦见欺诈什么意思 美甲涂过指甲油跟亮油了贴钻后用涂亮油吗 头部耳朵疼痛怎么回事 十六周了还是吐的厉害 现在16周多了还是想吐的感觉,但是在肚子最下面感觉到动了。腰好痛是怎么回事 要一份关于HTML5静态网页源代码,交作业用,用DIV+CSS布局 未有其比的其是什么意思?,未有其比的比 水浴蛋糕可以用铁盆烤嘛 不锈钢盆烤蛋糕烤多长时间 不锈钢盆烤蛋糕烤多久时间 蜂蜜的作用与功效详细介绍 《病娇夫人》txt下载在线阅读全文,求百度网盘云资源 西门子wincc组态画面可以在运行时截屏画面么?用wincc的一个软按钮来操作,谢谢大家了,谢谢 西门子200如何用梯形图编程求1bite里面有几个bit为1? 求截图分享,谢谢 杀手机病毒的软件 谁知道西门子机锁了怎么解除。谢谢! 西门子SX1被锁死,该如何解锁?二水货手机。 西门子SX1手机解锁指令!跪求 西门子SF65手机怎么自拍呀? 魏是什么意思 魏是啥意思 我下个月准备去国外旅游,在国外期间可以用我的手机登录支付宝账号吗?会不会因为IP问题被封账号? 谁有这张图片的高清版,做QQ名片用 玉米棒不扒包叶就煮着吃行吗 建设银行自己弄的信用卡封面能换吗? 请帮我解析一下二胡曲《山村变了样》 二胡曲<山村变了样>中的华彩段演奏技巧
  • 焦点

最新推荐

猜你喜欢

热门推荐