一文学会使用WebRTC API

WebRTC(Web Real-Time Communication)是一项开放标准和技术集合,由 W3CIETF 等组织共同推动和维护,旨在通过Web浏览器实现实时通信媒体流传输。WebRTC于2011年6月1日开源并在Google、Mozilla、Opera支持下被纳入万维网联盟的W3C推荐标准,其提供了一组API和协议,使开发者能够在浏览器中构建实时音视频通信、数据传输和协作应用。目前WebRTC已得到包括主流的Web浏览器(如Chrome、Firefox、Safari)和移动设备平台的广泛的支持和应用。

  • WebRTC API 简介
  • WebRTC SDP状态机
  • WebRTC API 使用——媒体流传输
  • WebRTC API 使用——DataChannel

一、API 简介

WebRTC(Web Real-Time Communication)提供了一组丰富的 API 方法,用于在浏览器中实现实时通信。这些 API 方法涵盖了音视频捕获、连接建立、媒体流传输和数据传输等方面。下面是对 WebRTC 中一些核心 API 方法的详细介绍,并提供了相应的使用示例:

WebRTC API 使用

  • 呼叫端通过 navigator.mediaDevices.getUserMedia()捕捉本地媒体;
  • 呼叫端创建一个RTCPeerConnection 并调用 RTCPeerConnection.addTrack()
  • 呼叫端调用 RTCPeerConnection.createOffer()来创建一个提议 (offer);
  • 呼叫端调用 RTCPeerConnection.setLocalDescription()将提议 (Offer) 设置为本地描述 (即,连接的本地描述);
  • 呼叫端请求 STUN 服务创建 ice 候选 (ice candidates);
  • 呼叫端通过信令服务器(如 websocket)将提议 (offer) 传递至接收端
  • 接收端收到了提议 (offer) 并调用 RTCPeerConnection.setRemoteDescription() 将其记录为远程描述 (也就是连接的另一端的描述);
  • 接收端捕获本地媒体,通过RTCPeerConnection.addTrack()添加到连接中;
  • 接收端通过 RTCPeerConnection.createAnswer() 创建一个应答;
  • 接收端调用 RTCPeerConnection.setLocalDescription() 将应答 (answer) 设置为本地描述。此时,接收端已经获知连接双方的配置了。
  • 接收端通过信令服务器(如 websocket)将应答传递到呼叫端
  • 呼叫端接受到应答。
  • 呼叫端调用 RTCPeerConnection.setRemoteDescription()将应答设定为远程描述。如此,呼叫端已经获知连接双方的配置了。

二、会话描述状态机

JSEP是一种用于在WebRTC应用程序中建立和管理通信会话的机制,其由RFC8829 JSEP:规范,定义了JavaScript API和信令交换的规范,以便在浏览器之间建立点对点的实时通信。

通过JSEP规范,我们可以了解到WebRTC SDP 会话描述状态机:

RFC8829 JSEP 状态机

  • 呼叫端通过调用 createOffer API 来创建提议 (offer);
  • 呼叫端使用这个 offer 通过 setLocalDescription API 来设置其本地配置;
  • 呼叫端通过信令服务器(如 websocket)将提议 (offer) 传递至接收端

为了完成 offer/answer 交换:

  • 接收端收到了提议 (offer) 并调用 setRemoteDescription() 将其记录为远程描述;
  • 接收端使用 createAnswer API 生成应答 (answer) ,使用 setLocalDescription API 来应用answer;
  • 接收端通过信令服务器(如 websocket)将应答传递到呼叫端

呼叫端接受到应答:

  • 呼叫端调用 RTCPeerConnection.setRemoteDescription()将应答设定为远程描述,完成初始化。

三、WebRTC API 使用——媒体流传输

  1. navigator.mediaDevices.getUserMedia(constraints)

    • 描述:请求访问音视频设备并获取本地媒体。
    • 示例:
navigator.mediaDevices.getUserMedia({ video: true, audio: true }).then(function(stream) {// 处理获取到的媒体流}).catch(function(error) {// 处理错误});
  1. RTCPeerConnection(configuration)

    • 描述:创建一个 PeerConnection 对象,用于建立和管理点对点连接。
    • 示例:
var configuration = { iceServers: [{ urls: '192.168.1.1:19302' }] };
var peerConnection = new RTCPeerConnection(configuration);
  1. peerConnection.addTrack(track, stream)

    • 描述:将音视频轨道添加到 PeerConnection 中。
    • 示例:
var localStream = await navigator.mediaDevices.getUserMedia({ video: true, audio: true });
localStream.getTracks().forEach(function(track) {peerConnection.addTrack(track, localStream);
});
  1. peerConnection.createOffer(options)

    • 描述:创建一个SDP提议 (offer),用于发起连接。
    • 示例:
peerConnection.createOffer().then(function(offer) {return peerConnection.setLocalDescription(offer);}).then(function() {// 将 SDP offer 发送给远程端}).catch(function(error) {// 处理错误});
  1. peerConnection.setLocalDescription(description)

    • 描述:将本地描述设置为提供的 SDP(Session Description Protocol)对象。
    • 示例:
var localDescription = // 从信令服务器获取的本地描述信息
peerConnection.setLocalDescription(localDescription)
  1. peerConnection.setRemoteDescription(description)

    • 描述:将远程描述设置为提供的 SDP 对象。
    • 示例:
var remoteDescription = // 从信令服务器获取的远程描述信息
peerConnection.setRemoteDescription(remoteDescription)
  1. peerConnection.addIceCandidate(candidate)

    • 描述:将 ICE(Interactive Connectivity Establishment)候选项添加到 PeerConnection 中。
    • 示例:
var iceCandidate = // 从信令服务器获取的 ICE 候选项
peerConnection.addIceCandidate(iceCandidate)
  1. peerConnection.ontrack

    • 描述:当远程端添加媒体轨道时触发的事件处理函数。
    • 示例:
peerConnection.ontrack = function(event) {var remoteVideo = document.getElementById('remoteVideo');remoteVideo.srcObject = event.streams[0];
};
  1. peerConnection.onicecandidate

    • 描述:当 ICE 候选项可用时触发的事件处理函数。
    • 示例:
peerConnection.onicecandidate = function(event) {if (event.candidate) {// 将 ICE 候选项发送给远程端}
};
  1. peerConnection.onconnectionstatechange

    • 描述:当 PeerConnection 的连接状态发生变化时触发的事件处理函数。
    • 示例:
peerConnection.onconnectionstatechange = function(event) {if (peerConnection.connectionState === 'connected') {// 连接已建立} else if (peerConnection.connectionState === 'disconnected') {// 连接已断开} else if (peerConnection.connectionState === 'failed') {// 连接失败}
};

四、DataChannel

要在两个 WebRTC 端点之间直接传输非媒体流信息,需要使用 DataChannel API。DataChannel 允许在两个对等连接之间传输任意类型的数据,包括文本、图片等数据内容。
下面是一个使用 WebRTC DataChannel 在两个端点之间发送文字内容的详细代码实现:

  1. 发送端代码(例如浏览器 A):
// 创建 PeerConnection
var peerConnection = new RTCPeerConnection();
// 创建 DataChannel
var dataChannel = peerConnection.createDataChannel('textChannel');
// 事件处理:当 DataChannel 开启时
dataChannel.onopen = function() {// 发送文字内容dataChannel.send('Hello, WebRTC DataChannel!');
};// 事件处理:当 DataChannel 收到消息时
dataChannel.onmessage = function(event) {var receivedMessage = event.data;console.log('Received message:', receivedMessage);
};// 创建 SDP offer
peerConnection.createOffer().then(function(offer) {return peerConnection.setLocalDescription(offer);}).then(function() {// 将 SDP offer 发送给远程端var offer = peerConnection.localDescription;// 发送 offer 给远程端,例如通过信令服务器}).catch(function(error) {console.error('Error creating offer:', error);});
  1. 接收端代码(例如浏览器 B):
// 创建 PeerConnection
var peerConnection = new RTCPeerConnection();// 事件处理:当收到来自远程端的 SDP offer 时
function handleOffer(offer) {// 设置远程描述为 SDP offerpeerConnection.setRemoteDescription(offer).then(function() {// 创建 SDP answerreturn peerConnection.createAnswer();}).then(function(answer) {return peerConnection.setLocalDescription(answer);}).then(function() {// 将 SDP answer 发送给远程端var answer = peerConnection.localDescription;// 发送 answer 给远程端,例如通过信令服务器}).catch(function(error) {console.error('Error creating or setting local description:', error);});
}// 事件处理:当 PeerConnection 收到来自远程端的 DataChannel 时
peerConnection.ondatachannel = function(event) {var receivedDataChannel = event.channel;// 事件处理:当 DataChannel 开启时receivedDataChannel.onopen = function() {// 发送文字内容receivedDataChannel.send('Hi, WebRTC DataChannel!');};// 事件处理:当 DataChannel 收到消息时receivedDataChannel.onmessage = function(event) {var receivedMessage = event.data;console.log('Received message:', receivedMessage);};
};// 事件处理:当收到来自信令服务器的 SDP offer 时
var receivedOffer = // 从信令服务器获取的 SDP offer
handleOffer(receivedOffer);

在上述代码中,发送端创建了一个 DataChannel,并在 DataChannel 开启后发送文字内容。
接收端在 PeerConnection 上监听 “ondatachannel” 事件,当收到来自远程端的 DataChannel 时,设置相应的事件处理函数,并在 DataChannel 开启后发送文字内容。

参考:

W3C WebRTC API:
https://www.w3.org/TR/webrtc/

RFC8829 JSEP:
https://datatracker.ietf.org/doc/html/rfc8829

WebRTC API:
https://developer.mozilla.org/zh-CN/docs/Web/API/WebRTC_API

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/139206.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

校园智慧党建小程序源码系统 带完整的搭建教程

大家好啊,今天来给大家分享一款校园智慧党建小程序源码系统。一起来看看吧。以下是部分功能代码图: 系统特色功能一览: 智能化管理:采用人工智能、大数据、云计算等技术手段,实现自动化、智能化管理。例如&#xff0c…

Windows:Arduino IDE 开发环境配置【保姆级】

物联网开发学习笔记——目录索引 参考官网:Arduino - Home Arduino是一款简单易学且功能丰富的开源平台,包含硬件部分(各种型号的Arduino开发板)和软件部分(Arduino IDE)以及广大爱好者和专业人员共同搭建和维护的互联…

Python合并多个相交矩形框

Python合并多个相交矩形框 前言前提条件相关介绍实验环境Python合并多个相交矩形框代码实现 前言 由于本人水平有限,难免出现错漏,敬请批评改正。更多精彩内容,可点击进入Python日常小操作专栏、YOLO系列专栏、自然语言处理专栏或我的个人主页…

网页在线打开PDF_网站中在线查看PDF之pdf.js

一、pdf.js简介 PDF.js 是一个使用 HTML5 构建的便携式文档格式查看器。 pdf.js 是社区驱动的,并由 Mozilla 支持。我们的目标是为解析和呈现 PDF 创建一个通用的、基于 Web 标准的平台。 pdf.js 将 PDF 文档转换为 HTML5 Canvas 元素,并使用 JavaScr…

微信小程序引入阿里巴巴iconfont图标并使用

介绍 在小程序里,使用阿里巴巴的图标,如下所示: 使用方式 搜索自己需要的图标,然后将需要用到的图标加入购物车,如下图所示: 去右上角,点击购物车按钮;这里第一次使用,会有三个提…

Triple协议的隐式参数传递过程

前言 Dubbo 框架的 RPC 调用除了可以传递正常的接口参数外,还支持隐式参数传递。 隐式参数的传递依赖 RpcContext 对象,它持有一个 Map 对象,消费者往 Map 里写入数据,客户端在发起 RPC 调用前会构建 RpcInvocation,然…

华为eNSP配置专题-ACL的配置

文章目录 华为eNSP配置专题-ACL的配置1、前置环境1.1、宿主机1.2、eNSP模拟器 2、基本环境搭建2.1、基本终端构成和连接2.2、各终端基本配置2.2.1、PC1和PC2的配置2.2.2、模拟互联网的路由器的配置2.2.3、财务部服务器的配置2.2.4、路由器AR1的配置 2.3、让各网段能够ping通互联…

IDEA如何设置项目包名分级

按上面的勾选即可!

win 10怎么录屏?教你轻松捕捉屏幕活动

在当今科技快速发展的时代,录屏已成为信息分享、教学、游戏直播等方面的重要工具。无论是为了制作教程、分享游戏过程还是保存重要信息,录屏功能都发挥着举足轻重的作用。可是很多人不知道win 10怎么录屏,本文将详细介绍win10的三种常用录屏方…

Java前后端分离项目中跨域问题 讲解

Java前后端分离项目中跨域问题 讲解 前言什么是跨域问题?CORS解决跨域问题使用Servlet过滤器使用Spring Framework的CrossOrigin注解 总结 我是将军我一直都在,。! 前言 当在Java前后端分离项目中工作时,跨域问题是一个常见的挑战…

Spring中Setter注入详解

目录 一、setter注入是什么 二、setter注入详解 三、JDK内置类型注入方式 3.1 数组类型 3.2 set集合类型 3.3 list集合 3.4 map集合 3.5 properties类型 四、用户自定义类型 一、setter注入是什么 书接上回,我们发现在Spring配置文件中为类对象的属性赋值时&#x…

WebSocket学习笔记

一篇文章理解WebSocket原理 1.HTTP协议(半双工通信): HTTP是客户端向服务器发起请求,服务器返回响应给客户端的一种模式。 特点: 1.只能是客户端向服务器发起请求,是单向的。 2.服务器不能主动发送数据给客户端。 半双工通信…