6.5.编解码器信息的收集

news2024/9/22 6:56:50

那在上节课中呢?我向你介绍了add track相关的内容,那今天呢?我们来看看编解码器信息的收集。那在这里呢,我们需要问几个重要的问题,那首先呢,就是我们上节课通过,可以让web rtc知道我们都要传输哪些媒体?是否有音频?是否有视频对吧?那当你添加不同的track的时候呢?

y8 rtc自己就能够识别出来,你添加的是音频track还是视频track?那知道了这些信息之后,我们可以得到一个什么结果呢?

就是我们在进行媒体协商的时候生成的sdp中,会包含多个m行。如果你要传输音频数据,它就会有音频的行,如果你要传输视频数据,就会有视频的行。

那在m行中呢,还包括了很多信息,比如plow tap,有一个plow tap列表,那这些plow tap是从何而来的呢?这是我们第一个问题好,

第二个问题,那每个配置tab都有对应的值,比如幺幺幺代表的是ous,96代表的是vp8。那这些信息又是怎么获取到的?也是我们需要弄清楚的。好,

第三个问题,那在整个传输的过程中,我们所选择的传输协议也是非常关键的,你是选择的TCP还是udp?那在udp之上是直接传到rtp还是s rtp?那这些呢?对于我们数据的传输都非常的关键。
在这里插入图片描述

那以上这些问题呢?我们在这节课中就会给你答案。那就像我们人类起源一样,盘古开天辟地,那所有的事物呢,都应该有一个起源,对于webrtc来说,它的起源是哪儿呢?

实际就是peer connection factory,那当我们调用create peer connection factory这个API之后,那整个web rtc就开始运转起来了。其中,与我们今天所要介绍的内容息息相关的,
在这里插入图片描述

就在这个API中的四个参数,分别是音频编码工厂,音频解码工厂是。视频编码工厂以及视频解码工厂,那通过这四个API就可以一步一步的将我们上面三个问题一一解答。那这里呢?

我以create building audio encoder factory为例子,向你介绍一下web rtc是如何构造payload type列表的。以及如何组织每一个pillow type所对应的编辑码器的好的,
在这里插入图片描述

下面呢,我们就来看看这个API那在这个API中呢,它又调用了另外一个方法,就是create audio encoder factory。对于这个方法来说呢,它是一个模板方法了,对吧?那我们可以看到在这个方法的后边有一对尖括号,

也就是这块和这块。那在这个监控二里边儿呢?它列出了目前外边儿tc所支持的音频的编码器,包括了opus multi China lop US。g七二二il bcg 7幺幺这几个音频编码器
在这里插入图片描述

那这个模板方法啊,构造的非常巧妙。那他通过这个列表,利用C加加的可变模板参数,就实现了一个工厂方法,那我们来看一下。这个API的实现了好,那这段代码呢?就是create audio encoder factory的实现,那在这个API的上面啊,

我们可以看到一个template关键字。那通过这个关键字呢,我们可以知道它后边儿定义的就是一个模板,那在这个模板里边儿写了type name点儿点儿点儿ts。说明它是一个可变参数模板,可变参数模板是C加加幺幺中的一个非常重要的特性。那对于一般的同学来说呢,理解和使用可变参数模板是非常困难的,但一旦你掌握了C加加幺幺的这个特性,那你就会写出非常优质的代码来。那其中再把tc的create audio encoder factory就给我们提供了这样一个例子,那我们来看看它是怎么实现的啊?那可变参数对于属于c和C加加的同学来说呢,应该都不陌生,因为我们经常使用,

比如说C语言中的print for它就是一个具有可变参数的函数。对吧,它参数里需要打印的内容是可以变化的,那同样可变参数模板也是这个含义。就是你在这个模板列表中啊,可以传入可变参数的模板,这个参数呢是可多可少的,根据你的需要,你去列出来就了。对于可变参数模板,我们该如何使用呢?那么来看一下create audio encoder factory,它是怎么做的?那在这个函数中呢,它生成了一个新的对象,

在新的对象中,它创建了audio encoder factory t,这个对象对吧?那这个对象呢?它也是一个模板类,同时呢,是可变参数的模板类,因为我们把ts点儿点儿点儿给它传进去了。那这个点点点代表的就是你这里边给我传的模板的个数是多少?那它呢?就把这个列表原封不动的传给了。audio encoder factory t这个类好,那下面呢?我们再来看看audio encoder factory t这个类是如何定义的?那就如这里边左侧所展示的,
在这里插入图片描述

对于audio encoder factory t来说,它也是一个可变参数模板类,那它定义呢?与我们上一页PPT中。看到的这个定义呢是一样的,它也是template name点点点ts,也就是说接收一个可变参数的模板列表。那对于这个模板来说呢,在编译的时候就会进行可变参数模板的展开,对吧?那展开之后它就类似于这样的一个格式。那在这个模板列表中呢?将每一个模板一一列出来,包括了audio encoder opus,这些模板把它们都列在template的这个尖框儿里。

那这个时候呢,我们就要考虑一个问题了,那既然我们现在已经知道在这个列表中呢,有这么多的编码器,那我如何能将一个个的编码器获取到呢?对于可变参数模板来说呢,一个通常的办法是通过递归的方式获取,也就是说像下面这样。那将这个模板呢,设置成type na met后边呢,再一个type name点点点ts。那说明什么?说明我们后边这个还是一个可变参数的模板,而第一个呢是一个具体的模板。那它的含义呢,
在这里插入图片描述

就是将原来可变参数模板中的第一项获取到之后呢,把余下的可变参数作为一个新的可变参数模板。传给ts。对吧,这样可变参数列表中就少了一项,然后通过递归的方式,每次取一项,每次取一项,最终呢,将可变参数模板列表中的每一项给它取近。那这就是获取每一个编码器类的方法,它的实现呢?就如我们下边这段代码所展示的,在y8 tc中呢,它定义了一个helper,

对于helper来说。它需要提供两个模板,那第一个模板呢,就是可变参数模板列表中的第一项,那后边儿ts呢,就是余下的可变参数。好,那在这里边,它实现了一个方法,叫APP supported encoders这个API,它有一个参数是audio codecs pack类型的victor。也就是说,我们每获取到一个编码器的信息,都将它的内容呢?放到这个victor中,

那最后呢?这个victor就是一个输出的信息。那在这个函数中呢,它会调t类中的append supported encoders这个t就是一个具体类型,那对于第一个编码器来说呢,就是oppos编码器。对吧,会调用opus编码器的append supported encoders,那通过这个方法呢,把opus编码器相关的信息。保存到specs中,那之后呢?它又会调用hyper下边的呃pad supported encoder,也就是又调回这个函数。那当它再调回这个函数的时候,

这时候这个t变成了谁呢?就变成了scs。对吧,就这样一项一项把它们全部取出来,取出来之后呢,就将每一个编码器的信息保存到specs中。这就是通过可变参数模板来实现工厂方法的一个实例。这个实验啊,实现的非常巧妙,它对于我们理解这段代码来说呢,会造成一定难度。但一旦你把它理解透了之后,你就会觉得它非常的有意思OK?那下面呢?我们再来重新将这个过程啊,
在这里插入图片描述

温故一下。我们来看一个例子,那首先呢,我们通过create peer connection factory这个API,它里边儿的create buildin audio encoder factory。能够知道web rtc指定了它支持的编解码器都有哪些,那其中呢,包括了audio encoder opus。audio encoders CS audio encoder g七二二等等等,对吧?之后呢,我们又介绍了。C加加的可变参数模板,那么rtc呢?正是利用C加加的可变参数模板来实现了音频编码器的工厂方法。

那并且呢,通过递归的方式,将每一个编码器遍历出来,最后呢,将这个编码器的相关信息保存到一个固定的位置。那就如我们这里所展示的,对吧?那每一次递归调用的时候呢?在这个模板中都包含了一个具体的编码器模板。以及一个可变参数模板OK,那在append supported encoder这个API中呢?它就会调用这个具体的,比如说opens的呃pad supported encoder,这个方法将对应的这个编码器的信息保存下来。之后呢,

再调用helper的append supported encoder这个方法,那它又回到这里再取下一个audio encoders CS编码器。再调用它的append supported encoder,把它的信息保存到specs中,对吧?之后呢,是g七二二,那以此类推,就将每一个编码器的信息保存下来了。这就是web rtc获取编码器信息的一个具体的过程OK,那以上呢,就是我们这节课的内容。那有任何的问题呢,你可以到讨论区或者是QQ群里去给我留言,我在那里呢,

给你做相应解答好,谢谢。

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

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

相关文章

《LeetCode力扣练习》代码随想录——字符串(KMP算法学习补充——针对next数组构建的回退步骤进行解释)

《LeetCode力扣练习》代码随想录——字符串(KMP算法学习补充——针对next数组构建的回退步骤进行解释) 学习路径 代码随想录:28. 实现 strStr() CSDN:【详解】KMP算法——多图,多例子(c语言) …

JavaWeb项目中已经导入依赖却报错依赖不存在

问题描述 在使用 Maven Servlet Tomcat 来搭建 JavaWeb 项目时,在 pom.xml 中正确引入了依赖,编码过程中也能够正常使用。但是在启动 Tomcat 之后(启动时或启动后),却报错显示该依赖不存在。 可能原因 pom.xml 的…

缓存穿透问题与解决方案

目录 引言 1. 缓存穿透的原因 1.1 不存在的数据请求 1.2 缓存键设计不当 2. 缓存穿透的影响 2.1 后端系统负载过重 2.2 数据库压力增大 2.3 用户体验降低 3. 解决缓存穿透的方案 3.1 布隆过滤器 3.2 缓存空对象 3.3 热点数据预加载 3.4 异步更新缓存 3.5 缓存击穿…

Java集合核心知识点总结

Java集合概述 从集合特点角度出发,Java集合可分为映射集、和单元素集合。如下图所示,单元素集合类图如下: collection包 : 工具单元素集合我们又可以分为,存储不可重复元素的Set集合,可顺序存储重复元素的List,以及F…

DNS:从域名解析到网络连接

目录 解密 DNS:从域名解析到网络连接的不可或缺 1. DNS的基本工作原理 1.1 本地解析器查询 1.2 递归查询 1.3 迭代查询 1.4 TLD 查询 1.5 权威 DNS 查询 2. DNS的重要性与作用 2.1 地址解析与负载均衡 2.2 网络故障处理与容错 2.3 安全性与防护 3. DNS的…

生产实践:基于K8S的私有化部署解决方案

随着国内数字化转型的加速和国产化进程推动,软件系统的私有化部署已经成为非常热门的话题,因为私有化部署赋予了企业更大的灵活和控制权,使其可以根据自身需求和安全要求定制和管理软件系统。下面分享下我们的基于k8S私有化部署经验。 私有化…

Springboot管理系统数据权限过滤(二)——SQL拦截器

上一节Springboot管理系统数据权限过滤——ruoyi实现方案对数据权限实现方案有了认识,本文将进一步优化权限过滤方案,实现对业务代码零入侵。 回顾上一章中权限方案: 主要是通过注解拦截,拼接好权限脚本后,放到对象变…

每天五分钟计算机视觉:GoogLeNet的核心模型结构——Inception

本文重点 当构建卷积神经网络的时候,我们需要判断我们的过滤器的大小,这往往也作为一个超参数需要我们进行选择。过滤器的大小究竟是 11,33 还是 55,或者要不要添加池化层,这些都需要我们进行选择。而本文介绍的Inception网络的作用就是代替你来决定,把它变成参数的一部…

Improving IP Geolocation with Target-Centric IP Graph (Student Abstract)

ABSTRACT 准确的IP地理定位对于位置感知的应用程序是必不可少的。虽然基于以路由器为中心(router-centric )的IP图的最新进展被认为是前沿的,但一个挑战仍然存在:稀疏IP图的流行(14.24%,少于10个节点&…

界面控件DevExpress .NET MAUI v23.1 - 发布一系列新组件

DevExpress拥有.NET开发需要的所有平台控件,包含600多个UI控件、报表平台、DevExpress Dashboard eXpressApp 框架、适用于 Visual Studio的CodeRush等一系列辅助工具。屡获大奖的软件开发平台DevExpress 今年第一个重要版本v23.1正式发布,该版本拥有众多…

蓝牙模块安全指南:保护你的设备和数据

随着蓝牙技术在各个领域的广泛应用,设备之间的无线连接变得越来越普遍。然而,与此同时,蓝牙连接也面临着潜在的安全风险。本文将为你提供一份蓝牙模块安全指南,帮助你保护设备和数据免受潜在的威胁。 1. 更新至最新蓝牙协议版本&a…

java实现冒泡排序及其动图演示

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。重复这个过程直到整个数列都是按照从小到大的顺序排列。 具体步骤如下: 比较相邻的两个元素,如果前…

swagger的ApiModelProperty设置字段的顺序

需求 让前端可以直接通过swagger就能知道各个字段是什么意思 如何配置 比如,我们设置了ApiModelProperty ApiModelProperty("用户主键")private Long userId;在swagger页面能直接看到注释 但是这个顺序是按照字母排序的,明显不符合我们的要…

鸿蒙Web组件_学习

Web组件概述 Web组件用于在应用程序中显示Web页面内容,为开发者提供页面加载、页面交互、页面调试等能力。 页面加载:Web组件提供基础的前端页面加载的能力,包括加载网络页面、本地页面、Html格式文本数据。页面交互:Web组件提供…

【EI会议征稿】第五届机械仪表与自动化国际学术会议(ICMIA 2024)

第五届机械仪表与自动化国际学术会议(ICMIA 2024) The 5th International Conference on Mechanical Instrumentation and Automation 2024年第五届机械仪表与自动化国际学术会议(ICMIA 2024)定于2024年4月5-7日在中国武汉隆重…

通俗易懂:插入排序算法全解析(C++)

插入排序算法是一种简单直观的排序算法,它的原理就像我们玩扑克牌时整理手中的牌一样。下面我将用通俗易懂的方式来解释插入排序算法的工作原理。 假设我们手上有一副无序的扑克牌,我们的目标是将它们从小到大排列起来。插入排序算法的思想是&#xff0…

Kibana搜索数据利器:KQL与Lucene

文章目录 一、搜索数据二、KQL查询1、字段搜索2、逻辑运算符3、通配符4、存在性检查5、括号 三、Lucene查询1、字段搜索2、逻辑运算符3、通配符4、范围搜索5、存在性检查6、括号 四、总结 一、搜索数据 默认情况下,您可以使用 Kibana 的标准查询语言,该…

el-table自定义表格数据

如上所示: 表格内的数据是:当前班级所在名次段的人数 / 当前班级1至n名的累计人数 5/12 也就是 5/75 需要变更为: 截至到当前名次段总人数(上次考试) / 截至到当前名次段总人数(本次考试&#xff09…

Electron 跨平台打包

最近利用 Electron 制作跨平台安装包,记录步骤,踩坑多多。 首先,一步步搭建项目 一、搭建环境 初始化 package.json,这里要求 node 版本不低于14.16,我用的 v14.16.0,16版本在 Linux 下容易出现安装依赖…

✺ch2——OpenGL图像管线

目录 基于C图形应用&管线概览OpenGL类型第一个C/OpenGL应用程序◍API (1) GLSL类型着色器——画一个点的程序◍API (2)◍API (3) 栅格化像素操作——Z-buffer算法检测 OpenGL 和 GLSL 错误◍API (4) 从顶点来构建一个三角形场景动画◍API (5) OpenGL某些方面的数值—…