问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

手把手教你使用WebRTC

发布网友 发布时间:2024-09-26 08:59

我来回答

1个回答

热心网友 时间:2024-10-04 14:11

WebRTC可以实现实时通信,他可以直接建立两个浏览器之间点对点的连接,在连接中实时传输媒体流和任何数据。这就非常适合进行屏幕共享。

WebRTC使用起来还是挺复杂的,具体的介绍MDN非常详细,不过网上各种,信令服务器,ICE,SDP,NAT的介绍弄得我晕头转向,所以我就找到一个简单的Demo,通过这个Demo来理解怎么使用。

一、创建RTCPeer

首先我们模拟创建两个pc端。直接通过RTCPeerConnection创建就好。

//创建两个PeerConnection模拟两个客户端,pc1相当于本地,pc2相当于远端constpc1=newRTCPeerConnection();constpc2=newRTCPeerConnection();二、交换ICE

WebRTC使用了ICE(交互式连接设施)的框架协议,在建立连接之前两个客户端需要互相交换,简单的说就是交换网络信息,告知两个客户端互相的地址。

//交换ICE候选//可以理解为通知pc2连接pc1的地址pc1.onicecandidate=e=>{pc2.addIceCandidate(e.candidate);};//可以理解为通知pc1接pc2地址pc2.onicecandidate=e=>{pc1.addIceCandidate(e.candidate);};三、交换SDP

WebRTC使用了SDP(会话描述协议)去交换两端的媒体信息,比如说分辨率格式等信息,主要是交换双方的Offer和Answer,这两个信息叫做提议(Offer)和应答(Answer)非常的形象。

//设置offer和answer,可理解为通知两边另一边的编解码等媒体信息//1.pc1创建offerpc1.createOffer(displayMediaOptions).then(desc=>{//2.pc1设置offerpc1.setLocalDescription(desc)//3.pc2设置offerpc2.setRemoteDescription(desc)//4.pc2创建answerpc2.createAnswer().then(answerDesc=>{//5.pc2设置answerpc2.setLocalDescription(answerDesc)//6.pc1设置answerpc1.setRemoteDescription(answerDesc)})})

这里双方做的事就是存下自己的信息,然后发送和接收对方的Offer或Answer。步骤如下图所示。

四、添加媒体

最后还有两件简单的事情需要处理,一个是添加需要传输的媒体,还有就是监听到媒体后使用video去播放。

//将需要传输的流添加给PeerConnectionstream.getTracks().forEach(track=>pc1.addTrack(track,stream));//远端接收到流,交给video去播放pc2.ontrack=event=>{if(videoTag.srcObject!==event.streams[0]){videoTag.srcObject=event.streams[0];}};

通过上面的这四个简单步骤我们实现了WebRTC最简单的一个实例。然后有的同学就会有质疑了,你这是在一个浏览器页面下进行的传输,作为端对端的传输能不能在两个页面下分别创建pc1和pc2?

五、信令服务器

经过了解,WebRTC只会负责端对端的连接,中间的数据传输,控制传输给谁,和谁建立连接都是他不管的,所以需要我们自己去传输。

通过WebSocket来把pc1和pc2之间的信息传递一下。然后就有了以下伪代码。这里只演示交换ICE候选,交换SDP同理。

PC1的代码:

constpc1=newRTCPeerConnection();constsocket=你创建的socket连接//交换ICE候选pc1.onicecandidate=e=>{socket.emit('ice的信息',e.candidate)};socket.on('ice的信息',data=>{pc1.addIceCandidate(data);})

PC2的代码:

constpc2=newRTCPeerConnection();constsocket=你创建的socket连接//交换ICE候选pc2.onicecandidate=e=>{socket.emit('ice的信息',e.candidate)};socket.on('ice的信息',data=>{pc2.addIceCandidate(data);})

看起来很简单不过经过测试后发现连不通,打印出传输后的消息发现传输后的消息都变成了普通对象。

然而在传输前他是一个RTCIceCandidate的对象

通过查阅API我们可以在传输后实例化这个对象就可以连接了。

newRTCIceCandidate(data)

下图就是我们所需要进行的所有信息的传输步骤。

其实我们WebSocket做的事情在WebRTC中被叫做信令服务器,信令就是双方发送的所有信息,你可以通过任何形式传输这些信息,WebSocket也好Http请求也可以,因为信令服务器不需要理解这些中间信息,也不需要做额外的处理,唯一要做的就是把信息带到另外一方。

六、一对多实现

WebRTC只是一对一两端之间的通信,但是我们存在一对多的需求,不过这种需求量挺小的,所以我们采取了最简单的办法就是同一个客户端创建多个WebRTC。但是在业内也有更加优秀的解决方案,使用SFUServer让服务器去模拟一个客户端与每个客户端之间建立联系,帮客户端分担压力,这样就把通讯压力放在了我们可控的服务端上了。效果如下图所示。

在继续优化你可以使用MCUServer的方案,在服务器合并多路连接。

具体内容可以看这篇文章的讲解。

七、NAT穿透

最后在项目提测前夕有发现一个大问题,之前开发两个浏览器端都是一台机测试,然后在两台设备上试了下发现一直连接不上,后来了解到是NAT和防火墙的原因导致双方无法通信。

WebRTC使用的ICE整合了STUN和TURN,STUN服务可以获取客户端的公网IP和端口,如果使用STUN依然无法建立连接就需要用到,TURN服务,可以中继所有的数据来绕过NAT。google提供了免费的STUN服务器,不过也可以自己搭建,搭建的话可以了解一下coturn。在WebRTC上配置对应的服务也非常简单。

constpc=newRTCPeerConnection({//可以传入多个stun服务器或者turn服务器iceServers:[{url:'stun:stun.l.google.com:19302'},{url:'stun:stun1.l.google.com:19302'}]})原文:https://juejin.cn/post/7097142990036008968
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
DJ是什么、说好点、别从什么一战开讲、就说是干什么的、或具体指什么... 吴金龙人物简介 四川华西医院微信上怎么挂号 奔驰r350空调高压接口在哪里 奔驰r300空调高压接头在哪里 嘉媚乐神采美目精油15m多少钱 在word里输日期的时候想打大写的零,而不是阿拉伯数字的... 上坟烧纸地时候碑里面雕刻字的裂开咯一大角怎么办 北京中兴天瑞科技有限公司主要产品 怎么除皮革的甲醛能过欧标 木童家具除味剂产品介绍 Android端向SRS服务器推送WebRTC流 男人变心是因为女人变形这句话说的对吗 好像男女交往的潜规则,大家都不... 怎样查高中的学籍档案号码? 怎么查询自己档案的工种编码 如何查询自己的档案号 西野加奈的会いたくて会いたくて的日语歌词和国语翻译 中级会计证可以做哪些工作 考完中级后可以做什么工作 360借条手机账号注销以后,还可以继续登录吗? 输错了好多次1400分钟后再试,绑定了我以前朋友的身份证,现在联系不上他... 一千四百分钟是多少小时 面包车第四年应交多少钱强险 请问在哪里可以下载到itune软件。苹果手机用的,最好能直接给个网站... itune同步不了铃声。我用别的软件可以和苹果手机同步铃声,但保存不了多... 请问大家,苹果电脑上苹果系统,可以用什么软件听歌最好,出了itune 美国买房,买土地有永久权,为什么中国最多买七十年 怎么鉴定陨石钻石的真伪 陨石钻石的鉴定方法 金立手机s6能插u盘吗 语文阅读理解,帮帮忙,不清楚可以重拍的,文章叫 默读父亲 陈勇的《电工学电子技术同步辅导及习题全解》是什么时候出版的? 电工学电子技术同步辅导及习题全解涵盖哪些章节内容? 电工与电子技术简明教程内容简介 电工技术与电子技术基础图书简介 以前用着挺正常的,现在除了极速模式其他模式都打不开网页,而且用ie浏览... ...用chrome极速模式上网,兼容模式打不开网页。而且qq上点击空间的那个... l浏览器打不能正常开网页了,换了好几种浏览器都不行,也试着安装了flish... ...浏览器的极速模式也行,但是兼容模式和IE9模式也不行怎么办?_百度知 ... ...是萝卜家园XP系统,然后怎么安装,还有电脑系统坏了,这个系统怎么安装... xp系统萝卜家园安装完驱动然后就一直稍等,重启后还是安装驱动一直这样... 大同公园公交线路 大同古城-和阳门地址在哪里? 1990年10月29子时出生,姓龙,男,安什么名最好 - 百度 1975年10月29日晚上子时出生女运势 孩子2010.10.29 0:48出生 男孩。。给分析分析,谢谢 新加坡社会通行证可以变更吗 ...年度过了3门是不是可以评完中级,在拿去评高级职称 职称计算机考试证书会不会过期,成绩有效期是多久 计算机专业高级职称考试都通过了,要评高级职称,还需要有5年中级的限... 什么习惯对心脏有害 在生活中能做些什么来保护心脏