一文学会使用WebRTC API

news2024/11/26 3:21:20

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 offer
  peerConnection.setRemoteDescription(offer)
    .then(function() {
      // 创建 SDP answer
      return 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.coloradmin.cn/o/1101238.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【分享】教你加速访问GitHub,进来学!

哈喽,大家好,木易巷来啦! 众所周知,Github是一款程序猿必备的代码托管平台,上面已经存在了无数前辈的心血!经常需要在上面查看大佬写的一些好用的开源项目,无赖国外网站的速度实在让人难以接受。…

【linux】重定向+缓冲区

重定向缓冲区 1.重定向1.1重定向本质1.2重定向接口1.3重定向分类1.3.1>输出重定向1.3.2>>追加重定向1.3.3<输入重定向 2.理解 >&#xff0c; >>&#xff0c; <3.如何理解linux下一切皆文件4.缓冲区4.1理解缓冲区问题4.1.1为什么要有缓冲区4.1.2缓冲区刷…

php获取10年内的年份并加入下拉列表

要实现的效果 在html中内嵌php循环将数组中的年份加入下拉列表 <div class="form-group"><label>年份:</label><div class="input-group"><div class="input-group-prepend"><span class="input-group-te…

7天狂揽 1.3w star 的 MetaGPT,他们的目标让软件公司为之一惊

在 AI 产品爆炸的今天&#xff0c;拥有各种本领的 AI 产品层出不穷&#xff0c;但 MetaGPT 的出现仍然显的格外耀眼&#xff0c;其可以实现只输入单一 prompt&#xff0c;就可以输出需求分析、需求文档、技术架构、最终代码等等产物&#xff0c;这相当于一个开发团队的输出成果…

012 Spring Boot + Vue 电影购票系统

部分代码地址&#xff1a; https://github.com/XinChennn/xc012-movie Spring Boot Vue 电影购票系统 一、项目结构 网上购票后台管理客服模块 二、环境介绍 后端&#xff1a;SpringBoot SpringSecurity MyBatis-Plus前端&#xff1a;Vue ElementUi数据库&#xff1a;…

mongodb如何多表查询,如同时查询店铺以及里面对应的商品

多表查询场景介绍 一种很常见的场景&#xff0c;比如电商首页中&#xff0c;需要同时展示最近比较火热的店铺&#xff0c;以及直接展示店铺里对应的商品。或者用户下单之后购物车里可以看到所选的商品以及对应的店铺。如果不知道如何用mongodb自带的查询语句快速查询的话&#…

有限差分法

目录 1.原理介绍 1.1 有限差分法介绍 1.2 有限差分法步骤 2.案例分析 2.1 问题重述 2.2 问题求解 1.原理介绍 1.1 有限差分法介绍 有限差分法是一种常用的数值计算方法&#xff0c;用于求解偏微分方程或常微分方程的数值解。它的基本思想是将连续的空间区域离散化为有限…

mac电脑安装雷蛇管理软件,实现调整鼠标dpi,移动速度,灯光等

雷蛇官网只给了win版本驱动 mac版本驱动到这里下载: GitHub - 1kc/razer-macos: Color effects manager for Razer devices for macOS. Supports High Sierra (10.13) to Monterey (12.0). Made by the community, based on openrazer. 安装后会显示开发者不明,请丢弃到垃圾桶.…

Java:SpringBoot整合Spring Batch示例

目录 文档基础概念Tasklet方式示例Chunk方式示例参考文章 文档 https://docs.spring.io/spring-batch/docs/4.3.9/reference/html/index.html 基础概念 JobLauncher&#xff1a;作业启动器&#xff0c;启动作业的入口。对应的实现类为SimpleJobLauncher。Job&#xff1a;作业…

PLC通过Modbus转Profinet网关连接变频器控制电机配置案例

在本案例中&#xff0c;通过使用Modbus转Profinet网关&#xff08;XD-MDPN100&#xff09;&#xff0c;PLC可以通过Profinet协议与变频器进行通信和控制。这样&#xff0c;PLC可以实现对电机的转速调节、启停控制等功能。 同时&#xff0c;通过Modbus转Profinet&#xff08;XD-…

你还在为协同办公烦恼吗?试试视频协同办公吧!

在这个信息化、数字化的时代&#xff0c;协同办公已经成为了企业、团队的必备工具。然而&#xff0c;尽管传统的协同办公工具有诸多优点&#xff0c;但在实际使用中&#xff0c;仍会遇到各种各样的问题。你是否还在为这些问题而烦恼&#xff1f;别担心&#xff0c;让我们一起探…

【C++】函数重载 引用 内联函数

目录 一&#xff0c;函数重载 1&#xff0c;函数重载的概念 2&#xff0c;C支持函数重载的原理 二&#xff0c;引用 1&#xff0c;引用概念 2&#xff0c;引用特性 3&#xff0c;常引用 4&#xff0c;做参数 5&#xff0c;做返回值 6&#xff0c;传值、传引用效率比较…

【LeetCode(LeetCode刷题经典一百题)】:移动零

给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums [0] 输出: [0] 方…

python二次开发CATIA:全约束草图

​约束的创建需要用到 Sketch 下面 Constraints 这个 Collection 的 Add 方法。该对象创建约束有三个方法&#xff1a;AddMonoEltCst&#xff0c; AddBiEltCst&#xff0c; AddTriEltCst&#xff0c;对应的功能分别为为单个元素创建约束&#xff08;如固定 a&#xff09; 、为两…

RHCE8 资料整理(一)

RHCE8 资料整理 第一篇 基本配置第1章 安装RHEL8第2章 基本命令的使用2.1 终端设置2.2 输入命令的语法2.3 介绍shell2.4 用户切换 第3章 了解linux分区及常用命令3.1 路径3.2 创建和删除目录3.3 cd3.4 拷贝和剪切3.5 常见命令归纳filewctouchlnalias/unaliascat/tac/nlmore/les…

世界粮食日:宏工科技有对策,赋能食品生产高效可持续发展

10月16日是世界粮食日。随着全球人口的增长&#xff0c;人们对高品质食品的需求也越来越大&#xff0c;如何实现“更好生产、更好营养”成为了食品生产与供应的重要话题。15年来&#xff0c;宏工科技专注物料处理自动化领域&#xff0c;提供食品物料处理一站式解决方案以提高生…

数字孪生技术如何提高化工生产安全性?

随着科技的不断进步&#xff0c;数字孪生技术已经渗透到了各个领域&#xff0c;为化工行业带来了翻天覆地的变革。这一技术的应用不仅在生产效率方面发挥了积极作用&#xff0c;还在安全性、创新、环保和可持续性等多个方面作出了巨大的贡献。 化工行业常常涉及危险品和复杂的生…

网络安全行业需要考哪些证书

一、NISP国家信息安全水平证书 国家信息安全水平考试&#xff08;National Information Security Test Program&#xff0c;简称NISP&#xff09;&#xff0c;是由中国信息安全测评中心实施培养国家网络空间安全人才的项目。由国家网络空间安全人才培养基地运营/管理&#xff…

vue3 电子签名实现

vue电子签名可以通过vue-esign插件来实现: 第一步安装&#xff1a; npm install vue-esign 引用方式&#xff1a; 全局&#xff1a; 局部&#xff1a; // .vue 文件 import vueEsign form vue-esign 使用方式&#xff1a; <template><!-- 使用这个签名组件 --&…

WampServer下载安装并结合cpolar内网穿透实现本地服务的公网访问

文章目录 前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 Wamp 是一个 Windows系统下的 Apache PHP Mysql 集成安装环境&#xff0c;是一组常用来…