WebRTC音频 03 - 实时通信框架
WebRTC音频01 - 设备管理
WebRTC音频 02 - Windows平台设备管理
WebRTC音频 03 - 实时通信框架(本文)
WebRTC音频 04 - 关键类
WebRTC音频 05 - 音频采集编码
一、前言:
前面介绍了音频设备管理,并且以windows平台为例子,介绍了ADM相关的类,以及必须用到的重要API,本文我们分析下,在一个音视频呼叫过程中,音频是如何参与其中的,都有哪些成员参与其中。
二、呼叫时序图:
先回顾下总体呼叫流程,由大到小分析,避免看半天代码不知道自己在哪儿!

可以看出,呼叫过程中,先要创建非常重要的类PeerConnection,接着进行媒体协商,最后选择进行p2p或者turn这条路;我们现在要分析,这个过程中音频要做哪些事,这件事分别是在上面总流程的哪个位置。
三、音频数据流转:
我们先猜想下,整个过程中应该做什么?是不是下图这样?

标注红色的就是我们关心的。
四、具体到每个音频模块:

-
初始化阶段(图中粉色线):
- 这个流程之前分析过,从Session层开始创建一个会话,就会创建一个PeerConnection,然后就是创建音频引擎,接着创建ADM;
- adm创建过程中会创建AudioDeviceModuleGeneric的具体对象(windows平台就是AudioDeviceWindowsCore,下文本人全都写AudioDeviceModuleGeneric,就代表AudioDeviceWindowsCore);
-
数据发送阶段(图中绿色线):
- AudioDeviceModuleGeneric对象从麦克风采集到数据,并送给AudioDeviceBuffer,等待发送;
- 交给AudioTransport模块处理;(这里面主要是经过 AudioProcess 模块进行3A处理)
- 交给Call模块的 AudioSendStream;
- 交给ACM模块的Encoder进行编码;
- 交给网络模块Transport进行发送;
-
数据接收阶段(图中蓝色线):
- 从网络模块接收数据,送给Call模块的队列Queue进行缓存;
- 慢慢交给AudioReceiveStream进行处理;
- 交给ACM模块的Decoder进行解码;
- 解码之后交给在AudioReceiveStream模块继续缓存起来;(因为音频播放有一个单独的线程,扬声器会定时来缓存里面取,而不是我们主动送)
-
数据播放阶段(图中黑色线):
- AudioDeviceModuleGeneric对象调用AudioDeviceBuffer相关接口获取数据;
- 调用AudioTransport相关接口获取数据(这里面主要是混音模块Mixer,可能同时获得1路或者多路音频,混成1路);
- AudioTransport调用1个或者多个AudioReceiveStream中分别取出一定长度的PCM数据;(webrtc就是10ms)
- 上面三步完成了调用之后,数据就会按照AudioReceiveStream->AudioTransport(mixer)->AudioDeviceBuffer->AudioDeviceModuleGeneric对象,最终通过扬声器播放出来;
总结:
- Call模块是每个session一个;
- ADM和AudioTransport里面的AudioProcess、Mixer都是全局唯一的,因为Mixer这种是瞬间处理的,不保存数据,因此,所有的Call模块共用同一个;
- 使用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之后主要干了下面几件事情:

备注:
-
发现扬声器和麦克风ADM这一层逻辑基本一致。
-
并且adm和AudioDeviceWindowsCore中间还有个传话筒AudioDeviceModuleImpl我没有画出来,就是转手调用AudioDeviceWindowsCore而已。
-
向adm注册一个回调 audio_state()->audio_transport,用于接收将来产生的音视频数据;
-
创建PeerConnectionFactory之前已经创建了四个编解码器的Factory;
-
构造Denpendenices的时候,就实例化了一个APM模块,并进行了初始化;
-
我们前面构造的MediaEngineDependencies是PeerConnectionFactoryDependencies的一个成员,使用media_engine保存;(里面主要是三大线程、call_factory、media_engine(看后面代码,这个主要是接收MediaDependecies的));
-
然后是创建音视频引擎;
-
引擎创建好之后,对引擎做一些必要的初始化CreateModularPeerConnectionFactory:
- 对pc_factory进行初始化;
- BasicNetworkManager:主要是管理网卡的;
- BasicPacketSocketFactory:也就是Socekt工厂,主要创建各种各样的socket;
- 创建ChannelManager(它是连接编解码器的),同时会调用Init,里面会调用media_engine->Init来初始化之前创建的媒体引擎;
- 对pc_factory进行初始化;
七、总结:
本文主要是介绍了音频各个模块在整个呼叫过程中所处的角色,以及何时创建(创建时机)、创建的什么样(类图);主要从总体分析,如果要具体到每个类,后续会根据业务场景再做分析,比如:采集过程中用到哪几个类,具体调用哪个函数等等,关注我,不迷路!
扫描关注,最早拿到一手资源:

相关文章:
WebRTC音频 03 - 实时通信框架
WebRTC音频01 - 设备管理 WebRTC音频 02 - Windows平台设备管理 WebRTC音频 03 - 实时通信框架(本文) WebRTC音频 04 - 关键类 WebRTC音频 05 - 音频采集编码 一、前言: 前面介绍了音频设备管理,并且以windows平台为例子,介绍了ADM相关的类…...
Maven陷阱揭秘:避开Java项目构建的10大常见误区
文章目录 引言基础知识核心概念示例演示实际应用深入与最佳实践常见问题解答结语学习资源互动环节 引言 Maven是Java项目中广泛使用的项目管理和构建自动化工具。它通过一个中央仓库和依赖管理系统,简化了项目的构建和依赖管理。理解Maven的依赖机制对于构建和维护…...
基础数据结构思路写法记录,便于回顾
重思路非代码。基础的思路搞懂了,变形题目顺着思考基本都能写出来! 二分查找 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安装问题记录
版权声明:本文为博主原创文章,如需转载请贴上原博文链接:基于AI的量化投资框架Qlib的Python依赖包pyqlib安装问题记录-CSDN博客 前言:最近想使用Qlib来做量化交易的策略研究,但是第一步就卡在了安装pyqlib依赖包&#…...
《语音识别方案选择》
《语音识别方案选择》 一、引言二、语音识别技术概述(一)语音识别的基本原理(二)语音识别技术的发展历程(三)语音识别技术的分类1、基于声学模型的语音识别2、基于语言模型的语音识别3、端到端的语音识别 三…...
目标检测数据集图片及标签同步裁剪
目录 前言 具体方法 使用介绍 完整代码 前言 在目标检测任务中,模型的训练依赖于大量高质量的标注数据。然而,获取足够多的标注数据集往往代价高昂,并且某些情况下,数据集中的样本分布不均衡,这会导致模型的泛化能…...
【设计模式-简单工厂】
定义 简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,用于通过一个工厂类来创建某个产品类的实例,而不直接在客户端(调用方)中实例化对象。 这种模式的主要思想是将对象的创建逻辑集中在一个…...
多个版本的GCC(GNU编译器集合)可以同时安装并存
在Ubuntu系统中,多个版本的GCC(GNU编译器集合)可以同时安装并存。GCC是编译C、C以及其他编程语言程序的重要工具,不同的项目可能需要不同版本的GCC来确保兼容性。 为什么需要多个GCC版本 项目依赖:不同的软件项目可能…...
量子纠错--shor‘s 码
定理1 (量子纠错的条件) C是一组量子编码,P是映射到C上的投影算子。假设是一个算子元素描述的量子操作,那么基于量子编码C,存在一个能对抗描述的噪声的纠错操作R的充要条件是 对某个复元素厄米矩阵成立。 将算子元素称为导致的错误。如果这样…...
机器学习2
一、模型评估方法 1.1 K折交叉验证法(K-Fold Cross Validation) 1.1.1 定义 K折交叉验证法是一种用于评估模型性能的技术。它将数据集分为K个相等的子集,模型会轮流使用一个子集作为测试集,其余K-1个子集作为训练集。这个过程会…...
二分查找_ x 的平方根搜索插入位置山脉数组的峰顶索引
x 的平方根 在0~X中肯定有数的平方大于X,这是肯定的。我们需要从中找出一个数的平方最接近X且不大于X。0~X递增,它们的平方也是递增的,这样我们就可以用二分查找。 我们找出的数的平方是<或者恰好X,所以把0~X的平方分为<X …...
汽车建模用什么软件最好?汽车建模渲染建议!
在汽车建模和渲染领域,选择合适的软件对于实现精确的设计与高质量的视觉效果至关重要。那么不少的汽车设计师如何选择合适的建模软件与渲染方案呢,一起来简单看看吧! 一、汽车建模用软件推荐 1、Alias Autodesk旗下的Alias系列软件是汽车设…...
蘑菇分类识别数据集(猫脸码客 第222期)
蘑菇分类识别文本/图像数据集 蘑菇,作为一种广泛分布于全球的真菌,隶属于伞菌目伞菌亚门蘑菇科蘑菇属,拥有众多别名,如白蘑菇、洋蘑菇等。其不仅是世界上人工栽培最广泛、产量最高、消费量最大的食用菌品种之一,还在许…...
长短期记忆网络(Long Short-Term Memory,LSTM)
简介:个人学习分享,如有错误,欢迎批评指正。 长短期记忆网络(Long Short-Term Memory,简称LSTM)是一种特殊的循环神经网络(Recurrent Neural Network,简称RNN)架构&#…...
WHAT - 引入第三方组件或项目使用需要注意什么
目录 1. 功能匹配2. 社区与维护3. 兼容性4. 性能5. 易用性6. 安全性7. 授权和许可证8. 国际化支持9. 依赖性10. 未来维护 在前端开发过程中引入第三方组件或项目时,应该从以下几个方面进行考虑,以确保引入的组件能够有效解决问题并适合长期维护ÿ…...
原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)正式发布
华为于10月22日19:00举办“原生鸿蒙之夜暨华为全场景新品发布会”。此次发布会推出全新的原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)以及nova 13、WATCH Ultimate、MatePad Pro等新品。 据介绍,此前已经发布过的鸿蒙系统,由于系…...
WindTerm配置快捷键Ctrl+C和Ctrl+V
WindTerm配置快捷键CtrlC和CtrlV 平时使用ssh和sftp连接的时候,经常使用windterm, 但是windterm里面找不到相关的快捷键设置, 因为操作习惯,想把CtrlC和CtrlV分别配置为复制和粘贴,其他的快捷键操作可以按照该方法进…...
AOP学习
corol调用serverce不在是直接调用的是调用底层代理对象,由代理对象统一帮我们处理 AOP常见概念 通知类型 切面顺序...
【ubuntu18.04】ubuntu18.04升级cmake-3.29.8及还原系统自带cmake操作说明
参考链接 cmake升级、更新(ubuntu18.04)-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…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
