WebRtc音频介绍01—设备管理

一、前言:

想象一下,我们在PC上安装了一个钉钉,需要开一个音视频会议。在呼叫建立这个音视频的会议的过程中,与音频相关的必要操作步骤有哪些呢?

首先,你得有硬件设备,麦克风和扬声器;

其次,你是不是得编写麦克风和扬声器的驱动程序,并添加到windows系统的内核态,并暴露接口给应用层?

接着,硬件有了,驱动有了你就可以直接写一个app去操控这个设备了(调音量、静音什么的);

那么问题来了,如果明天换了一个品牌的麦克风呢?你是不是又得做一遍?

现实中肯定不是这样的,因为微软已经规定了好了,你如果是麦克风,你就得按照我规定的一套标准API去开发驱动,无论你换啥麦克风,我都可以用通用驱动程序。那么问题又来了,既然驱动的接口已经定了标准,那么对应用层暴露的API是不是也可以有个标准呢?答案是肯定的,不光提供了接口,微软还做了一个专门的管理模块去管理这些音频相关的设备。

那么,问题又来了,人家微软不管什么麦克风怼上去都可以使用。我们WebRtc是跨平台的,既要在windows上可以使用麦克风,又要在linux上使用麦克风,又要在mac上使用麦克风,我们是不是也得不管你怼什么系统上来我就一套API去操作呢?答案也是肯定的,这个东西就叫做Audio Device Module (ADM)。

二、ADM介绍:

Audio Device Module (ADM) 用来管理

详情可以参考:https://chromium.googlesource.com/external/webrtc/+/master/modules/audio_device/g3doc/audio_device_module.md

1、类关系图:

在这里插入图片描述

  • 顶层的WebRtcVoiceEngine就是音频引擎,一般是提供给上层的PeerConnection使用的;
  • WebRtcVoiceEngine 里面的成员变量adm_就是指向我们的ADM模块;
  • ADM模块中最顶层的 AudioDeviceModule 是一个接口类, AudioDeviceModuleForTest只是增加了一些必要的测试功能(先别管),最终实现类就是AudioDeviceModuleImpl,我们以后说ADM,就记住是AudioDeviceModuleImpl;
  • AudioDeviceModuleImpl中有个成员变量audio_device_指向 AudioDeviceGeneric,这也是个接口类,子类去实现具体的功能,理解成就是一个音频设备;
  • AudioDeviceGeneric在每个平台实现不一样,比如,windows平台就是AudioDeviceWindowsCore,而linux平台是AudioDeviceLinuxALSA;

2、ADM创建:

知道了ADM的类关系图,我们就得看看它是什么时候创建的;

我们所有代码分析都是从PeerConnectionClient这个官方的demo开始.

前面的调用顺序是:
Conductor::InitializePeerConnection -> CreatePeerConnectionFactory -> CreateModularPeerConnectionFactory -> PeerConnectionFactory::Create -> ConnectionContext::Create (根据dependencies创建一个连接上下文类) -> ChannelManager::Init

到了ChannelManager::Init就是我们重点关注的部分了

在这里插入图片描述

  • adm->CheckPlatform检查是windows还是linux;
  • CreatePlatformSpecificObjects 最终会生成一个audio_device_的对象,windows就是AudioDeviceWindowsCore 。
  • 我们发现 AudioDeviceModuleImpl 只是一个集合,真正实现的地方在 AudioDeviceWindowsCore 里面,他才是真正访问底层设备的;
  • 在执行了CreatePlatformSpecificObjects 之后,AudioDeviceModuleImpl里面就有个成员变量叫做AudioDeviceWindowsCore 了;
  • audioDevice->AttachAudioBuffer() 将 AudioDeviceModuleImpl 里面的Buffer设置到 AudioDeviceWindowsCore 中,这样,采集的数据就可以放到buffer中;

注意,图中除了最后一个矩形框,其他目前都是和平台无关的,不管你是windows、linux、mac都一样的,设计得非常好!

三、总结:

webrtc中队音频设备得管理都是通过ADM完成的,并且抽象出了统一的接口类AudioDeviceModule,使用者不用管是什么系统平台,直接调用统一的方法即可。

欢迎关注微信公众号:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值