【WebRTC技术专题】大势所趋,迈向认识 WebRTC 的第一步(2)

news2024/11/25 3:04:57

每日一句

人生的挑战,无处不在,满怀信心,轻装上路,明天永远是充满希望的战场。

承接上文

承接上文的内容介绍完相关WebRTC技术的概念和发展历程后,开始初步摸索一下相关WebRTC技术的功能和原理。🌺【WebRTC原理探索】未来可期,WebRTC的诞生发展

技术回顾

WebRTC概念定义

WebRTC名称源自网页实时通信(Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的技术,是谷歌2010年以6820万美元收购Global IP Solutions公司而获得的一项技术。

WebRTC功能范畴

  • WebRTC是一个开源项目,旨在使得浏览器能为实时通信(RTC)提供简单的 JavaScript接口。

  • WebRTC不仅可传输视频,也可以传输其他数据例如文本、图片等。需要注意的是,WebRTC并不是浏览器的一个子集,浏览器只是根据 WebRTC 的标准协议实现了 WebRTC的原生接口。Android 和 IOS 系统也支持 WebRTC 。

WebRTC应用包括下面四个主要的概念

  • 信令服务器(Signalling servers)

  • ICE服务器(ICE servers)

  • 媒体服务器(Media servers)

  • JavaScript接口 (JavaScript API)

WebRTC已经纳入HTML5标准

目前支持WebRTC协议的浏览器有:Chrome、Firefox Opera,IE不支持~

  • WebRTC没有指定具体的信令协议,具体的信令协议留给应用程序实现。

  • WebRTC使用JSEP协议建立会话,什么是JSEP后面说

  • WebRTC采用ICE实现NAT穿越。

  • WebRTC客户端之间可以进行点对点的媒体传输。

WebRTC的核心组件

  • 音视频引擎:OPUS、VP8/VP9、H264

  • 传输层协议:底层传输协议为UDP

  • 媒体协议:SRTP/SRTCP

  • 数据协议:DTLS/SCTP

  • P2P内网穿透:STUN / TURN / ICE / Trickle ICE

  • 信令与SDP协商:HTTP / WebSocket / SIP、 Offer Answer 模型

下图为WebRTC内部结构简化图:

  • 最底层是硬件设备

  • 上面是音频捕获模块和视频捕获模块

image.png

  • 中间部分为音视频引擎

    • 音频引擎负责音频采集和传输,具有降噪、回声消除等功能。

    • 视频引擎负责网络抖动优化,互联网传输编解码优化。

在音视频引擎之上是一套C++ API,在C++ 的API之上是提供给浏览器的Javascript API。

JSEP

  • JSEP(JavaScript Session Establishment Protocol,JavaScript会话建立协议)是一个信令API,允许开发者构建更强大的应用程序以及增加在信令协议选择上的灵活性。

  • JSEP是干什么的呢,一方面提供接口如createOffer()供web应用程序调用生成SDP,另一方面提供ICE功能接口。这些功能都由浏览器实现,浏览器WebRTC传输信令(offer/answer)采用Websocket

    • 建立会话最关键的就是媒体的协商,WebRTC虽然没有指定具体的信令协议,但是媒体协商采用了SDP协议。

    • 如果web应用程序不使用额外的信令协议,仅使用JSEP,两个WebRTC client(同一个WebRTC client程序,两处登陆)之间也是可以建立链接的,即只要应用程序能解析用WS传递过来的Offer/Answer消息,提取出其中的SDP和ICE信息就可以了。

  • github上codelabdemo就是不用其他信令协议,直接使用JSEP生成offer/answer信令,然后采用ws协议传输实现的

  • JSEP并不是信令协议,可以在JSEP的基础上引入SIP等信令协议,使WebRTC应用功能更加完备。

信令服务器

  • 信令服务器主要用于在两个用户之间交换信息。虽然WebRTC是点对点通信,但还是需要服务器来初始化连接,并传递一些信息

WebRTC没有定义用于建立信道的信令的协议,因此可以使用任意的传输方式,例如 WebSocket, XMPP, SIP, AJAX

  • 可以使用实时的传输协议比如WebSocket来交换数据,也可以使用简单的 GET/POST方式轮询服务器来获取数据。
信令服务器传送的数据有
  1. 协商媒体功能和设置
  2. 标识和验证会话参与者的身份
  3. 控制媒体会话指示进度更改会话和终止会话

其中只有第一项的必备功能。其他都可以根据业务需求自由调整。

SDP协议
  • 媒体协商最重要的功能在于,为参与点对点通信的两个浏览器之间交换会话描述协议「SDP」。

  • 「SDP」包含浏览器的RTP媒体栈配置所需的全部信息,包括媒体类型(音频、视频、数据)、所需的编解码器,用于编解码器参数或设置,以及有关带宽的信息。

此外,信令通道还用于交换候选地址,以便进行ICE打洞。

信令互通方案

WebRTC与SIP互通

要想让WebRTC与SIP互通,要解决两个层面的问题:信令层和媒体层。

两个网络使用的信令机制不同,所以要进行信令的转换,才能完成媒体的协商,建立会话。媒体层要完成编码的转换,以及RTP/SRTP转换等功能。

这里主要说项信令层面的互通。

目前SIP和WebRTC信令上互通有两种解决方案:

  • JavaScript实现SIP协议栈,WebRTC应用程序基于这个协议栈开发。WebRTC Client发出的信令就是SIP信令,但一般采用websocket为信令传输协议。

    • 这样WebRTC client就可以直接注册到支持WS的SIP Server上了。jssip 、sipml5都是这种解决方案。
  • 通过转换网关实现协议的转换,从而互通。一个开源的网关项目就是 WebRTC2SIP。

    • WebRTC2SIP是一个功能很完善的网关,既实现了信令层,也实现了媒体层,编码转换功能很强大,也可以直接当做媒体网关,用于编解码,沟通两端的媒体

ICE服务器

  • 实现点对点通信的关键在于两个浏览器之间能直接发送和接收数据包,但一般情况下,浏览器或手机都是通过路由器访问Internet,所以存在网络地址转换(NAT)。

  • NAT之内的IP地址是私有地址,外部无法访问。分配给NAT的IP地址才是公共地址。NAT每次从内部到外部转发数据包时都使用公共地址。

  • 交互式建立连接(ICE)是一种标准穿透协议,它利用STUN和TURN服务器来建立连接。

  • STUN服务器可以遍历NAT,获取浏览器的候选地址,包括私有地址、外层NAT的公共 IP地址等。

  • 通信信令通道可以交换候选地址,浏览器一旦发送并收到了候选地址,就会开始进行连接检查,若检查成功,便使用该候选项发送媒体。

  • 在大多情况下,通过穿透可以建立直接对等连接。但是,若NAT或防火墙限制非常严格,无法建立连接,就只能通过TURN服务器中继媒体。

媒体服务器

媒体服务器不是必须的,但在多方会话或需要对媒体做额外处理的情况下可以考虑加入。对于有多个浏览器参与的会议,可以采用一个集中式媒体服务器。在这种情况下,美国浏览器都只需与媒体服务器建立单个连接即可,这种结构的优势是额能够扩展非常大的会话,同时可以在最大限度上减少当有新加入者加入会话事美国浏览器所需的处理工作量。同时,媒体服务器也可对媒体进行分析、处理、保存等工作。

JavaScript接口

getUserMedia

通过调用navigator.getUserMedia()可以获取视频或音频的数据,constraints 参数可以选择是否获取视频音频。下面是一个简单的示例

var constraints = {
  audio: false,
  video: true
};
var video = document.querySelector('video');

function successCallback(stream) {

  if (window.URL) {
    video.src = window.URL.createObjectURL(stream);
  } else {
    video.src = stream;
  }
}

function errorCallback(error) {
  console.log('navigator.getUserMedia error: ', error);
}


navigator.getUserMedia(constraints, successCallback, errorCallback);

RTCPeerConnection

RTCPeerConnection是WebRTC中最重要的一个接口,用于确定ICE服务器、交换 SDP。连接过程如下:

创建RTCPeerConnection对象
  1. RTCPeerConnection的参数用于确定ICE服务器,下面是使用了 google 开放的 STUN 服务器
let iceServer = {
    "iceServers": [{
        "url": "stun:stun.l.google.com:19302"
    }]
};
let pc = new RTCPeerConnection(servers);
  1. 将媒体流放入 RTCPeerConnection 对象中
pc.addStream(localStream);

通过offer和answer交换SDP描述符

  1. 甲和乙各自建立一个PC实例

    • 甲通过PC所提供的createOffer()方法建立一个包含甲的SDP描述符的offer信令

    • 甲通过PC所提供的setLocalDescription()方法,将甲的SDP描述符交给甲的PC实例

  2. 甲将offer信令通过服务器发送给乙

    • 乙将甲的offer信令中所包含的的SDP描述符提取出来,通过PC所提供的 setRemoteDescription()方法交给乙的PC实例

    • 乙通过PC所提供的createAnswer()方法建立一个包含乙的SDP描述符 answer信令

    • 乙通过PC所提供的setLocalDescription()方法,将乙的SDP描述符交给乙的PC实例

  3. 乙将answer信令通过服务器发送给甲

甲接收到乙的answer信令后,将其中乙的SDP描述符提取出来,调用setRemoteDescripttion()方法交给甲自己的PC实例。

ICE打洞

  1. 当网络候选可用时,通过信令服务器将其发送到对方浏览器
pc.onicecandidate = function(event) {
  if (event.candidate) {
    sendToServer(event.candidate)
  }
};
  1. 当接受到对方网络候选时,将其加入
let candidate = new RTCIceCandidate(candidate);
pc.addIceCandidate(candidate);
  1. 监听对方发送的媒体是否可用,并播放媒体
pc.onaddstream = event => {
  remoteVideo.src = window.URL.createObjectURL(event.stream);
}

RTCDataChannel

RTCDataChannel是RTCPeerConnectionAPI的一部分,只有在创建了 RTCPeerConnection实例后才能创建数据通道。

数据通道可以用于发送文本或是文件。

pc = new RTCPeerConnection();
dc =  pc.createDataChannel('dc');
dc.onmessage = event => console.log(event.data);
dc.send('text');
dc.sed(new arraybuffer(32))

在另一端可以使用 ondatachannel 获得 RTCDataChannel 对象

pc.ondatachannel = event => dc = event.channel;

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

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

相关文章

【科普】一篇搞定发paper基本概念:SCI、EI、会议/期刊、分区、CCF、DOI、IF、h-index、及cs/ee常见会议:CVPR、GlobeCOM等

文章目录基础概念SCI、EI、CPCI(ISTP)论文类型:Journal、magazine、transaction、letter、 proceedingsDOI(数字对象标识Digital Object Identifier)IF 期刊影响因子(Impact Factor,IF)H指数 (h-index/h-fa…

时间序列 | MATLAB实现CNN-LSTM-Attention时间序列预测

时间序列 | MATLAB实现CNN-LSTM-Attention时间序列预测 目录时间序列 | MATLAB实现CNN-LSTM-Attention时间序列预测预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 MATLAB实现CNN-LSTM-Attention时间序列预测,CNN-LSTM结合注意力机制时间序列预测。 模…

使用wait监听tomcat服务启动

文章的wait脚本素材会放在末尾 执行docker-compose.yml文件之后就有mysql的主服务器,还有从服务器,还有tomcat服务,在tomcat中部署一个crm项目,tomcat服务中我们添加了启动顺序, # 启动顺序 depends_on: - mysql…

低压接地系统:TN-C 、TN-S、TN-C-S、TT、IT

电力系统的接地直接关系到用户的人身和财产安全,以及电气设备和电子设备的正常运行。如何针对实际情况选择合适的接地系统,确保配电系统及电气设备的安全使用,是电气设计人员面临的首要问题。 根据 国际电工委员会(IEC)规定的各种保护接地方式的术语概念,低压配电系统按…

如何利用开源思想开发一个SEO友好型网站

当你对一个网站进行 SEO 优化的时候,不要期望你的努力能立即得到回报。耐心等待并更正内容营销策略,最终会发现你的网站很受用户欢迎。下面就教你如何利用开源思维开发一个SEO友好型网站! 首先,你应该知道:93% 的网站…

修复开源VS Code 插件Trino Driver的三个小问题

前言 最近产品中使用到一款SQLTools的VS Code插件。该插件可以在VS Code中实现数据库管理,而且支持非常多的数据源类型, 官方的数据源类型有CockroachDB,MariaDB,MySQL,PostgreSQL,SQLite,Micr…

电脑录屏按哪个键?您可以这样操作!

案例:电脑按哪3个键,可以录屏? 【我平常喜欢使用快捷键在电脑上快速完成一些操作。最近接触到了电脑录屏,感觉使用它一系列的操作比较麻烦。想在这里问问小伙伴们,有没有使用快捷键成功操作过的朋友!】 电…

【Linux】页表的深入分析

上一篇文章介绍了线程的基本概念 而本篇文章我们来深入理解一下, CPU再调度我们以往理解的进程和如今的线程都会涉及到的一个内容: 页表 文章目录深入理解页表 *页表的实际组成*什么是page?深入理解页表 * 在介绍进程时, 博主没有深入介绍过页表. 只是简单说了 页…

DAY 40 firewalld 防火墙

firewalld防火墙是centos7系统默认的防火墙管理工具,取代了之前的iptables防火墙,也是工作在网络层,属于包过滤防火墙。 支持IPv4、IPv6防火墙设置以及以太网桥支持服务或应用程序直接添加防火墙规则接口拥有两种配置模式:临时模…

【快乐手撕LeetCode题解系列】—— 环形链表 II

【快乐手撕LeetCode题解系列】—— 环形链表 II😎前言🙌环形链表 II🙌画图分析:😍思路分析:😍源代码分享:😍总结撒花💞😎博客昵称:博客…

了解oauth2.0

1 什么是 OAuth2.0 开发授权(OAuth)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片、视频、联系人列表等),而无需将用户名和密码提供给第三方应用。 OAuth 允许用户…

我的软件测试故事:成长、迷茫、奋斗

前言 测试工作6年,经历过不同产品、共事过不同专业背景、能力的同事,踩过测试各种坑、遇到过各种bug。测试职场生涯积极努力上进业务和技术能力快速进步过、也有努力付出却一无所得过、有对测试生涯前景充满希望认为一片朝气蓬勃过、也有对中年危机思考不…

OpenAI Embedding:快速实现聊天机器人(二)

theme: orange 本文正在参加「金石计划」 接上文OpenAI Embedding:快速实现聊天机器人(一)有讲到聊天机器人的一些概念,这篇开始讲讲这个聊天机器人的架构和流程。 总架构图 这里我参照一个现成的架构图来讲如何实现,其是基于Azure多个相关云…

香港进出口报关指南

由于香港优越的地理位置和政策支持,大部分外贸货物通过香港出口到世界各地。与内地海关相比,香港报关更简单快捷。司机可根据内地舱单填写一份香港进/出口舱单(俗称司机纸)进出香港海关,并在货物抵港后14天内申报。 香港进出口报关需要提供哪…

单机/集群/热备/磁盘阵列(RAID)的区别详解

一、单机部署(stand-alone) 单个服务器,只有一个饮水机提供服务,服务只部署一份。 二、集群部署(cluster) 服务器集群就是指将很多服务器集中起来一起进行同一种服务,在客户端看来就像是只有…

MySQL连接空闲时间超过8小时报错原因与延伸知识

1 错误原因 1.1 两个参数 MySQL服务端两个参数控制连接超时时间: wait_timeoutinteractive_timeout1.1.1 如何查看 show global variables like interactive_timeout show global variables like wait_timeout 复制代码 1.1.2 含义与区别 wait_timeout&#xf…

JAVA System.nanoTime()与GO time.Now().UnixNano()区别

JAVA System.nanoTime() public static void main(String[] args) {long nano System.nanoTime();System.out.println(nano);} 输出:701863191254000,这个值有点奇怪,System.currentTimeMillis()不是System.nanoTime()的1000000倍。 这个值…

【springcloud开发教程】路由网关——zuul

官方资料:https://github.com/Netflix/zuul/ 什么是Zuul? Zuul包含了两个主要的功能:路由和过滤 路由功能将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤器功能则负责对请求的处理过程进行干预&#…

Ubuntu环境安装指定版本的docker 和一键卸载dockerdocker-compose

一、环境 我的linux系统是Ubuntu 22.04 二、开始安装 卸载旧版 由于apt官方库里的docker版本可能比较旧,所以先卸载可能存在的旧版本: $ sudo apt-get remove docker docker-engine docker-ce docker.io更新apt包索引 $ sudo apt-get update安装以下…

基础工业工程(易树平、郭伏)——第四章 程序分析

第四章 程序分析 第一节 程序分析概述 一、程序分析的概念、特点及目的 1.程序分析的概念 程序分析是一种重要的生产管理工具,它是依照工作流程,从第一个工作地到最后一个工作地,全面地分析有无多余、重复、不合理的作业&…