实时通信的方式——WebRTC

文章目录

  • 基于WebRTC实现音视频通话
    • P2P通信原理
      • 如何发现对方?
    • 不同的音视频编解码能力如何沟通?(媒体协商SDP)
      • 如何联系上对方?(网络协商)
  • 常用的API
    • 音视频采集getUserMedia
    • 核心对象RTCPeerConnection

WebRTC (Web Real-Time Communications) 是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输。

基于WebRTC实现音视频通话

背景: 随着互联网技术的飞速发展,实时音视频通话已经成为在线教育、远程办公、社交媒体等领域的核心且常用的功能。WebRTC(Web Real-Time Communication)作为一项开放的实时通信标准,为开发者提供了快速构建实时音视频通话系统的能力。在本课程中,我们将从0到1使用 WebRTC构建一个基于P2P 架构的音视频通话的应用案例。

应用场景:

  • 点对点视频聊天:如 微信视频 等实时视频通话应用。
  • 多人视频会议:企业级多人视频会议系统,如飞书、钉钉、腾讯会议等。
  • 在线教育:如腾讯课堂、网易云课堂等。
  • 直播:游戏直播、课程直播等。

P2P通信原理

传统通信方式:一个客户端发个消息给服务端,服务端转发给目标客户端

P2P点对点通信:不需要依赖服务器,两个客户端可以直接进行通信,但也并不是完全不需要 不依赖服务器,还需要一个(跟踪服务器 好像是这个名字) 服务器去交换一些元数据。

要实现两个客户端的实时音视频通信 并且这两个客户端可能处于不同的网络环境,使用不同的设备,都需要解决哪些问题?

主要是下面这三个问题:

  • 如何发现对方?
  • 不同的音视频编码能力如何沟通?
  • 如何联系上对方

如何发现对方?

在 P2P 通信的过程中,双方需要交换一些元数据比如媒体信息、网络数据等等信息,我们通常称这一过程叫做”信令(signaling) "。

对应的服务器即“信令服务器(signaling server)",通常也有人将之称为“房间服务器”,因为它不仅可以交换彼此的媒体信息和网络信息,同样也可以管理房间信息。

比如:

1)通知彼此 who 加入了房间;

2)who 离开了房间

3)告诉第三方房间人数是否已满是否可以加入房间。

为了避免出现冗余,并最大限度地提高与已有技术的兼容性,WebRTC标准并没有规定信令方法和协议。在本课程中会使用websocket来搭建一个信令服务器

不同的音视频编解码能力如何沟通?(媒体协商SDP)

不同浏览器对于音视频的编解码能力是不同的。

比如:以日常生活中的例子来讲,小李会讲汉语和英语,而小王会讲汉语和法语。为了保证双方都可以正确的理解

对方的意思,最简单的办法即取他们都会的语言,也就是汉语来沟通。

在 WebRTC 中:有一个专门的协议,称为 Session Description Protocol(SDP),可以用于描述上述这类信息。

因此:参与音视频通讯的双方想要了解对方支持的媒体格式,必须要交换SDP 信息。而交换 SDP 的过程,通常称之为 媒体协商

如何联系上对方?(网络协商)

其实就是网络协商的过程,即参与音视频实时通信的双方要了解彼此的网络情况,这样才有可能找到一条相互通讯的链路。

理想的网络情况是每个客户端都有自己的私有公网IP 地址,这样的话就可以直接进行点对点连接。实际上呢,出于网络安全和其他原因的考虑,大多数客户端之间都是在某个局域网内(比如说公司内网),需要 网络地址转换(NAT)

在 WebRTC中我们使用 ICE 机制建立网络连接。ICE 协议通过一系列的技术(如 STUN、TURN服务器)帮助通信双方发现和协商可用的公共网络地址,从而实现 NAT 穿越。(通信双方找到能联系上对方的IP地址

ICE 的工作原理如下:

1.首先,通信双方收集本地网络地址(包括私有地址和公共地址)以及通过STUN和TURN 服务器获取的候选地址。

2.接下来,双方通过信令服务器交换这些候选地址。

3.通信双方使用这些候选地址进行连接测试,确定最佳的可用地址。

4.一旦找到可用的地址,通信双方就可以开始实时音视频通话。

在WebRTC中,网络信息通常用candidate来描述

针对上面三个问题的总结:就是通过 WebRTC 提供的 API 获取各端的媒体信息SDP 以及 网络信息 candidate并通过信令服务器交换,进而建立了两端的连接通道完成实时视频语音通话。

常用的API

音视频采集getUserMedia

const getLocalStream= async =>{const  stream=await navigator.mediaDevices.getUserMedia({//获取音视频流,获取到声音和画面 传入两个参数audio:true,video:true})localVideo.value!.srcObject=stream//进行音视频的播放localVideo.value.play()return stream
}

核心对象RTCPeerConnection

RTCPeerConnection作为创建点对点连接的API,是我们实现音视频实时通信的关键

//核心对象RTCPeerConnection
const peer=new RTCPeerConnection({//构造函数的配置,这里和上面的知识点关联起来(网络协商里面的两个服务)iceServers:[{url:"stun:stun.l.google.com:19302"},//谷歌的公共服务{urls:"turn:***",credential:"***",username:"***",},]
})

主要会用到以下爱几个方法:

媒体协商方法:

通过下面这些方法去生成上面的媒体信息SDP和网络信息candidate

  • createOffer
  • createAnswer
  • setLocalDesccription
  • setRemoteDesccription

重要事件:

  • onicecandidate
  • onaddstream

整个媒体协商过程可以简化为三个步骤对应上述四个媒体协商方法:

  1. 呼叫端创建 Offer(createOffer)井将 offer 消息(内容是呼叫端的 SDP 信息)通过 信令服务器 传送给接收端,同时调用 setLocalDesccription 将含有本地JSDP 信息的 Offer 保存起来
  2. 接收端收到对端的 Offer 信息后调用 setRemoteDesccription 方法将含有对端 SDP 信息的 Offer 保存起来,并创建 Answer(createAnswer)并将 Answer 消息(内容是接收端的 SDP 信息)通过信令服务器传送给呼叫端
  3. 呼叫端收到对端的 Answer 信息后调用 setRemoteDesccription 方法将含有对端 SDP 信息的 Answer 保存起来

交换candidate信息的过程:

经经过上述三个步骤,则完成了 P2P 通信过程中的媒体协商部分,实际上在呼叫端以及接收端调用setLocalDesccription 同时也开始了收集各端自己的网络信息(candidate),然后各端通过监听事件onicecandidate 收集到各自的 candidate 并通过信令服务器传送给对端,进而打通 P2P 通信的网络通道,并通过监听 onaddstream 事件拿到对方的视频流进而完成了整个视频通话过程。

完整的通信过程图如下:

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

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

相关文章

Web开发学习总结

学习路线 Web 全球广域网,也称为万维网(www World Wide Web),能够通过浏览器访问的网站 初识Web前端 Web标准也称为网页标准,由一系列的标准组成,大部分由W3C(World Wide Web Consortium,万维网联盟)负责制定。三个组…

用例篇

弱网测试 弱网测试的目的是尽可能保证用户体验,关注的关键点包括: 页面响应时间是否可以接受,关注包括哦热启动、冷启动时间、页面切换、前后台切换、首字时间,首屏时间等。页面呈现是否完成一致。超时文案是否符合定义&#xf…

CSS浮动(CSS从入门到精通学习第四天)

css第04天 一、其他样式 1、圆角边框 在 CSS3 中,新增了圆角边框样式,这样我们的盒子就可以变圆角了。 border-radius 属性用于设置元素的外边框圆角。 语法: border-radius:length; 参数值可以为数值或百分比的形式如果是正方形&…

K8S认证|CKA题库+答案| 15. 备份还原Etcd

目录 15、 备份还原Etcd CKA v1.29.0模拟系统 下载试用 题目: 开始操作: 1)、切换集群 2)、登录master并提权 3)、备份Etcd现有数据 4)、验证备份数据快照 5)、查看节点和Pod状态 6&#xff0…

linux下的openssh简介(centos 8)

目录 1. 简介2. 安装 OpenSSH3. 配置 OpenSSH 服务器3.1 服务器配置文件配置文件的详解 3.2 安全操作——修改 SSH 端口3.3 安全操作——禁止 root 登录3.4 安全操作——密钥认证3.5 安全操作——禁止密码认证 4. 配置 OpenSSH 客户端4.0 常用命令4.0.1 ssh常用命令4.0.2 scp常…

Java进阶学习笔记11——多态

什么是多态? 多态是在继承/实现情况下一种现象,表现为:对象多态和行为多态。 同一个对象,在不同时刻表现出来的不同形态。 多态的前提: 要有继承/实现关系 要有方法的重写 要有父类引用指向子类对象。 多态的具体代码…

使用 LangFuse 意外被挂马!我是怎么恢复系统稳定的?

在使用 LangFuse 过程中,被意外挂马!通过一番折腾服务恢复正常~ 本文将详细介绍应对恶意脚本和进程的完整方案,包括识别、清理、恢复和预防步骤。 阿里云扫到的信息 被执行的 Base64 SUlaQnRTCmV4ZWMgJj4vZGV2L251bGwKSUhDa0hQbmQ9Li8uJChkYXRlfG1kNXN1bXxoZWFkIC1jMjApCl…

Value-Based Reinforcement Learning(1)

Action-Value Functions Discounted Return(未来的reward,由于未来存在不确定性,所以未来的reward 要乘以进行打折) 这里的依赖actions ,和states 这里 Policy Function : ,表达了action的随机性 S…

创新实训2024.05.26日志:服务端接口实现——用户开启多个会话

1. 概念图 类似于Kimi,文心一言,chatGPT等市面上主流的大模型,我们的大模型也支持同一个用户的多个会话,并且提供支持联系上下文给出解答的能力。 2. 基于会话的对话 在langchain chatchat这个对langchain框架进行二次封装的第三…

vulnhub靶场之FunBox-8

一.环境搭建 1.靶场描述 Its a box for beginners and can be pwned in the lunch break. This works better with VirtualBox rather than VMware 2.靶场下载 Funbox: Lunchbreaker ~ VulnHub 3.靶场启动 二.信息收集 1.寻找靶场真实IP地址 nmap -sP 192.168.2.0/24 arp-…

html中被忽略的简单标签

1&#xff1a; alt的作用是在图片不能显示时的提示信息 <img src"https://img.xunfei.cn/mall/dev/ifly-mall-vip- service/business/vip/common/202404071019208761.jp" alt"提示信息" width"100px" height"100px" /> 2&#…

嵌入式进阶——震动马达

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 原理图控制分析功能设计 原理图 控制分析 S8050 NPN三极管特性 NPN型三极管的工作原理是基于PN结和PNP型晶体管的工作原理。 当外…

【qt】QTreeWidget 树形组件

QTreeWidget 树形组件 一.什么是树形组件二.界面设计树形组件三.代码实现1.清空2.设置列数3.设置头标签4.添加根目录①QTreeWidgetitem②设置文本③设置图标④添加为顶层目录 5.添加子目录①初始化为父目录②子目录添加到父目录③获取到子目录 四.插入目录1.获取当前选中目录项…

部署PIM-SM

拓扑图 配置 使能组播路由 配置OSPF 组播路由器接口配置pim-sm 连接组成员的接口使能igmp pim路由器上配置静态RP sysname AR1 # multicast routing-enable # interface GigabitEthernet0/0/0ip address 10.1.12.1 255.255.255.0 pim sm # interface GigabitEthernet0/0/…

flutter项目运行报错Exception: Gradle task assembleDebug failed with exit code 1各种报错合集

1.报错 Launching lib/main.dart on sdk gphone64 arm64 in debug mode... Running Gradle task assembleDebug... Exception in thread "main" java.net.ConnectException: Operation timed out at java.base/sun.nio.ch.Net.connect0(Native Method) at j…

云动态摘要 2024-05-26

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [免费试用]大模型知识引擎体验招募 腾讯云 2024-05-21 大模型知识引擎产品全新上线&#xff0c;为回馈新老客户&#xff0c;50万token免费送&#xff0c;开通服务即领取&#xff01; 云服…

【学习心得】回归任务的评估指标决定系数R^2

一、决定系数是什么&#xff1f; scikit-learn库在进行回归任务的时候&#xff0c;进行模型评估时的score()方法&#xff0c;默认采取的是计算的是决定系数&#xff08;Coefficient of Determination&#xff09;&#xff0c;通常表示为得分。这个值衡量了模型预测值与实际观测…

【开源可视化报表设计器】借力实现高效率流程化办公!

进行数字化转型、实现流程化办公&#xff0c;这些应该是目前很多企业都想要实现的目标吧。那么&#xff0c;利用什么样的软件平台可以实现&#xff1f;低代码技术平台拥有可视化界面、灵活操作、好维护等众多优势特点&#xff0c;可以借助低代码技术平台、开源可视化报表设计器…

游戏缺失steam_api64.dll的修复方法,快速解决游戏启动问题

在现代科技发展的时代&#xff0c;电脑已经成为我们生活中不可或缺的一部分。然而&#xff0c;在使用电脑的过程中&#xff0c;我们经常会遇到一些常见的问题&#xff0c;其中之一就是找不到某个特定的动态链接库文件&#xff0c;比如steamapi64.dll。这个问题可能会导致某些应…