前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【WebRTC】WebRTC学习总结

【WebRTC】WebRTC学习总结

作者头像
pingan8787
发布于 2020-05-14 09:20:37
发布于 2020-05-14 09:20:37
3.8K00
代码可运行
举报
文章被收录于专栏:前端自习课前端自习课
运行总次数:0
代码可运行

来源 | 掘金 作者:Nirvana-cn 排版 | 前端时空

WebRTC (Web Real-Time Communications)

WebRTC 是一项「实时通讯技术」,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输。WebRTC包含的这些标准使用户在无需安装任何插件或者第三方的软件的情况下,创建点对点(Peer-to-Peer)的数据分享和电话会议成为可能。本篇文章从自身实践出发,结合相关代码,总结WebRTC实现的基本流程。

1. 引言

首先我们先看《WebRTC权威指南》上给出的流程图,从这张图,我们要明确两件事:

  • 第一,通信双方需要先通过服务器交换一些信息
  • 第二,完成信息交换后,通信双方将直接进行连接以传输数据

然后我们再介绍一下WebRTC中的专有名词,方便读者对下文的理解。

  • RTCPeerConnection:核心对象,每一个连接对象都需要新建该对象
  • SDP(Session Description Protocol,会话描述协议):包含建立连接的一些必要信息,比如IP地址等,sdp由RTCPeerConnection对象方法创建,我们目前不需要知道该对象中的具体内容,使用黑盒传输即可
  • ICE(Interactive Connectivity Establishment,交互式连接建立技术):用户之间建立连接的方式,用来选取用户之间最佳的连接方式

2. WebRTC实现流程

以下代码不能直接运行,因为我这里并没有实现「信令服务器」,如何实现信令服务器可自由选择(比如,socket.io、websocket等)。首先发起方获取视频流,如果成功,则新建「RTCPeerConnection对象」,然后创建offer,并发送给应答方。

  • addStream方法将getUserMedia方法中获取的流(stream)添加到RTCPeerConnection对象中,以进行传输
  • onaddStream事件用来监听通道中新加入的流,通过e.stream获取
  • onicecandidate事件用来寻找合适的ICE
  • createOffer()是RTCPeerConnection对象自带的方法,用来创建offer,创建成功后调用setLocalDescription方法将localDescription设置为offer,localDescription即为我们需要发送给应答方的sdp
  • sendOffer和sendCandidate方法是自定义方法,用来将数据发送给服务器
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 引入<script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>脚本
// 提升浏览器兼容性
var localConnection
var constraints={
    audio:false,
    video:true
}
navigator.mediaDevices.getUserMedia(constraints).then(handleSuccess).catch(handleError)
function handleSuccess(stream) {
  document.getElementById("video").srcObject = stream
  localConnection=new RTCPeerConnection()
  localConnection.addStream(stream)
  localConnection.onaddstream=function(e) {
    console.log('获得应答方的视频流' + e.stream)
  }
  localConnection.onicecandidate=function(event){
    if(event.candidate){
        sendCandidate(event.candidate)
    }
  }
  localConnection.createOffer().then((offer)=>{
    localConnection.setLocalDescription(offer).then(sendOffer)
  })
}

同样的,接收方也需要新建一个RTCPeerConnection对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var remoteConnection
var constraints={
    audio:false,
    video:true
    }
}
navigator.mediaDevices.getUserMedia(constraints).then(handleSuccess).catch(handleError)
function handleSuccess(stream) {
  document.getElementById("video").srcObject = stream
  remoteConnection=new RTCPeerConnection()
  remoteConnection.addStream(stream)
  remoteConnection.onaddstream=function(e) {
    console.log('获得发起方的视频流' + e.stream)
  }
  remoteConnection.onicecandidate=function(event){
      if(event.candidate){
          sendCandidate(event.candidate)
      }
  }
}

当应答方收到发起方发送的offer之后,调用setRemoteDescription设置RTCPeerConnection对象的remoteDescription属性,设置成功之后调用createAnswer方法,创建answer成功之后将其设置为localDescription,然后把answer发送给服务器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let desc=new RTCSessionDescription(sdp)
remoteConnection.setRemoteDescription(desc).then(function() {
    remoteConnection.createAnswer().then((answer)=>{
        remoteConnection.setLocalDescription(answer).then(sendAnswer)
    })
})

当发起方收到应答方发送的answer之后,将其设置为remoteDescription,至此WebRTC连接完成。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let desc=new RTCSessionDescription(sdp)
localConnection.setRemoteDescription(desc).then(()=>{console.log('Peer Connection Success')})

此时虽然WebRTC连接已经完成,但是通信双方还不能直接通信,因为发送的ICE还没有处理,通信双方还没有确定最优的连接方式。应答方收到发起方发送的ICE数据时,调用RTCPeerConnection对象的addIceCandidate方法。remoteConnection.addIceCandidate(new RTCIceCandidate(ice))复制代码发起方收到应答方发送的ICE数据时,同样调用RTCPeerConnection对象的addIceCandidate方法。localConnection.addIceCandidate(new RTCIceCandidate(ice))

至此,一个最简单的WebRTC连接已经建立完成。

3. 数据通道

WebRTC擅长进行数据传输,不仅仅是音频和视频流,还包括我们希望的任何数据类型,相比于复杂的数据交换过程,创建一个数据通道这个主要功能已经在RTCDataConnection对象中实现了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var peerConnection = new RTCPeerConnection();
var dataChannel = peerConnection.createDataChannel("label",dataChannelOptions);

WebRTC会处理好所有的事情,包括浏览器内部层。浏览器通过一系列的事件来通知应用程序,当前数据通道所处的状态。ondatachannel事件会通知RTCPeerConnection对象,RTCDataChannel对象本身在开启、关闭、发生错误或者接收到消息时会触发对应的事件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dataChannel.onerror = function (error){
    console.log(error)
}

dataChannel.onmessage = function (event){
    console.log(event.data)
}

dataChannel.onopen = function (error){
    console.log('data channel opened')
    // 当创建一个数据通道后,你必须等onopen事件触发后才能发送消息
    dataChannel.send('Hello world')
}

dataChannel.onclose = function (error){
    console.log('data channel closed')
}

数据通道datachannel建立的过程略微不同于建立视频流或音频流双向连接,offer、answer、ice处理完毕之后,由一方发起请求即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
localConnection = new RTCPeerConnection();

sendChannel = localConnection.createDataChannel("sendChannel");
sendChannel.onopen = handleSendChannelStatusChange;
sendChannel.onclose = handleSendChannelStatusChange;

接收方此时并不需要再次调用createDataChannel方法,只需要监听RTCPeerConnection实例对象上的ondatachannel事件就可以在回调中拿到发送方的请求,数据通道就建立起来了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
remoteConnection = new RTCPeerConnection();
remoteConnection.ondatachannel = receiveChannelCallback;

function receiveChannelCallback(event) {
    receiveChannel = event.channel;
    receiveChannel.onmessage = handleReceiveMessage;
    receiveChannel.onopen = handleReceiveChannelStatusChange;
    receiveChannel.onclose = handleReceiveChannelStatusChange;
  }

dataChannelOptions传入的配置项是可选的,并且是一个普通的JavaScript对象,这些配置项可以使应用在UDP或者TCP的优势之间进行变化。

  • reliable:设置消息是否进行担保
  • ordered:设置消息的接受是否需要按照发送时的顺序
  • maxRetransmitTime:设置消息发送失败时,多久重新发送
  • maxRetransmits:设置消息发送失败时,最多重发次数
  • protocol:设置强制使用其他子协议,但当用户代理不支持该协议时会报错
  • negotiated:设置开发人员是否有责任在两边创建数据通道,还是浏览器自动完成这个步骤
  • id:设置通道的唯一标识

4. 文件共享

目前,数据通道支持如下类型:

  • String:JavaScript基本的字符串
  • Blob(binary large object):二进制大对象
  • ArrayBuffer:确定数组长度的数据类型
  • ArrayBufferView:基础的数组视图

其中,Blob类型是一个可以存储二进制文件的容器,结合HTML5相关文件读取API,可以实现文件共享的功能。

本文来源于网络,已注明原创作者及来源。如有侵权请联系删除。

END

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端自习课 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
解码陪玩系统连麦技术:从音频传输到实时交互
陪玩公众号 陪玩小程序陪玩app 陪玩平台源码 陪玩平台搭建 游戏陪玩源码 线上游戏陪玩源码 线上游戏平台搭建线上游戏代练系统 下线付费搭子源码 线下家政平台 线下家政源码线下预约服务源码 陪玩陪聊系统源码 陪玩平台搭建 游戏陪玩系统,线上游戏开黑陪玩
菜鸟指南
2025/04/24
1020
解码陪玩系统连麦技术:从音频传输到实时交互
WebRTC学习笔记——建立连接
1.WebRTC简介 WebRTC是一个开源的项目,可以提供浏览器,手机应用之间实时通信能力。 同时,这一功能已经内置于现代浏览器中,所以它可以做到无须借助第三方软件或插件便可以在开发网络中传输高质量
IMWeb前端团队
2017/12/29
2.1K0
WebRTC学习笔记——建立连接
抛弃websocket,前端直接打通信道,webRTC搭建音视频聊天
什么是WebRTC? 众所周知,浏览器本身不支持相互之间直接建立信道进行通信,都是通过服务器进行中转。比如现在有两个客户端,甲和乙,他们俩想要通信,首先需要甲和服务器、乙和服务器之间建立信道。甲给乙发送消息时,甲先将消息发送到服务器上,服务器对甲的消息进行中转,发送到乙处,反过来也是一样。这样甲与乙之间的一次消息要通过两段信道,通信的效率同时受制于这两段信道的带宽。同时这样的信道并不适合数据流的传输,如何建立浏览器之间的点对点传输,一直困扰着开发者。WebRTC应运而生 WebRTC是一个开源项目,旨在
李海彬
2018/03/27
7.5K0
抛弃websocket,前端直接打通信道,webRTC搭建音视频聊天
【从头到脚】前端实现多人视频聊天— WebRTC 实战(多人篇)
这是 WebRTC 系列的第三篇文章,主要讲多人点对点连接。如果你对 WebRTC 还不太了解,推荐阅读我之前的文章。
陈大鱼头
2020/04/16
5.9K0
【从头到脚】前端实现多人视频聊天— WebRTC 实战(多人篇)
实践:《从头到脚撸一个多人视频聊天 — 前端 WebRTC 实战)》
请先阅读原文,链接:从头到脚撸一个多人视频聊天 — 前端 WebRTC 实战(一),本文只涉及实践过程中的问题
申君健
2019/03/21
1.6K0
【开发日记】使用WebRTC实现类微信的实时音视频通话
需要使用uni-app技术开发一个类似微信一样的实时音视频通话功能,经过大量的调研和尝试,最终有存在两个方案:第一个方案是使用WebRTC技术实现P2P点对点实时通信;第二个方案是使用现成的阿里、腾讯、声网等平台相关产品。
全栈开发日记
2024/11/23
4910
【开发日记】使用WebRTC实现类微信的实时音视频通话
音视频通信加餐 —— WebRTC一肝到底
最近需要搭建一个在线课堂的直播平台,考虑到清晰度和延迟性,我们一致认为使用 WebRTC 最合适。
杨成功
2022/09/22
1.1K0
音视频通信加餐 —— WebRTC一肝到底
webRtc实践总结
场景 业务上有这样的一个场景,这是一个游戏直播会场,需要把手机上面的游戏画面,投屏到大屏幕上面,不仅如此可能还需要加一些其他信息例如比赛信息或者logo赞助等等,只使用设备本身投屏就不能满足现在的述求,说白了在大屏之上我们需要一个自定义的游戏视频画面。 image.png 技术抽象 业务是这样的类似场景,具体实践是使用electron的客户端实现:主窗口采集的视频,投放大屏窗口中。 核心代码功能解析 需要实现两个窗口实例 需要实现视频传输 解决方案 electron是支持获取屏幕实例的api的,并且在不同
吴文周
2022/03/09
1.1K0
webRtc实践总结
Web前端WebRTC攻略(一) 基础介绍
随着互联网高速发展,以及即将到来的5G时代,WebRTC作为前端互动直播和实时音视频的利器,也是将前端开发者们不可错过的学习领域。如果你现在只是听过而已,那你可能要好好学习一番。 01  什么是WebRTC? WebRTC 全称是(Web browsers with Real-Time Communications (RTC) 大概2011年,谷歌收购了 GIPS,它是一个为 RTC 开发出许多组件的公司,例如编解码和回声消除技术。Google 开源了 GIPS 开发的技术,并希望将其打造为行业标准。 收
用户1097444
2022/06/29
2.6K0
Web前端WebRTC攻略(一) 基础介绍
WebRTC介绍及简单应用
WebRTC介绍及简单应用 WebRTC,即Web Real-Time Communication,web实时通信技术。简单地说就是在web浏览器里面引入实时通信,包括音视频通话等。 WebRTC
用户1141560
2017/12/25
6.2K0
【开发日记】使用WebRTC实现类微信的实时音视频通话
需要使用uni-app技术开发一个类似微信一样的实时音视频通话功能,经过大量的调研和尝试,最终有存在两个方案:第一个方案是使用WebRTC技术实现P2P点对点实时通信;第二个方案是使用现成的阿里、腾讯、声网等平台相关产品。
全栈开发日记
2024/11/14
4210
【开发日记】使用WebRTC实现类微信的实时音视频通话
WebRTC实现p2p视频通话
简介 目的 帮助自己了解webrtc 实现端对端通信 # 使用流程 git clone https://gitee.com/wjj0720/webrtc.git cd ./webRTC npm i npm run dev # 访问 127.0.0.1:3003/test-1.html 演示h5媒体流捕获 # 访问 127.0.0.1:3003/local.html 演示rtc 本地传输 # 访问 127.0.0.1:3003/p2p.html 演示局域网端对端视屏
random_wang
2019/10/22
6.8K0
WebRTC实现p2p视频通话
WebRTC 前端实时通信技术
江天德
2017/09/21
4.7K1
WebRTC 前端实时通信技术
【教程】如何使用Javascript构建WebRTC视频直播?
WebRTC是一个免费的开源项目,它通过简单的API为浏览器和移动应用程序提供实时通信功能。本文将向你展示WebRTC的基本概念和功能,并指导你使用Node.js构建自己的WebRTC视频直播。
TSINGSEE青犀视频
2021/04/12
4.4K0
零基础入门:基于开源WebRTC,从0到1实现实时音视频聊天功能
本文由微医云技术团队前端工程师张宇航分享,原题“从0到1打造一个 WebRTC 应用”,有修订和改动。
JackJiang
2021/08/24
3.8K0
详解WebRTC——网页实时通信技术
运用RTCPeerConnection和RTCDataChannel两个核心API,能够实现任意数据的点对点交换,官网Demo如下:
Kevinylzhao
2018/06/22
3.6K0
详解WebRTC——网页实时通信技术
【项目实战】基于 WebRTC 的音视频在线监考模块的设计与实现(下)
在上一篇博文 【复】基于 WebRTC 的音视频在线监考模块的设计与实现(上) 中,主要介绍了关于 WebRTC 的基本理论,那么这篇文章我们将进入实战阶段,通过 WebRTC 框架,去实现 P2P 通话,以及延伸到一对多的音视频通话,从而实现在线监考功能;
sidiot
2023/08/31
4750
【项目实战】基于 WebRTC 的音视频在线监考模块的设计与实现(下)
永久免费H5直播点播播放器SkeyeWebPlayer.js实现webrtc流播放
永久免费H5直播点播播放器SkeyeWebPlayer.js实现webrtc流播放1、H5播放webrtc,现在各大浏览器已经逐渐加大对WebRTC技术的支持,成都视开信息科技视频团队开发webrtc视频播放方案,我们已经实现了webrtc的视频推流,播放webrtc流。this.pc = new RTCPeerConnection(null);this.pc.ontrack = (event) => { this._mediaElement['srcObject'] = event.streams[
Openskeye
2023/04/24
1.2K0
JavaScript 是如何工作的:WebRTC 和对等网络的机制!
WebRTC,名称源自网页即时通信(英语:Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的API。
前端小智@大迁世界
2019/03/15
2.4K0
JavaScript 是如何工作的:WebRTC 和对等网络的机制!
通过WebRTC进行实时通信-通过RTCPeerConnection传输视频
RTCPeerConnection 是调用WebRTC传输音视频和交换数据的API。这个例子是在同一个页面中两个RTCPeerConnection对象之间建立连接。没有什么实际价值,但却能很好的证明RTCPeerConnection是如何工作的。
音视频_李超
2020/04/02
5.6K0
推荐阅读
相关推荐
解码陪玩系统连麦技术:从音频传输到实时交互
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验