想开发一款带有视频通话/共享屏幕功能的产品?那WebRTC是你必须要知道的!

作为一名技术爱好者,我总是对各种协议、各种功能感兴趣,两周前我想为我的开源项目ChatCraft集成视频通话功能,我就开始了对应技术的研究,然后我盯上了WebRTC。在这个研究过程中,我恶补了大量有关WebRTC的知识,并在最后,成功实现了视频通话功能。我想,我这次尝试值得分享。所以就这样……如果你还感兴趣,那就继续看下去吧!

这篇文章是实战的前置文章,在这篇文章中一起来学习WebRTC的相关知识吧!

什么是WebRTC

网页即时通信(Web Real-Time Communication),是一个支持浏览器(不局限于浏览器,例如在App中使用,只需要自己实现音频、视频的采集,传输即可)进行实时语音对话或视频对话的API。简单来说,有了WebRTC我们可以通过一些简单的API就可以给浏览器和App提供实时通信(RTC)的功能。
而在 WebRTC 推出之前,开发实时音视频交互应用的成本高昂且技术挑战多·,包括音视频编解码、数据传输、延迟、丢包、抖动、回声处理…等问题。现在就简单了,例如视频通话时,音频因为环境或其他问题导致的有噪声、回声干扰,如果不做处理,用户体验会很差,而WebRTC提供了 3A 算法 + NetEQ,让实时环境中的声音处理及互动体验得到了大幅的提升。

WebRTC主要用来做什么

WebRTC是不局限于浏览器的,只要使用设备的IP链接可到达,且符合WebRTC规范的就可以互相连接。所以,能应用的领域就非常多。举几个现在常见的例子:

  • 共享桌面
  • 视频/语音聊天
  • 视频会议
  • 云端游戏
  • P2P网络加速

看到这里,相信你已经对WebRTC有了一个最基础的基本概念了,知道它会出现在什么应用场景下,如果你还感兴趣的话,那就让我们揭开它神秘的面纱吧!

在WebRTC中发生了什么?

让我来通过一个场景小故事,告诉你在WebRTC中发生了什么~

故事开头: 从前,在一个数字世界里,有两个神秘的实体,它们分别被命名为A和B。A是一位智慧的编码者,B则是一位梦想的解码者。

过程: A和B都拥有着珍贵的信息,但它们需要一种安全的方式来分享这些信息。于是,A开始寻找通向B的神秘通道。它穿越虚拟的网络山川,寻找能够连接到B的公共路径。A仔细检查自己的数字身份,确保自己可以被其他实体识别。同时,它还检查了自己的数字路由器,确保可以传递信息给B。

与此同时,B也在为这次神秘相遇做准备。它同样寻找通向A的路径,准备好自己的数字身份和路由器。A和B收集了大量信息,包括加密方式、安全参数和视频编解码器,这些信息构成了他们的“SDP”。

结尾: 最终,A和B通过一种数字化的方式传递了会话信息。这个方式可以是通过电子邮件、虚拟信使,甚至是通过传送门。WebRTC并不关心具体的传递方式,只要信息能够从A到B,它们就可以开始他们的数字通信之旅。一旦A和B交换了SDP,它们就像魔法般实现了真正的点对点通信。不再需要第三方干涉,它们可以直接建立连接,分享彼此的智慧和梦想。最终,A和B通过最优的数字路径找到了彼此,这就是WebRTC的神奇之处。

WebSocket和WebRTC的区别是什么?

熟悉WebSocket的朋友到这里就会发现了,好像他们都是转发消息。如果你也这么想,那恭喜你,你已经熟悉了WebRTC的一小点部分。WebRTC其实也使用了WebSocket,用于搭建WebRTC的信令机制,但是因为WebRTC是端到端连接,在WebSocket连接建立结束后,就不再需要额外服务器。那它们之间到底有什么区别呢?我们分别从设计理念和实现区别来看。

  • 设计理念
    • WebSocket主要用于IM聊天应用。
    • WebRTC是为高质量音视频实时通信设计的。
  • 实际区别
    • WebRTC使用UDP协议,而WebSocket使用TCP协议。
    • WebRTC提供的浏览器端到端通信比WebSocket提供的服务延迟更低。

WebRTC用到了哪些技术?

WebRTC其实就是一组其他技术的集合体,这里面包含了许许多多的协议、技术点,想在文章中分析完所有的技术点不太现实,我们来讲点关键的!

NAT(Network Address Translation)

网络地址转换,这个技术相信大部分看文章的朋友都有在大学期间学习过,用来解决IPv4地址短缺的问题。所谓的网络地址转换,就是把内网地址转换成可以访问外网的地址。那和WebRTC有什么关系呢?关系大了!WebRTC是P2P方式,我们需要找到对方的ip,点对点的连接。如果对方有一个公开的IP地址,那么连接过程将不会有什么问题。因为会像连接一个网页服务一样,把端口和IP都提供给对方后,我们和它就可以直接进行连接了。但在大多数情况下,它都是隐藏在公共网络之后的,我们无法直接连接。

对NAT网络地址转换的运行原理感兴趣的朋友可以自行学习,就不在本文展开了。

NAT 的转换方式主要有四种,而WebRTC默认支持三种网络扩展的方式,对其他的方式并不友好,且大部分的网络地址转换都是通过以下三种方式:

  • 一对一 NAT(完全圆锥型 NAT)
  • IP 受限型 NAT
  • 端口受限型 NAT
STUN和TURN

而网络地址转换过程主要依赖于两种协议,即会话穿越工具(STUN)和中继NAT穿越工具(TURN)。

STUN服务器的作用是帮助设备发现自己的公网IP地址和端口。它是非常轻量级的,通常位于公共网络上,并且有一个简单的任务:就是检查终端传入请求的IP地址(躲在NAT后面的程序),并将该地址作为响应发送回去。这个过程使得WebRTC A端为自己获得一个可公开访问的地址,然后通过信令机制将其传递给B端(或其他端)以建立直接链接。

然而,STUN不能在所有情况下都工作,特别是当NAT防火墙的策略比较严格时,例如在刚才讲NAT的时候没有提到的第四种方式——对称 NAT(Symmetric NAT),在这种环境下必须使用 TURN!TURN服务器实际上扮演了媒体流的中继角色,将数据从发送端传到接收端。这代表着:所有的通信内容都要经过 TURN 服务器的转发,导致TURN服务器的维护成本比较高,所以我们可以发现,基本上没有免费给用户使用的TURN服务器。

想创建TURN服务器可以参考: https://github.com/coturn/coturn

ICE框架

当客户端和服务端媒体协商完成后,需要开始建立网络连接,它会STUN和TRUN协议完成工作。之后,我们就会从A端到B端之间的路径有了非常多的选择,ICE框架就是为了更好的处理这些路径而提出的。ICE会获取所有可用的通信路径,并将其作为"候选者"。这些路径可能包括本地IP地址以及STUN和TURN服务器提供的地址等。然后,ICE将收集到的所有地址放入SDP(会话描述协议) 中,并将其发送到对方。对方通过解析SDP来了解我们提供的重要信息。

SDP

在前面我们说到了SDP(会话描述协议),那它的作用主要是什么呢?SDP只是一种数据格式,而且它是WebRTC中最重要的几个概念之一。它的设计目的是将用户产生的SDP送至其他端,怎么发送的它不管,当A端想要开始一个通话时,它就会创建一个包含了自己可接受的媒体格式、网络信息、安全选项和其他信息的offer,然后发送给B端。收到offer的B端会回复一个answer,包含了它决定使用的媒体和网络参数。我们开发者也可以自定义SDP的内容。

信令交换

如果看了SDP交换的过程图,那大家一定看到了中间的信令,信令其实就是一个转发服务,将一个设备端产生的SDP通过某种方式传递给想要通信的那方,大部分使用websocket或socket服务。其实啥方式都不重要,能将SDP信息传递给另外一方就可以了。

一个典型的WebRTC通信流程

知道了WebRTC大部分的技术,那一个典型的WebRTC通信流程就出现了!

看到这里,我相信你对WebRTC已经有了初步了解了,那么在下一篇WebRTC的系列文章中,我们来实现一个可以多端视频/语音电话的功能吧!

关于我

Hello,我是Taxze,如果您觉得文章对您有价值,希望您能给我的文章点个❤️,有问题需要联系我的话:我在这里 ,也可以通过掘金的新的私信功能联系到我。如果您觉得文章还差了那么点东西,也请通过关注督促我写出更好的文章~万一哪天我进步了呢?😝

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

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

相关文章

Golang错误处理机制

文章目录 Golang错误处理机制panic异常recover捕获异常自定义错误 Golang错误处理机制 panic异常 panic异常 Go的类型系统会在编译时捕获很多错误,但有些错误只能在运行时检查,比如除零错误、数组访问越界、空指针引用等,这些运行时错误会引…

上位机图像处理和嵌入式模块部署(树莓派4b进行自动化测试)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 硬件、软件功能开发ok只是产品开发的第一步。怎么做到自动化测试、保证产品质量才是关键。很多时候,我们给客户提供了功能,…

Leetcode-17.04. 消失的数字

面试题 17.04. 消失的数字 - 力扣(LeetCode)https://leetcode.cn/problems/missing-number-lcci/ 目录 面试题 17.04. 消失的数字 - 力扣(LeetCode) 题目 解题(注释) 第一种方法 第二种方法 第三种方法 题目 数组nums包含…

73、栈-柱状图中最大的矩形

思路: 矩形面积:宽度*高度 高度如何确定呢?就是在宽度中最矮的元素。如何确定宽度,就是要确定左右边界。 当我们在处理直方图最大矩形面积问题时,遇到一个比栈顶柱子矮的新柱子时开始计算面积的原因关键在于如何确定…

医院手术室麻醉信息管理系统源码 自动生成麻醉的各种医疗文书(手术风险评估表、手术安全核查表)

目录 手术风险评估表 一、患者基本信息 二、既往病史 三、手术相关信息 四、风险评估因素 五、风险评估结果 手术安全核查表 一、患者身份与手术信息核对 二、术前准备核查 三、手术团队与职责确认 四、手术物品与设备核查 五、术中关键步骤核查 六、术后核查 七…

远程桌面的端口配置与优化

在现代企业环境中,远程桌面连接已成为日常工作中不可或缺的一部分。然而,随着网络攻击的增加,确保远程桌面连接的安全性变得尤为重要。其中一个关键的安全因素是端口配置。 一、远程桌面默认端口 远程桌面协议(RDP)默…

亚马逊关键字搜索商品列表API接口:探索海量商品的利器

亚马逊关键字搜索商品列表API接口允许开发者通过输入关键字或特定参数,在亚马逊平台上进行商品搜索,并返回符合搜索条件的商品列表信息。这些信息包括商品的标题、图片、价格、评价等,为商家、开发者以及市场分析师提供了丰富的商品数据支持。…

docker里部署SpringBoot项目,访问不到扬声器,如何解决??

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

# 从浅入深 学习 SpringCloud 微服务架构(七)Hystrix(1)

从浅入深 学习 SpringCloud 微服务架构(七)Hystrix(1) 一、Hystrix:基于 RestTemplate 的熔断配置 1、Hystrix 介绍: 1)Hystrix 是由 Netflix 开源的一个延迟和容错库, 用于隔离访…

《21天学通C++》(第十二章)运算符类型与运算符重载

1.为什么要重载运算符&#xff1f; 通过重载运算符&#xff0c;可以将复杂的操作封装成简单的运算符形式&#xff0c;简化代码&#xff0c;提高可读性下面举一个简单的例子 计算两个点的坐标之和。 1.不重载运算符 #include <iostream> using namespace std; class P…

GCB | 陆地生态系统C:N:P化学计量对降水变化的响应

西北农林科技大学水保学院上官周平研究员团队在陆地生态系统C:N:P化学计量对降水变化的响应方面取得新进展&#xff0c;并以“C:N:P stoichiometry of plants, soils, and microorganisms: Response to altered precipitation”为题发表在国际生态环境领域著名期刊Global Chang…

AI发展势头强劲,或许会催生这些职业!

AI&#xff08;人工智能&#xff09;的发展正在并将继续催生多种新的职业&#xff0c;这些职业通常与AI的设计、开发、测试、部署、监管、维护以及与其互动和应用相关。 按照现在AI发展的趋势来看&#xff0c;可预测的一些新兴职业大概有下面这些&#xff1a; 当然以上只是一些…

中职数字化校园网络建设

中职&#xff08;职校&#xff09;数字化校园的校园网建设立足于职业教育、职业学校的特点&#xff0c;充分注意到信息技术的飞速发展、通信成本的迅速降低的特点。在规划和建设校园网时&#xff0c;遵循以下原则&#xff1a; 采用通用和成熟的技术&#xff1a;采用通用的、成熟…

【国产NI替代】NI-9235 10 kS/s/ch,120 Ω四分之一桥应变计,8通道C系列应变/桥输入模块

10 kS/s/ch&#xff0c;120 Ω四分之一桥应变计&#xff0c;8通道C系列应变/桥输入模块 NI‑9235可同步测量所有通道的动态应变&#xff0c;从而实现了高速同步测量。 该功能对于需要在特定时刻对多个通道进行比较的应用&#xff08;例如冲击测试&#xff09;非常重要。\n\nNI…

算法入门ABC

前言 初学算法时真的觉得这东西晦涩难懂&#xff0c;貌似毫无用处&#xff01;后来的后来&#xff0c;终于渐渐明白搞懂算法背后的核心思想&#xff0c;能让你写出更加优雅的代码。就像一首歌唱的那样&#xff1a;后来&#xff0c;我总算学会了如何去爱&#xff0c;可惜你早已远…

【漏洞复现】若依druid 未授权访问漏洞

0x01 产品简介 若依&#xff08;Ruoyi&#xff09;框架是一款基于Spring Boot、Spring Cloud、OAuth2与JWT鉴权等核心技术的快速开发平台。它支持多种安全框架和持久化框架&#xff0c;并采用前后端分离的模式进行开发&#xff0c;具备高度的灵活性和可扩展性。若依框架提供了…

C语言指针和数组的一些笔试题

文章目录 前言一、一维数组二、字符数组-1三、字符数组-2总结 前言 C语言指针和数组的一些笔试题 一、一维数组 #include <stdio.h> int main() {int a[] { 1,2,3,4 };printf("%d\n", sizeof(a));printf("%d\n", sizeof(a 0));printf("%d\n…

经典网络解读——Efficientnet

论文&#xff1a;EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks&#xff08;2019.5&#xff09; 作者&#xff1a;Mingxing Tan, Quoc V. Le 链接&#xff1a;https://arxiv.org/abs/1905.11946 代码&#xff1a;https://github.com/tensorflow/t…

【笔试训练】day15

1.平方数 水题直接看代码 代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include<math.h> #include<algorithm> using namespace std; typedef long long ll; int main() {ll x;cin >> x;ll a sqrt(x);if (abs(a * a -…

git 配置相关

问题一&#xff1a;ssh-keygen -t ed25519 -C "Gitee SSH Key" 这个命令中的 ed25519 字符是什么意思&#xff1f; ssh-keygen 是一个用于生成SSH密钥的工具&#xff0c;SSH&#xff08;Secure Shell&#xff09;是一种网络协议&#xff0c;用于加密方式远程登录和其…