当前位置: 首页 > news >正文

WebRTC音频 03 - 实时通信框架

WebRTC音频01 - 设备管理
WebRTC音频 02 - Windows平台设备管理
WebRTC音频 03 - 实时通信框架(本文)
WebRTC音频 04 - 关键类
WebRTC音频 05 - 音频采集编码

一、前言:

前面介绍了音频设备管理,并且以windows平台为例子,介绍了ADM相关的类,以及必须用到的重要API,本文我们分析下,在一个音视频呼叫过程中,音频是如何参与其中的,都有哪些成员参与其中。

二、呼叫时序图:

先回顾下总体呼叫流程,由大到小分析,避免看半天代码不知道自己在哪儿!

在这里插入图片描述

可以看出,呼叫过程中,先要创建非常重要的类PeerConnection,接着进行媒体协商,最后选择进行p2p或者turn这条路;我们现在要分析,这个过程中音频要做哪些事,这件事分别是在上面总流程的哪个位置。

三、音频数据流转:

我们先猜想下,整个过程中应该做什么?是不是下图这样?

在这里插入图片描述

标注红色的就是我们关心的。

四、具体到每个音频模块

在这里插入图片描述

  • 初始化阶段(图中粉色线):

    1. 这个流程之前分析过,从Session层开始创建一个会话,就会创建一个PeerConnection,然后就是创建音频引擎,接着创建ADM;
    2. adm创建过程中会创建AudioDeviceModuleGeneric的具体对象(windows平台就是AudioDeviceWindowsCore,下文本人全都写AudioDeviceModuleGeneric,就代表AudioDeviceWindowsCore);
  • 数据发送阶段(图中绿色线):

    1. AudioDeviceModuleGeneric对象从麦克风采集到数据,并送给AudioDeviceBuffer,等待发送;
    2. 交给AudioTransport模块处理;(这里面主要是经过 AudioProcess 模块进行3A处理)
    3. 交给Call模块的 AudioSendStream;
    4. 交给ACM模块的Encoder进行编码;
    5. 交给网络模块Transport进行发送;
  • 数据接收阶段(图中蓝色线):

    1. 从网络模块接收数据,送给Call模块的队列Queue进行缓存;
    2. 慢慢交给AudioReceiveStream进行处理;
    3. 交给ACM模块的Decoder进行解码;
    4. 解码之后交给在AudioReceiveStream模块继续缓存起来;(因为音频播放有一个单独的线程,扬声器会定时来缓存里面取,而不是我们主动送)
  • 数据播放阶段(图中黑色线):

    1. AudioDeviceModuleGeneric对象调用AudioDeviceBuffer相关接口获取数据;
    2. 调用AudioTransport相关接口获取数据(这里面主要是混音模块Mixer,可能同时获得1路或者多路音频,混成1路);
    3. AudioTransport调用1个或者多个AudioReceiveStream中分别取出一定长度的PCM数据;(webrtc就是10ms)
    4. 上面三步完成了调用之后,数据就会按照AudioReceiveStream->AudioTransport(mixer)->AudioDeviceBuffer->AudioDeviceModuleGeneric对象,最终通过扬声器播放出来;

总结:

  1. Call模块是每个session一个;
  2. ADM和AudioTransport里面的AudioProcess、Mixer都是全局唯一的,因为Mixer这种是瞬间处理的,不保存数据,因此,所有的Call模块共用同一个;
  3. 使用AudioState(可以理解成引擎层的上下文)管理AudioTransport和ADM虽然增加了一层,但是对于上层使用媒体引擎的人来说就非常简单了,我只需要和AudioState打交道;

五、类图:

关键模块类图如下:

在这里插入图片描述

  • adm_:就是AudioDeviceModule,对音视频设备进行管理,比如,从麦克风采集音频,让扬声器播放数据;

  • encoder_factory_:音频编码器工厂,创建编码器时候使用;

  • decoder_factory_:音频解码器工厂;

  • audio_mixer_:音频混音器,比如将多路输入流混成一路,送给扬声器播放;

  • apm_:专门用来处理3A问题;

  • audio_state_:表面看是音频状态管理,实则为音频流的管理;

  • send_codecs:音频编码器管理;

  • recv_codecs:音频解码器管理;

  • channels:WebRtcMediaVoiceChannel的集合;一个对应SDP中一个m行;

六、关键类对象创建时机:

在我们开始呼叫音视频通话时候,点击PeerConnectionClient弹出的connect按钮时候,会调用Conductor::InitializePeerConnection(),先看看引擎的初始化时机:

在这里插入图片描述

然后再看看PeerConnectionFactory::Create再调用 ConnectionContext::Create,而ConnectionContext::Create之后主要干了下面几件事情:

在这里插入图片描述

备注:

  1. 发现扬声器和麦克风ADM这一层逻辑基本一致。

  2. 并且adm和AudioDeviceWindowsCore中间还有个传话筒AudioDeviceModuleImpl我没有画出来,就是转手调用AudioDeviceWindowsCore而已。

  3. 向adm注册一个回调 audio_state()->audio_transport,用于接收将来产生的音视频数据;

  4. 创建PeerConnectionFactory之前已经创建了四个编解码器的Factory;

  5. 构造Denpendenices的时候,就实例化了一个APM模块,并进行了初始化;

  6. 我们前面构造的MediaEngineDependencies是PeerConnectionFactoryDependencies的一个成员,使用media_engine保存;(里面主要是三大线程、call_factory、media_engine(看后面代码,这个主要是接收MediaDependecies的));

  7. 然后是创建音视频引擎;

  8. 引擎创建好之后,对引擎做一些必要的初始化CreateModularPeerConnectionFactory:

    1. 对pc_factory进行初始化;
      1. BasicNetworkManager:主要是管理网卡的;
      2. BasicPacketSocketFactory:也就是Socekt工厂,主要创建各种各样的socket;
      3. 创建ChannelManager(它是连接编解码器的),同时会调用Init,里面会调用media_engine->Init来初始化之前创建的媒体引擎;

七、总结:

本文主要是介绍了音频各个模块在整个呼叫过程中所处的角色,以及何时创建(创建时机)、创建的什么样(类图);主要从总体分析,如果要具体到每个类,后续会根据业务场景再做分析,比如:采集过程中用到哪几个类,具体调用哪个函数等等,关注我,不迷路!

扫描关注,最早拿到一手资源:
在这里插入图片描述

相关文章:

WebRTC音频 03 - 实时通信框架

WebRTC音频01 - 设备管理 WebRTC音频 02 - Windows平台设备管理 WebRTC音频 03 - 实时通信框架(本文) WebRTC音频 04 - 关键类 WebRTC音频 05 - 音频采集编码 一、前言: 前面介绍了音频设备管理,并且以windows平台为例子,介绍了ADM相关的类…...

Maven陷阱揭秘:避开Java项目构建的10大常见误区

文章目录 引言基础知识核心概念示例演示实际应用深入与最佳实践常见问题解答结语学习资源互动环节 引言 Maven是Java项目中广泛使用的项目管理和构建自动化工具。它通过一个中央仓库和依赖管理系统,简化了项目的构建和依赖管理。理解Maven的依赖机制对于构建和维护…...

基础数据结构思路写法记录,便于回顾

重思路非代码。基础的思路搞懂了&#xff0c;变形题目顺着思考基本都能写出来&#xff01; 二分查找 int binarySearch(vector<int> &nums, int target) {// write your code hereif (nums.empty()) {return -1;}int start 0;int end nums.size() - 1;while (star…...

基于AI的量化投资框架Qlib的Python依赖包pyqlib安装问题记录

版权声明&#xff1a;本文为博主原创文章&#xff0c;如需转载请贴上原博文链接&#xff1a;基于AI的量化投资框架Qlib的Python依赖包pyqlib安装问题记录-CSDN博客 前言&#xff1a;最近想使用Qlib来做量化交易的策略研究&#xff0c;但是第一步就卡在了安装pyqlib依赖包&#…...

《语音识别方案选择》

《语音识别方案选择》 一、引言二、语音识别技术概述&#xff08;一&#xff09;语音识别的基本原理&#xff08;二&#xff09;语音识别技术的发展历程&#xff08;三&#xff09;语音识别技术的分类1、基于声学模型的语音识别2、基于语言模型的语音识别3、端到端的语音识别 三…...

目标检测数据集图片及标签同步裁剪

目录 前言 具体方法 使用介绍 完整代码 前言 在目标检测任务中&#xff0c;模型的训练依赖于大量高质量的标注数据。然而&#xff0c;获取足够多的标注数据集往往代价高昂&#xff0c;并且某些情况下&#xff0c;数据集中的样本分布不均衡&#xff0c;这会导致模型的泛化能…...

【设计模式-简单工厂】

定义 简单工厂模式&#xff08;Simple Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;用于通过一个工厂类来创建某个产品类的实例&#xff0c;而不直接在客户端&#xff08;调用方&#xff09;中实例化对象。 这种模式的主要思想是将对象的创建逻辑集中在一个…...

多个版本的GCC(GNU编译器集合)可以同时安装并存

在Ubuntu系统中&#xff0c;多个版本的GCC&#xff08;GNU编译器集合&#xff09;可以同时安装并存。GCC是编译C、C以及其他编程语言程序的重要工具&#xff0c;不同的项目可能需要不同版本的GCC来确保兼容性。 为什么需要多个GCC版本 项目依赖&#xff1a;不同的软件项目可能…...

量子纠错--shor‘s 码

定理1 (量子纠错的条件) C是一组量子编码&#xff0c;P是映射到C上的投影算子。假设是一个算子元素描述的量子操作&#xff0c;那么基于量子编码C&#xff0c;存在一个能对抗描述的噪声的纠错操作R的充要条件是 对某个复元素厄米矩阵成立。 将算子元素称为导致的错误。如果这样…...

机器学习2

一、模型评估方法 1.1 K折交叉验证法&#xff08;K-Fold Cross Validation&#xff09; 1.1.1 定义 K折交叉验证法是一种用于评估模型性能的技术。它将数据集分为K个相等的子集&#xff0c;模型会轮流使用一个子集作为测试集&#xff0c;其余K-1个子集作为训练集。这个过程会…...

二分查找_ x 的平方根搜索插入位置山脉数组的峰顶索引

x 的平方根 在0~X中肯定有数的平方大于X&#xff0c;这是肯定的。我们需要从中找出一个数的平方最接近X且不大于X。0~X递增&#xff0c;它们的平方也是递增的&#xff0c;这样我们就可以用二分查找。 我们找出的数的平方是<或者恰好X&#xff0c;所以把0~X的平方分为<X …...

汽车建模用什么软件最好?汽车建模渲染建议!

在汽车建模和渲染领域&#xff0c;选择合适的软件对于实现精确的设计与高质量的视觉效果至关重要。那么不少的汽车设计师如何选择合适的建模软件与渲染方案呢&#xff0c;一起来简单看看吧&#xff01; 一、汽车建模用软件推荐 1、Alias Autodesk旗下的Alias系列软件是汽车设…...

蘑菇分类识别数据集(猫脸码客 第222期)

蘑菇分类识别文本/图像数据集 蘑菇&#xff0c;作为一种广泛分布于全球的真菌&#xff0c;隶属于伞菌目伞菌亚门蘑菇科蘑菇属&#xff0c;拥有众多别名&#xff0c;如白蘑菇、洋蘑菇等。其不仅是世界上人工栽培最广泛、产量最高、消费量最大的食用菌品种之一&#xff0c;还在许…...

长短期记忆网络(Long Short-Term Memory,LSTM)

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 长短期记忆网络&#xff08;Long Short-Term Memory&#xff0c;简称LSTM&#xff09;是一种特殊的循环神经网络&#xff08;Recurrent Neural Network&#xff0c;简称RNN&#xff09;架构&#…...

WHAT - 引入第三方组件或项目使用需要注意什么

目录 1. 功能匹配2. 社区与维护3. 兼容性4. 性能5. 易用性6. 安全性7. 授权和许可证8. 国际化支持9. 依赖性10. 未来维护 在前端开发过程中引入第三方组件或项目时&#xff0c;应该从以下几个方面进行考虑&#xff0c;以确保引入的组件能够有效解决问题并适合长期维护&#xff…...

原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)正式发布

华为于10月22日19:00举办“原生鸿蒙之夜暨华为全场景新品发布会”。此次发布会推出全新的原生鸿蒙操作系统HarmonyOS NEXT&#xff08;HarmonyOS 5&#xff09;以及nova 13、WATCH Ultimate、MatePad Pro等新品。 据介绍&#xff0c;此前已经发布过的鸿蒙系统&#xff0c;由于系…...

WindTerm配置快捷键Ctrl+C和Ctrl+V

WindTerm配置快捷键CtrlC和CtrlV 平时使用ssh和sftp连接的时候&#xff0c;经常使用windterm&#xff0c; 但是windterm里面找不到相关的快捷键设置&#xff0c; 因为操作习惯&#xff0c;想把CtrlC和CtrlV分别配置为复制和粘贴&#xff0c;其他的快捷键操作可以按照该方法进…...

AOP学习

corol调用serverce不在是直接调用的是调用底层代理对象&#xff0c;由代理对象统一帮我们处理 AOP常见概念 通知类型 切面顺序...

【ubuntu18.04】ubuntu18.04升级cmake-3.29.8及还原系统自带cmake操作说明

参考链接 cmake升级、更新&#xff08;ubuntu18.04&#xff09;-CSDN博客 升级cmake操作说明 下载链接 Download CMake 下载版本 下载软件包 cmake-3.30.3-linux-x86_64.tar.gz 拷贝软件包到虚拟机 cp /var/run/vmblock-fuse/blockdir/jrY8KS/cmake-3.29.8-linux-x86_64…...

利用Docker搭建一套Mycat2+MySQL8一主一从、读写分离的最简单集群(保姆教程)

文章目录 1、Mycat介绍1.1、mycat简介1.2、mycat重要概念1.3、Mycat1.x与Mycat2功能对比1.2、主从复制原理 2、前提准备3、集群规划4、安装和配置mysql主从复制4.1、master节点安装mysql8容器4.2、slave节点安装mysql8容器4.2、配置主从复制4.3、测试主从复制配置 5、安装mycat…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...