• 售前

  • 售后

热门帖子
入门百科

WebRTC手记之本地音频收罗

[复制链接]
ffycxyw2274436 显示全部楼层 发表于 2022-1-16 03:35:30 |阅读模式 打印 上一主题 下一主题
转自:https://www.cnblogs.com/fangkm/p/4374668.html
目次

上一篇博文先容了当地视频收罗,这一篇就先容下音频收罗流程,也是先先容WebRTC原生的音频收罗,再先容Chromium源码对它的定制。
1. WebRTC原生音频收罗

先先容一下WebRTC中与音频收罗貌似干系的接口概念:

结构上看起来是不是和视频Track的结构类似?不外前面提过,如果你以对称的头脑,在此结构中找出与视频track相似的收罗源和输出源,那就肯定无功而返了,LocalAudioSource对AudioSourceInterface的实现就是一个空实现,没有了音频源,那音频处置处罚接口AudioProcessorInterface和输出接口AudioRenderer都成了无米之炊了。这些接口先摆在这,大概类似于AudioCapturer的框架正在实现的途中,也大概这些接口有别的用处,好比远程音频流的抽象等,这里就临时搁置,先记下有这回事吧。这里只谈WebRTC当地音频的收罗处置处罚。前面先容音视频接口的时间也提到的,当地音频的收罗由AudioDeviceModule接口同一封装:

AudioDeviceModule是个大而全的接口,恨不得将全部音频干系的接口都封装在内里(实际也差不多了),详细包罗:摆列音频收罗装备(Record)和播放装备(Playout)、设置当前的收罗装备/播放装备、开始/克制音频的收罗/播放、设置音频增益控制开关(AGC)等。AudioTransport是个关键的对外接口,负责音频数据的传入(调用NeedMorePlayData方法,供Playout使用)和输出(调用RecordedDataIsAvailable方法,数据由Record收罗利用产生)。
AudioDeviceModuleImpl实现了AudioDeviceModule接口,创建的时间调用CreatePlatformSpecificObjects方法创建平台干系的AudioDeviceGeneric接口实现。该接口抽象了音频的收罗和播放逻辑,在Windows平台下有两种实现方案:


  •   AudioDeviceWindowsWave实现的是传统的Windows Wave APIs方案。
  •  AudioDeviceWindowsCore实现的是Vista之后才支持的Windows Core Audio APIs方案。
别的,AudioDeviceModuleImpl还维护了一个AudioDeviceBuffer对象来管理音频数据的缓冲区,由它直接与对外接口AudioTransport交互。好比:


  •  当AudioDeviceWindowsWave大概AudioDeviceWindowsCore须要播放音频数据的时间,会调用AudioDeviceBuffer的RequestPlayoutData方法哀求播放数据,然后通过GetPlayoutData方法来获取刚哀求到的数据。AudioDeviceBuffer的RequestPlayoutData就是调用AudioTransport接口的NeedMorePlayData方法来哀求待播放的音频流数据。
  •  当AudioDeviceWindowsWave大概AudioDeviceWindowsCore收罗到音频数据后,会调用AudioDeviceBuffer的SetRecordedBuffer方法将收罗到的音频数据转达进去,然后调用DeliverRecordedData方法来派发出去,该派发方法就是通过调用AudioTransport接口的RecordedDataIsAvailable来实现。
总之,音频收罗模块随处都透袒露大而全的结构筹划。如果可以,真的应该细化一下概念筹划,好比将音频收罗和音频播放逻辑分离、音频输入和输出的接口拆分等等,那样才气谈得上结构筹划。
2. Chromium对WebRTC的音频收罗适配

根据WebRTC的当地音频接口筹划,Chromium提供了一个WebRtcAudioDeviceImpl类来实现AudioDeviceModule接口,该类对象由PeerConnectionDependencyFactory负责创建和维护,结构如下:

如图所示,WebRtcAudioDeviceImpl摒弃了原生的AudioDeviceModuleImpl实现中大而全的筹划,而是将音频收罗和音频渲染逻辑分开,分别对应于WebRtcAudioCapturer和WebRtcAudioRenderer。WebRtcAudioRenderer通过WebRtcAudioRendererSource接口的RenderData方法向WebRtcAudioDeviceImpl哀求音频流数据来渲染,WebRtcAudioDeviceImpl将该哀求转发给前面提到的对交际互接口AudioTransport。WebRtcAudioCapturer封装音频收罗逻辑,它将收罗到的数据通过WebRtcLocalAudioTrack对象所持有的PeerConnectionAudioSink接口派发出去,WebRtcAudioDeviceImpl正是实现了该接口来吸取音频收罗数据,然后也是通过AudioTransport接口往外转达。至于WebRtcAudioCapturer对象的持有者MediaStreamAudioSource和WebMediaStreamTrack,这里临时有个概念就行,它们是Chromium对HTML5媒体流的实现接口。接下来细致分析一下WebRtcAudioCapturer和WebRtcAudioRenderer两个关键类,毋庸置疑,它们都涉及到了特定平台实现,而且在Chromium中还凌驾了Render和Browser进程。和先容Chromium视频收罗的模式一样,由于不是本文重点,这里只列出结构图,不筹划详解,如果你有开发上的须要,可以照着该结构图细看源码。

这是WebRtcAudioCapturer收罗音频数据的结构,扳连到跨进程通讯,结构还黑白常复杂的。WebRtcAudioRenderer的结构就禁绝备先容了,由于Chromium的这块筹划非常具备对称性,根本上图中类定名中的Input改成Output就差不多是WebRtcAudioRenderer的架构了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作