WebRTC实现1对1音视频通信原理

什么是 WebRTC ?

WebRTC(Web Real-Time Communication)是 Google于2010以6829万美元从 Global IP Solutions 公司购买,并于2024年01月10日将其开源,旨在建立一个互联网浏览器间的实时通信的平台,让 WebRTC技术成为 H5标准之一。我们看官网(https://webrtc.org)的介绍

本文福利, 免费领取C++音视频学习资料包+学习路线大纲、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

其中:

  • Web Real-Time Communications (WEBRTC) W3C 组织:定义浏览器 API。
  • Real-Time Communication in Web-browsers (RTCWEB) IETF 标准组织:定义其所需的协议,数据,安全性等手段。

简单来说,WebRTC 是一个可以在 Web 应用程序中实现音频,视频和数据的实时通信的开源项目。在实时通信中,音视频的采集和处理是一个很复杂的过程。比如音视频流的编解码、降噪和回声消除等,但是在 WebRTC 中,这一切都交由浏览器的底层封装来完成。我们可以直接拿到优化后的媒体流,然后将其输出到本地屏幕和扬声器,或者转发给其对等端。

点对点音视频的难点

抛开低延迟、流畅性、回声消除和海量并发这些难点不讲,单纯从功能来看,打通通讯双方的两端,让彼此能正常视频及通话,主要存在两个问题:

(1)网络打通问题--无公网IP无法直接通信

当今互联网到处存在着一些中间件(MIddleBoxes),如NAT和防火墙,导致两个(不在同一内网)中的客户端无法直接通信。这些问题即便是到了IPV6时代也会存在,因为即使不需要NAT,但还有其他中间件如防火墙阻挡了链接的建立。

当今部署的中间件大多都是在C/S架构上设计的,其中相对隐匿的客户机主动向周知的服务端(拥有静态IP地址和DNS名称)发起链接请求。大多数中间件实现了一种非对称的通讯模型,即内网中的主机可以初始化对外的链接,而外网的主机却不能初始化对内网的链接,除非经过中间件管理员特殊配置。在中间件为常见的NAPT的情况下,内网中的客户端没有单独的公网IP地址,而是通过NAPT转换,和其他同一内网用户共享一个公网IP。

这种内网主机隐藏在中间件后的不可访问性对于一些客户端软件如浏览器来说并不是一个问题,因为其只需要初始化对外的链接,从某方面来看反而还对隐私保护有好处。然而在P2P应用中,内网主机(客户端)需要对另外的终端(Peer)直接建立链接,但是发起者和响应者可能在不同的中间件后面,两者都没有公网IP地址。而外部对NAT公网IP和端口主动的链接或数据都会因内网未请求被丢弃掉。对于WebRTC来说,首先要解决的是如果跨越NAT实现内网主机直接通讯的问题。

(2)媒体格式编码问题--媒体格式编码多样不统一

对于需要音视频通信的双方,彼此要了解对方支持的媒体格式才能正常地对流媒体编解码。比如,Peer­A端可支持VP8、H264多种编码格式,而Peer­B端支持VP9、H264,要保证二端都正确的编解码,最简单的办法就是取它们的交集H264。有一个专门的协议称为SDP(Session Description Protoco),可用于描述上述这类信息,在WebRTC中,参与视频通讯的双方必须先交换SDP信息,这样双方才能知根知底,而交换SDP的过程,也称为“媒体协商”

SDP(Session Description Protocol) 是一种会话描述协议,基于文本,其本身并不属于传输协议,需要依赖其它的传输协议(比如 SIP 和 HTTP)来交换必要的媒体信息,用于两个会话实体之间的媒体协商。SDP(会话描述协议)定义了一个标准,用于定义两个(通常)端与端之间媒体(通常是流媒体)交换的参数。IETF已将其发布为RFC 4566。SDP通常嵌入或封装在另一个协议中,最广泛使用的应用程序位于大多数IP电话应用程序的SIP协议内部。简单地说,SDP协议是媒体端到端对其接收规范和能力的声明;典型的声明会告诉我们:

(1)哪个IP地址准备好接收传入的媒体流

(2)哪个端口号正在侦听传入的媒体流

(3)端点希望接收的媒体类型(通常是音频)

(4)端点希望在哪个协议中交换信息(通常为RTP)

(5)端点能够解码的压缩编码(编解码器)

在一个典型的会话设置过程中,我们会看到两个端点参与一个会话,其中每个端点发送一个SDP以通知另一个端点其规范和功能。SDP本身不提供任何媒体,但仅限于协商一组兼容的媒体交换参数;媒体流本身由不同的通道和协议处理。

一个 SDP 的握手由一个 offer 和一个 answer 组成

WebRTC通话原理

点对点的双方为了实现实时音视频通信, WebRTC需要解决媒体协商和网络协商问题,这里要引入信令服务器(Signaling Server)和STUN server

Signaling Server

需要通信的双方之间建立WebRTC连接需要一个信令服务器来实现双方通过网络进行连接。信令服务器的作用是作为一个中间人帮助双方在尽可能少的暴露隐私的情况下建立连接。WebRTC并没有提供信令传递机制,信令的传递和交换需要服务器参与,这个角色就是信令服务器。WebRTC信令指建立、控制和终止通信会话的过程以及业务本身的需求来看,需要交换几个信息:媒体信息,网络信息,具体业务。

  • 一、媒体信息

需要媒体数据来确定呼叫者和被呼叫者共有的编解码器和媒体类型。如果尝试启动通信会话的端具有不同的分辨率和编解码器配置,则会话不太可能成功。通过使用会话描述协议(SDP)格式的提供和应答在对等方之间交换媒体配置信息的信令,这些信息是通过SDP协议描述出来,通过信令服务器中转的。

  • 二、网络信息

两个WebRTC客户端如何发现对方的?通过信令服务器交互双方在Internet上的位置(IP地址和端口),以便呼叫者可以找到被呼叫者。

  • 三、具体业务

会话控制信息确定何时初始化、关闭和修改通信会话,比如加入房间,离开房间,禁言,媒体流订阅发布等功能,需要信令服务器来控制。

STUN server

STUNSession Traversal Utilities for NAT,NAT会话穿越应用程序)是一种网络协议,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于NAT路由器之后的主机之间建立UDP通信。该协议由RFC 5389定义。STUN 是 C/S 模式的协议,可以简单理解为:由客户端发送 STUN 请求;STUN 服务响应,告知由 NAT 分配给主机的 IP 地址和端口号。一旦拥有了ip和端口,点对点通信的双方就能直连通信了。(注:以上的响应同时还使得STUN客户端能够确定正在使用的NAT类型——因为不同的NAT类型处理传入的UDP分组的方式是不同的。

专有名词介绍

Signaling Server :信令服务器,负责处理通信双方的信息交互,包括媒体信息,网络信息,业务信息。

STUN server:STUN的全称是Simple Traversal of User Datagram Protocol (UDP) Through Network Address Translators (NATs), 即穿越NAT的简单UDP传输,是一个轻量级的协议。可以简单理解为:由客户端发送 STUN 请求;STUN 服务响应,告知由 NAT 分配给主机的 IP 地址和端口号。

SDP:Session Description Protocol 为了连接到对端用户,我们必须要对其他用户的设备情况有所了解,比如音频视频的编码解码器、使用何种编码格式、使用何种网络、设备的数据处理能力,,而 SDP 为我们提供了这些功能

ICE:Interactive Connectivity Establishment 通信的两侧可能会处于不同的网络环境中,有时会存在好几层的访问控制、防火墙、路由跳转,所以我们需要一种方法在复杂的网络环境中找到对方,并且连接到相应的目标。WebRTC 使用了集成了 STUN、TURN 的 ICE 来进行双方的数据通信。

offer、answer:一个 SDP 的握手由一个 offer 和一个 answer 组成,一方发送offer,另一方接收到offer后,发送answer。

WebRTC音视频通信流程

在同一房间的双方通过WebRTC建立音视频通信,主要分为四个阶段:

(一)加入房间、呼叫对方,对方应答

(1)ClientA登录后连接信令服务器,选择进入某个房间;

(1)ClientB登录后连接信令服务器,选择进入某个房间;(1)(2)不分先后

(3)ClientA 在此房间中看到ClientB在线,选择呼叫ClientB;

(4)ClientB选择同意接听; (3)(4)中的ClientA和ClientB可以互换;

(二)交换SDP,发送/接收offer,发送/接收answer

(1)ClientA 执行getUserMedia() ->new RTCPeerConnection->Peer.addStream->createOffer

(2)ClientB 执行getUserMedia() ->new RTCPeerConnection->Peer.addStream;(1)(2)并行执行;

(3)ClientA通过信令服务器中转offer给ClientB;

(4)ClientB收到offer后,setRemoteDescription->createAnswer;并通过信令服务器中转answer给ClientA;

(5)ClientA收到answer后,setRemoteDescription;

(三)交换ICE candidate

(1)ClientA 向STUN Server请求ICE(请求可能在之前某个时候已经发出),STUN Server返回ICE candidate

(2)ClientB 向STUN Server请求ICE(请求可能在之前某个时候已经发出),STUN Server返回ICE candidate

(3)ClientA通过信令服务器中转ICE candidate到达ClientB;ClientB通过信令服务器中转ICE candidate到达ClientA;

(4)ClientA收到B的ICE canditate,addIceCandidate

(5)ClientB收到A的ICE canditate,addIceCandidate

(四)开始音视频通信

(1)ClientA addStream 展示对方远程音视频流;

(2)ClientA addStream 展示对方远程音视频流;

本文福利, 免费领取C++音视频学习资料包+学习路线大纲、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

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

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

相关文章

计算机毕业设计---ssm实验室设备管理系统

项目介绍 ssm实验室设备管理系统。前台jsplayuieasyui等框架渲染数据、后台java语言搭配ssm(spring、springmvc、mybatis、maven) 数据库mysql8.0。该系统主要分三种角色:管理员、教师、学生。主要功能学校实验设备的借、还、修以及实验课程的发布等等;…

再不收藏就晚了,Axure RP Pro 各版本大集合

Axure RP Pro下载链接 https://pan.baidu.com/s/1hRJRY6t0ZONKhdwvykAc3g?pwd0531 1.鼠标右击【Axure RP Pro9.0】压缩包(win11及以上系统需先点击“显示更多选项”)选择【解压到 Axure RP Pro9.0】。 2.打开解压后的文件夹,鼠标右击【Axu…

2024啦,致敬最可爱的技术人!!

大家可以关注我的公众号和视频号“架构随笔录”。 ​作为一个开源爱好者,我花费了大概1整天的时间去整理了国内外主流的互联网公司在Java后端领域的开源输出成果,顿时感悟太多,总是觉得这些贡献开源的技术人及对应技术公司确实太不容易了&am…

golang并发安全-select

前面说了golang的channel, 今天我们看看golang select 是怎么实现的。 数据结构 type scase struct {c *hchan // chanelem unsafe.Pointer // 数据 } select 非默认的case 中都是处理channel 的 接受和发送,所有scase 结构体中c是用来存储…

前端monorepo大仓权限设计的思考与实现

一、背景 前端 monorepo 在试行大仓研发流程过程中,已经包含了多个业务域的应用、共享组件库、工具函数等多种静态资源,在实现包括代码共享、依赖管理的便捷性以及更好的团队协作的时候,也面临大仓代码文件权限的问题。如何让不同业务域的研…

12. SSM整合

1.新建一个maven项目,添加web支持 创建项目 设定项目名 右键添加框架支持: 添加web应用支持: 完成后目录结构: 2.添加jar包依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0…

RealSense Depth Cameras with ROS1 安装和启动教程

首先进入下面的网址&#xff1a; https://dev.intelrealsense.com/docs/ros1-wrapper 进入该链接后&#xff0c;点击最右边的“忍者神龟” 继续点进去 继续点进去后&#xff0c;终于来到了下载安装教程页面&#xff1a; 下面开始命令行代码的搬运&#xff1a; 一、ROS安装&am…

JavaScript高级程序设计读书记录(九):继承

1. 继承 继承是面向对象编程中讨论最多的话题。很多面向对象语言都支持两种继承&#xff1a;接口继承和实现继承。前者只继承方法签名&#xff0c;后者继承实际的方法。接口继承在 ECMAScript 中是不可能的&#xff0c;因为函数没有签名。实现继承是 ECMAScript 唯一支持的继承…

基于ssm的一家运动鞋店的产品推广网站的设计论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本一家运动鞋店就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…

MySQL 基于 GTID 主从复制

GTID 定义 GTID 是 MySQL 事务标识&#xff0c;为每一个提交的事务都生成一个标识&#xff0c;并且是全局唯一的&#xff0c;这个特性是从 MySQL5.6 引进的。 组成 GTID 是由 UUID TID&#xff0c;UUID 是MySQL的唯一标识&#xff0c;每个MySQL实例之间都是不同的。TID是代表…

Linux内存管理:(七)页面回收机制

文章说明&#xff1a; Linux内核版本&#xff1a;5.0 架构&#xff1a;ARM64 参考资料及图片来源&#xff1a;《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 1. 触发页面回收 Linux内核中触发页…

Vue3:vue-cli项目创建及vue.config.js配置

一、node.js检测或安装&#xff1a; node -v node.js官方 二、vue-cli安装&#xff1a; npm install -g vue/cli # OR yarn global add vue/cli/*如果安装的时候报错&#xff0c;可以尝试一下方法 删除C:\Users**\AppData\Roaming下的npm和npm-cache文件夹 删除项目下的node…

从传统部署到无服务器计算:AI应用在AWS平台上的革新与飞跃

文章目录 《快速构建AI应用–AWS无服务器AI应用实战》内容简介作者简介目录 随着人工智能技术的不断发展&#xff0c;越来越多的企业开始将人工智能应用于各个业务场景&#xff0c;以提高效率、降低成本并创造新的商业模式。然而&#xff0c;传统的人工智能解决方案往往需要大量…

从零开始C++精讲:第一篇——C++入门

文章目录 前言一、C关键字二、命名空间2.1引子2.2命名空间定义2.3命名空间的使用 三、C输入和输出3.1输出3.2输入 四、缺省参数4.1全缺省4.2半缺省 五、函数重载5.1重载概念 六、引用6.1定义6.2引用的使用示例6.2.1引用作参数6.2.1引用作返回值 6.3传值、传引用效率比较6.4常引…

超维空间M1无人机使用说明书——01、ROS机载电脑使用说明——远程连接

引言&#xff1a;远程连接通常采用两种方式&#xff0c;一种是通过可视化软件&#xff0c;如VNC、Nomachine等&#xff0c;另外一种是使用SSH。各有优缺点&#xff0c;两种远程登录方式的优缺点做一个简单的对比&#xff1a; 1、SSH优缺点 优点:1、消耗网络资源 2、运行稳定 …

前端面试题集合六(高频)

1、vue实现双向数据绑定原理是什么&#xff1f; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>…

java SSM问卷调查系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM问卷调查管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代 码和数据库&#xff0c;系统主要采…

每天刷两道题——第十一天

1.1滑动窗口最大值 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值 。 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7], k 3 输出&…

面试宝典之微服务框架面试题

S1、集群与分布式有啥区别&#xff1f; &#xff08;1&#xff09;相同点&#xff1a; 分布式和集群都是需要有很多节点服务器通过网络协同工作完成整体的任务目标。 &#xff08;2&#xff09;不同点&#xff1a; 分布式是指将业务系统进行拆分&#xff0c;即分布式的每一个…

Pycharm中如何配置python环境(conda)

首先在pycharm中点击 "File" > "Settings" 再次点击如下操作&#xff1a; 点击Python Interpreter的最右侧按钮&#xff0c;点击Show All... 找到python文件 最后点击OK