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群里去给我留言,我在那里呢,

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智能优化算法应用:基于旗鱼算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于旗鱼算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于旗鱼算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.旗鱼算法4.实验参数设定5.算法结果6.参考文献7.MA…

优先考虑静态成员类

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

一文带你了解UI自动化测试框架

PythonSeleniumUnittestDdtHTMLReport分布式数据驱动自动化测试框架结构 1、Business:公共业务模块,如登录模块,可以把登录模块进行封装供调用 ------login_business.py from Page_Object.Common_Page.login_page import Login_Page from H…

探秘闭包:隐藏在函数背后的小秘密(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

C# 图解教程 第5版 —— 第17章 转换

文章目录 17.1 什么是转换17.2 隐式转换17.3 显示转换和强制转换17.4 转换的类型17.5 数字的转换17.5.1 隐式数字转换17.5.2 溢出检测上下文17.5.3 显示数字转换 17.6 引用转换17.6.1 隐式引用转换17.6.2 显式引用转换17.6.3 有效显式引用转换 17.7 装箱转换17.7.1 装箱是创建副…

小程序 -网络请求post/get

1.1网络请求的概念(post和get) 1.2步骤 1.3 应用函数 js里面写,用bindtap绑在控件上,就不讲了 实例代码: //发起get数据请求get_info(){wx.request({url:https://www.escook.cn/api/get,//请求的接口地址,必须基于https协议//请求的方式met…

SpringBoot的Starter自动化配置,自己编写配置maven依赖且使用及短信发送案例

目录 一、Starter机制 1. 是什么 2. 有什么用 3. 应用场景 二、短信发送案例 1. 创建 2. 配置 3. 编写 4. 形成依赖 6. 其他项目的使用 每篇一获 一、Starter机制 1. 是什么 SpringBoot中的starter是一种非常重要的机制(自动化配置),能够抛弃以前繁杂…

【五】Python 代理模式

文章目录 5.1 代理模式概述5.1.1 代理介绍5.1.2 代理模式的作用 5.2 代理模式的UML类图5.3 了解不同类型的代理5.3.1虚拟代理5.3.2 远程代理5.3.3 保护代理5.3.4 智能代理 5.4 现实世界中的代理模式5.5 代理模式的优点5.6 门面模式和代理模式之间的比较 5.1 代理模式概述 5.1.…

卷积神经网络(含案例代码)

概述 卷积神经网络(Convolutional Neural Network,CNN)是一类专门用于处理具有网格结构数据的神经网络。它主要被设计用来识别和提取图像中的特征,但在许多其他领域也取得了成功,例如自然语言处理中的文本分类任务。 C…

Paper Reading: (CCVC) 基于冲突的半监督语义分割跨视图一致性

目录 简介目标/动机工作重点方法CVC: 跨视图一致性CPL: 基于冲突的伪标记 实验设置comparison with SOTAAblation 总结 简介 题目:《Conflict-Based Cross-View Consistency for Semi-Supervised Semantic Segmentation》, CVPR’23, 基于冲突的半监督语…

HPM5300系列--第二篇 Visual Studio Code开发环境以及多种调试器调试模式

一、目的 在博文《HPM5300系列--第一篇 命令行开发调试环境搭建》、《HPM6750系列--第四篇 搭建Visual Studio Code开发调试环境》中我们介绍了命令行方式开发环境,也介绍了HPM6750evkmini开发板如何使用Visual Studio Code进行开发调试(其中调试方式使用…

AcWing 338. 计数问题

文章目录 题目描述问题分析代码 题目描述 AcWing 338.计数问题 给定两个整数 a a a 和 b b b, 求 a a a 和 b b b中所有数字中0~9的出现次数 数据范围&#xff1a; 0 < a, b < 100000000 输入格式&#xff1a; 输入包含多组测试数据。 每组测试数据占一行&#xff0c;包…

AI会干掉美图秀秀们吗?

网上流传着这样一个传说&#xff0c;亚洲有三大“邪术”&#xff0c;韩国整容术、日本化妆术&#xff0c;还有震惊世界的中国PS 术。虽然是网友的戏称&#xff0c;但也反映了PS美图技术在国内盛行一时。 而说起美图技术就不得不提到美图公司&#xff0c;但美图公司近些年的日子…

影视动画行业发展现状与方向:AI技术推动动画工业化体系新变革

工业化体系 是国产动画强国的必经之路 中国动画的百年历程不仅是创作者们展现艺术才华的历程&#xff0c;也是一代代中国动画人不懈追求动画工业体系建设的历程。 为什么现在的中国动画需要建立工业化体系呢&#xff1f; 举个例子&#xff0c;在建立工业化体系之前&#xff…

推荐一个小而全的第三方登录开源组件

大家好&#xff0c;我是 Java陈序员。 我们在企业开发中&#xff0c;常常需要实现登录功能&#xff0c;而有时候为了方便&#xff0c;就需要集成第三方平台的授权登录。如常见的微信登录、微博登录等&#xff0c;免去了用户注册步骤&#xff0c;提高了用户体验。 为了业务考虑…

网络基础(十):DHCP原理与配置

目录 1、DHCP的概念 2、使用DHCP的优势 3、DHCP的分配方式 4、可分配的地址信息 5、DHCP的工作原理&#xff08;租约过程&#xff09; 6、DHCP动态配置主机地址&#xff08;使用eNSP软件配置&#xff09; 1、DHCP的概念 DHCP(Dynamic HostConfiguration Protocol&#x…

SLAM学习——相机模型(针孔+鱼眼)

针孔相机模型 针孔相机模型是很常用&#xff0c;而且有效的模型&#xff0c;它描述了一束光线通过针孔之后&#xff0c;在针孔背面投影成像的关系&#xff0c;基于针孔的投影过程可以通过针孔和畸变两个模型来描述。 模型中有四个坐标系&#xff0c;分别为world&#xff0c;c…

vite(一)——基本了解和依赖预构建

文章目录 一、什么是构建工具&#xff1f;1.为什么使用构建工具&#xff1f;2.构建工具的作用&#xff1f;3.构建工具怎么用&#xff1f; 二、经典面试题&#xff1a;webpack和vite的区别1.编译方式不同2.基础概念不同3.开发效率不同4.扩展性不同5.应用场景不同6.总结&#xff…

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

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

【Python】conda镜像配置,.condarc文件详解,channel镜像

1. conda 环境 安装miniconda即可&#xff0c;Miniconda 安装包可以到 http://mirrors.aliyun.com/anaconda/miniconda/ 下载。 .condarc是conda 应用程序的配置文件&#xff0c;在用户家目录&#xff08;windows&#xff1a;C:\users\username\&#xff09;&#xff0c;用于…