WebRTC标准与框架解读(1)
1、如果让我来设计webrtc框架
我在分析源码的时候,都喜欢做这样一件事情:如果让我来设计它,我会怎么做?大家可以紧跟我的思路,分析一下WebRTC为什么如此设计。
为了对整个框架有有一个全面的了解,我们首先要做的事情是拆解模块。如下图所以,这里我们根据数据流动,将WebRTC拆解成多个模块,这里有些模块相对比较复杂,我们做了简化。整体的框架如下图所示:
WebRTC标准与框架
大家也许已经发现,我针对一些模块,圈出了一些更大的模块,毕竟,相比零碎的模块,我们喜欢简单。因此,对于一条流来说,它的整个流程便简化为:
简化后的框架
这里简单地对概念做一些解释:
track,用于处理原始媒体流。对于本地的track来说,它的作用是接收采集的视频帧完成处理和编码,得到编码后的数据;对于远端的track来说,接收编码的视频流完成解码处理,送去渲染。
rtpsender,接收编码后的数据,完成打包和一些冗余策略等。rtpsender和本地的track是一一对应的。
transport, ICE相关,完成传输通道的管理。
rtpreceiver,接收网络报文,输出编码数据用于后续解码。rtpreceiver和远端的track是一一对应的。
在这里track的作用是处理原始的媒体流,rtpsender和rtpreceiver可以完成对媒体打包做一些控制,transport是对传输通道的控制。有了这样的抽象,我们的pipeline就会更加清晰。
这里我在track基础上圈出了mediastream的概念,这个是WebRTC的老接口使用的概念,现在都是推荐使用track来操作。对于MediaStream的理解大家可以看下标准,一般来说,对于普通的音视频通话,一个MediaStream包含一路音频track和视频track,其实拿1v1的通话来说大家可能更容易理解为什么要把他们绑定到一起了。一般同属于一个MediaStream的流是需要做音视频同步的。
https://www.w3.org/TR/mediacapture-streams/www.w3.org/TR/mediacapture-streams/
2、ORTC的设计
哈!如果你了解下ORTC的设计思想,你就会发现,还有一群更聪明的人早就想到如此设计整个RTC了!
ORTC(Object API for RTC)的设计思想:
ORTC标准
可以看到,ORTC中,也是抽象成了Track、RtpSender、RtpReceiver、Transport几个概念。ORTC设计的是一套面向对象的接口,外部通过和RtpSender、RtpReceiver、Transport交互,来达到对RTC的控制目的。ORTC标准的出现,也规范了WebRTC的代码框架。
3、WebRTC PeerConnection(PC)接口
WebRTC对内部的各个模块都有经过封装,比较推荐的是使用PeerConnectionn接口来对外交互,我们上面的设计还是很贴近PC了,大家可以多看看这个标准:
https://w3c.github.io/webrtc-pc/w3c.github.io/webrtc-pc/
目前的WebRTC标准里面pc接口为了兼容planB和unified plan,接口相对比较复杂,如果我造轮子,肯定会甩掉历史包袱,只保留一套接口了。unified plan支持对每一个track配置,相对更灵活。因此,我们围绕track、rtpsender、rtpreceiver、transport增加一些接口即可。
AddTrack:用于增加本地的track,输入为视频源接口,可以是内部采集,也可以是外部采集(我们可以自己实现采集功能)。远端的track是协商之后由信令触发。
SetLocalDescription :设置本地SDP能力
SetRemoteDescription: 设置远端SDP能力
CreateOffer:添加好track,设置好本地能力后,便可以向接收端发起协商。
CreateAnswer:接收端响应offer,协商完成后会创建一个rtpreceiver用于接收媒体报文,并且会对应床架一个远端track,用于解码和显示。
以上接口接口可以保证整个流程能够运行起来:
peerconnection流程
实际上这里还缺失了ICE协商相关的接口,这里没有做详细介绍了。
原文https://zhuanlan.zhihu.com/p/484971820
★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。
见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
相关文章:
WebRTC标准与框架解读(1)
1、如果让我来设计webrtc框架我在分析源码的时候,都喜欢做这样一件事情:如果让我来设计它,我会怎么做?大家可以紧跟我的思路,分析一下WebRTC为什么如此设计。为了对整个框架有有一个全面的了解,我们首先要做…...
数据结构的一些基础概念
一 基本术语 数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。 数据元素:是组成数据的,有一定意义的基本单位,在计算机中通常作为整体处…...
【Python每日一练】总目录(不断更新中...)
Python 2023.03 20230303 1. 两数之和 ★ 2. 组合总和 ★★ 3. 相同的树 ★★ 20230302 1. 字符串统计 2. 合并两个有序链表 3. 下一个排列 20230301 1. 只出现一次的数字 2. 以特殊格式处理连续增加的数字 3. 最短回文串 Python 2023.02 20230228 1. 螺旋矩阵 …...
latex插入图片(自用)
加入宏包:\usepackage{graphicx} 使用 \includegraphics 命令进行插图。 \includegraphics[]{}: 第一参数[]:对图片做一些适当的调整(设定图片的高度和宽度或者按比例缩放) 第二参数{}:图片的名字…...
【微信小程序】-- 网络数据请求(十九)
💌 所属专栏:【微信小程序开发教程】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…...
K8S 实用工具之一 - 如何合并多个 kubeconfig?
开篇 📜 引言: 磨刀不误砍柴工工欲善其事必先利其器 K8S 集群规模,有的公司倾向于少量大规模 K8S 集群,也有的公司会倾向于大量小规模的 K8S 集群。 如果是第二种情况,是否有一个简单的 kubectl 命令来获取一个 kubec…...
阿里云ECS服务器的6大功能组件
阿里的云服务在国内可以说是首屈一指的了,因此他们家的云服务器也是最受欢迎的。那么,你知道阿里云服务器ECS有哪些功能组件吗?不清楚不要紧,下面服务器吧小编带大家来看看。 在了解之前我们来看一张阿里云服务器ECS的产品组件架…...
外贸建站多少钱?不同预算对应的建站方案!
外贸建站多少钱? 答案是:3000左右。 作为一个外贸企业的经营者,我们深知一个优质的外贸网站对于企业的重要性。 然而,建立一个优质的外贸网站需要耗费大量的时间和资金,因此我们需要在预算有限的情况下,…...
Vue3中hook的使用及使用中遇到的坑
目录前言一,什么是hook二, hook函数的使用2.1 铺垫2.2 hook函数的写法2.3 使用写好的hook函数后记前言 在学习Es6的时候,我们开始使用类与对象,开始模块化管理;在Vue中我们可以使用mixin进行模块化管理;Vu…...
数据库-差集交集并集
数据库-差集交集并集[toc]图示一、并集运算(UNION)并集:两个集合的并集是一个包含集合A和B中所有元素的集合。在T-SQL中,UNION集合运算可以将两个输入查询的结果组合成一个结果集。需要注意的是:如果一个行在任何一个输…...
spark性能调优(四):网络
网络 一、数据读写二、数据处理三、数据传输在平衡不同硬件资源的时候,相比于CPU、内存、磁盘,网络开销处理延迟最高 一、数据读写 对于大多数应用来说,第一步都是从分布式系统中读取数据,不论什么文件格式,也不管哪种文件存储系统,访问数据源是否会引入网络开销,取决于任务与…...
高性能 WPF 图表控件LightningChart.NET:支持从 Web 服务器获取数据 | 附最新版试用下载
LightningChart.NET 是一款高性能 WPF 和 Winforms 图表,可以实时可视化多达1万亿个数据点。可有效利用CPU和内存资源,实时监控数据流。同时,LightningChart使用突破性创新技术,以实时优化为前提,大大提升了实时渲染的效率和效果&…...
文科女生月入14k背后:转行IT软件测试不是谁都学得来!
转行软件测试背后,或许每个人都有自己的无奈。就拿今天要和大家分享的这位小姐姐来说吧,如果不是万不得已,又怎么会狠下心来转行到IT互联网? 应届生逃避就业,考研失败 和大多数人一样,小姐姐的大学生活过得…...
GB28181监控视频统一汇聚平台LiveGBS将海康大华华为宇视等厂家监控设备统一接入后如何生成固定播放链接或者固定的流地址可以直接无插件播放或者拉取
目前汇聚各种厂家监控设备的视频汇聚平台,基本都是通过GB28181标准协议实现的。下面介绍下LiveGBS Web无插件直播的GB28181视频平台将各厂家(包括海康、大华、华为、宇视、天地伟业等)监控汇聚到同一个服务器上后,如何或者直播链接…...
认识BUG
如何描述 bug一个合格的 bug 描述应该包括以下几个部分:发现问题的版本开发人员需要知道出现问题的版本,才能够获取对应版本的代码来重现故障,并且版本的标识也有利于统计和分析每个版本的质量。问题出现的环境环境分为硬件环境和软件环境&am…...
C++string类型内置的搜索函数
string的搜索操作 string类型一共提供了6种不同的搜索函数,每个函数都有4个重载版本。如果搜索成功,每个搜索操作都会返回一个 string::size_type类型的值,表示匹配发生位置的下标。 如果搜索失败,则会返回一个名位string::npos…...
Disruptor 消费线程丢失、写入无限阻塞问题
使用jstack打印后,发现 1)写入disruptor线程卡死在 java.lang.Thread.State: TIMED_WAITING (parking) at sun.misc.Unsafe.park(Native Method) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:338) at com.lmax.…...
【禅道测试环境搭建及安装】Linux上的禅道安装教程,从环境搭建开始
目录 一、操作环境 二、安装VMware 三、安装FinalShell 四、在VMware里安装CentOS 1.前置:CentOS的下载 2.CentOS的安装 3.查看网络 五、用宿主机连接远程的虚拟机 六、禅道包的下载与CentOS配置的修改 七、上传项目包并安装禅道 一、操作环境 Windows 10…...
spring-boot rabbitmq整合
文章请参考:Springboot 整合RabbitMq ,用心看完这一篇就够了 mven依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></depende…...
CentOS7安装redis redis常用命令
Redis简介Redis是一个开源免费的、使用C语言编写的NoSQL 数据库。Redis基于内存运行并支持持久化(RDB、AOF方式将数据保存在磁盘),采用key-value (键值对)的存储形式。Redis数据类型Redis支持五种数据类型:string(字符串)…...
世界文明的脉络
人类文明大体上可分为农耕文明、海洋文明和游牧文明三大类别,文明的标志一般是文字、青铜器、城市以及礼仪性建筑等要素。据此,史学家目前已发现了巴比伦文明、埃及文明、印度文明、华夏文明、希腊文明和波斯文明六种主要文明,其中前四种文明…...
map和set 的封装
文章目录引入key-value模型map和set底层setset的几个重要接口mapmap几个重要的接口map和set的封装引入 对于map和set的引入,我们用一道在程序中常见的问题解决: 给定一个数组int arr[]{1,2,1,3,1,4,1,5,5,2,3,4,5};,给出以下问题的解决方案&…...
Springboot集成kafka(环境搭建+演示)|超级详细,建议收藏
Springboot集成kafka一、前言🔥二、环境说明🔥三、概念🔥四、CentOS7安装kafka🔥1.下载kafka安装包2.下载好后,进行解压六、kafka项目集成🔥1️⃣pom引入2️⃣配置kafka3️⃣一个kafka消息发送端4️⃣定义一…...
Qt 绘制图表 - Qt Charts版
一、前言 自从 Qt 发布以来,给广大跨平台界面研发人员带来了无数的福利。但是Qt自己却一直没有提供自带的图表库,这就使得 QWT、QCustomPlot 等第三方图表库有了巨大的生存空间,为了降低开发成本,大家都涌向了这些第三方库。这种…...
Java学习笔记 --- JavaScript
一、JavaScript介绍 JavaScript语言诞生主要是完成页面的数据验证。因此它运行在客户端,需要运行浏览器来解析执行JavaScript代码。JS是Netcape网景公司的产品,最早取名为LiveScript;为了吸引更多java程序员。更名为 JavaScript JS是弱类型&…...
AP5216 平均电流型LED 降压恒流驱动器
产品描述 AP5216 是一款 PWM工作模式, 高效率、外围简单、内置功率管,适用于5V~100V输入的高精度降压 LED 恒流驱动芯片。输出最大功率可达 9W,最大电流 1.0A。 AP5216 可实现全亮/半亮功能切换,通过MODE 切换:全亮/…...
B站的多个视频教程,怎样生成一个二维码?
商业插画视频教程、电商运营视频教程、在线网课视频、舞蹈视频教程、摄影视频教程、语言学习教程、纪录片视频…所有你发布在哔哩哔哩上的视频,都可以放在一个二维码里面。 任何人只要扫描这个二维码,就能在线观看你的这些视频教程!分享起来…...
深入底层源码的Listener内存马(内存马系列篇三)
写在前面 继前面的FilterServlet内存马技术,这是系列文章的第三篇了,这篇将给大家带来的是Listener内存马技术。 前置 什么是Listener? 监听器 Listener 是一个实现特定接口的 Java 程序,这个程序专门用于监听另一个 Java 对象…...
云端需求助力跑赢周期,金山办公有望借助ChatGPT加速腾飞
与微软在办公领域“搏杀”了三十年的金山办公,或许正在迎来自己的“第二春”。2月25日,金山办公(688111)发布2022年度业绩快报,全年营收38.85亿元人民币(单位下同),同比增加18.44%&a…...
Vulnhub靶场----8、DC-8
文章目录一、环境搭建二、渗透流程三、思路总结一、环境搭建 DC-8下载地址:https://download.vulnhub.com/dc/DC-8.zip kali:192.168.144.148 DC-8:192.168.144.156 二、渗透流程 1、信息收集nmap -T5 -A -p- -sV -sT 192.168.144.156思路&am…...
淘宝网站模板是什么做的/线上销售渠道有哪几种
在我们的日常生活中,我们可能需要把对象序列化存储在某个中间介质中。然后在某个时候,将对象取出来,进行反序列化。 持续补充中 。。。。 下面展示下如何实现: 被序列化与反序列的化的类需要实现 serialize 接口 : pa…...
java 网站做甘特图js/壹起航网络推广的目标
前端时间写了个简单的 JQuery验证时间段的插件,起始时间必须小于等于截至时间 函数原型 function validateTimePeriod(begin,end) begin,end 可以为DOM对象,也可以为JQuery对象。 返回值: true: 起始时间小于截至时间 false: 不满足起始时间小于等…...
网站留言板作用/如何在网站上推广自己的产品
2019独角兽企业重金招聘Python工程师标准>>> ECShop商城自带众多购物便利功能,如促销,团购,拍卖,红包,专题,祝福贺卡等等...但是对做外贸网站的商家而言就必不可少了--多国货币功能的实现。当你…...
给女朋友做网站的素材/seo基础篇
一、Scrapy简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中。其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据…...
教育网站如何做seo/百度网盘官方
(1) 在application.properties文件中添加自定义属性(单个属性使用); 在这里我们新建一个maven java project进行测试,取名为:spring-boot-hello4。 对pom.xml基本的spring boot 配置,主要用到的一个核心依赖是: 1 2 3 …...
网站建设的流程图示/淘宝站外引流推广方法
重构学习笔记1. 封装集合 概念:本文所讲的封装集合就是把集合进行封装,只提供调用端需要的接口。 正文:在很多时候,我们…...