6.5.编解码器信息的收集

那在上节课中呢?我向你介绍了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.mzph.cn/news/222136.shtml

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

相关文章

孩子都能学会的FPGA:第三十一课——用FPGA实现SPI主机发送数据

(原创声明:该文是作者的原创,面向对象是FPGA入门者,后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门,作者不光让大家知其然,还要让大家知其所以然!每个工程作者都搭建了全自动化的仿…

安装spaCy及语言包下载安装

文章目录 1. spaCy的安装1.1 安装spaCy包方式1 : 通过pip / conda命令安装方式2 : 通过离线导入 1.2 安装语言模型方式1 : 通过pip / conda命令安装方式2 : 通过离线导入 2. 常见问题a. 版本问题 3. 参考文档 关注公众号:『AI学习星球』 回复:遥感图像语…

使用podman管理容器

本章主要介绍使用 podman 管理容器。 了解什么是容器,容器和镜像的关系安装和配置podman拉取和删除镜像给镜像打标签导出和导入镜像创建和删除镜像数据卷的使用管理容器的命令使用普通用户管理容器 对于初学者来说,不太容易理解什么是容器,…

论文阅读《Parameterized Cost Volume for Stereo Matching》

论文地址:https://openaccess.thecvf.com/content/ICCV2023/papers/Zeng_Parameterized_Cost_Volume_for_Stereo_Matching_ICCV_2023_paper.pdf 源码地址:https://github.com/jiaxiZeng/Parameterized-Cost-Volume-for-Stereo-Matching 概述 现有的立体匹…

【C语言】操作符详解(四):结构成员访问操作符

结构成员访问操作符 结构体 ⭐C语言已经提供了内置类型,如: char、short、int、long、float、double等,但是只有这些内置类型还是不够的,假设我想描述学生,描述一本书,这时单一的内置类型是不行的。描述一个学生需要名…

MATLAB 最小二乘空间直线拟合 (37)

MATLAB 最小二乘空间直线拟合 (37) 一、算法介绍二、算法实现1.代码一、算法介绍 对于空间中的这样一组点:大致呈直线分布,散乱分布在直线左右, 我们可采用最小二乘方法拟合直线,使用下面的代码可以得到图中的结果。(其中图片中的点解释和具体的实现代码如下所示) C++…

云计算:Vmware 安装 FusionCompute

目录 一、理论 1.FusionCompute 二、实验 1.Vmware 安装 FusionCompute(CNA) 2.Vmware 安装 FusionCompute(VRM) 三、问题 1. VRM-WEB登录失败 2.Windows cmd中无法ping通虚拟机 一、理论 1.FusionCompute (…

孩子还是有一颗网安梦——Bandit通关教程:Level 13 → Level 14

🕵️‍♂️ 专栏《解密游戏-Bandit》 🌐 游戏官网: Bandit游戏 🎮 游戏简介: Bandit游戏专为网络安全初学者设计,通过一系列级别挑战玩家,从Level0开始,逐步学习基础命令行和安全概念…

TrustZone之强制隔离

TrustZone有时被称为一个强制执行的保护系统。请求者表示其访问的安全性,而内存系统决定是否允许该访问。内存系统基于何种方式进行检查呢? 在大多数现代系统中,内存系统的检查是由互连完成的。例如,Arm NIC-400允许系统设计人员为每个连接的完成者指定以下内容: • 安全…

孩子还是有一颗网安梦——Bandit通关教程:Level 12 → Level 13

🕵️‍♂️ 专栏《解密游戏-Bandit》 🌐 游戏官网: Bandit游戏 🎮 游戏简介: Bandit游戏专为网络安全初学者设计,通过一系列级别挑战玩家,从Level0开始,逐步学习基础命令行和安全概念…

飞轮储能一次调频并网三机九节点系统,虚拟惯性和下垂控制,也可加入虚拟同步机VSG控制,飞轮储能容量可调,系统频率50Hz,离散模型

5MW飞轮储能一次调频并网三机九节点系统,虚拟惯性和下垂控制,也可加入虚拟同步机VSG控制,飞轮储能容量可调,系统频率50Hz,离散模型,仿真运行速度快。 飞轮储能变流器采用双PWM环设计,并网电压电…

优先考虑静态成员类

在Java中,静态成员类(static nested class)是一种嵌套在另一个类中的类,且被声明为静态。静态成员类不依赖于外部类的实例,可以直接通过外部类的类名来访问。 优先考虑使用静态成员类的情况通常是当这个类与外部类的实…

ShenYu网关注册中心之HTTP注册原理

文章目录 1、客户端注册流程1.1、读取配置1.1.1、用于注册的 HttpClientRegisterRepository1.1.2、用于扫描构建 元数据 和 URI 的 SpringMvcClientEventListener 1.2、扫描注解,注册元数据和URI1.2.1、构建URI并写入Disruptor1.2.2、构建元数据并写入Disruptor1.2.…

【系统架构】集群、分布式概念及系统架构演进过程

集群、分布式概念: 对食物没有太高要求的人在肚子饿的时候一般都会选择去兰州拉面、沙县小吃等小饭馆,这类小饭馆有个很显著的特点:洗菜、切菜、炒菜都是同一个人完成,如果厨子不舒服可能饭馆还会歇业。而一些人流量较大的饭馆的分…

Axure的动态面板

目录 动态面板 什么是Auxre动态模板 动态模板的步骤 应用场景 实战案例 轮播图 多功能登录界面 主界面左侧菜单栏 动态面板 什么是Auxre动态模板 动态面板是Axure中的一个重要功能,它允许用户创建可交互的页面,并模拟用户与页面的交互。通过添加元素…

智能守护,数据安全稳中求胜!上海迅软DSE助力家具家电行业引领潮流!

随着中国经济的蓬勃发展,家具家电企业正迎来“精品制造”的时代,业内竞争日益激烈。为了提升产品竞争力、扩大市场占有率,企业亟需加强对自主品牌的安全建设,确保品牌的自主知识产权、产品生产资料以及销售信息等核心数据不受泄漏…

文本处理工具doctran(集成LLM和NLP库)

今天给大家推荐一款文本处理工具,可以Extract、Redact、Summarize、Refine、Translate、Interrogate,这个工具就是文档转换框架doctran。 欢迎关注公众号 doctran基于OpenAI的GPT模型和开源的NLP库来剖析文本数据。该工具也可以在LangChain框架document…

【MODBUS】Modbus是什么?

Modbus协议,从字面理解它包括Mod和Bus两部分,首先它是一种bus,即总线协议,和12C、SP|类似,总线就意味着有主机,有从机,这些设备在同一条总线上。 Modbus支持单主机,多个从机&#xf…

Python (八)网络编程

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一份大厂面试资料《史上最全大厂面试题》,Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

最新CRMEB商城源码开源版v5.2.2版本+前端uniapp

CRMEB开源商城系统是一款全开源可商用的系统,前后端分离开发,全部100%开源,在小程序、公众号、H5、APP、PC端都能用,使用方便,二开方便!安装使用也很简单!使用文档、接口文档、数据字典、二开文…