最近重构Windows SDK过程中,需要支持外部声音采集。对ADM模块做了点重新阅读,并将基本的内部关系做下记录。ADM算是WebRTC里面比较简单的模块了,结构也比较清晰。

WebRTC的音频设备类主要包含两个AudioDeviceGeneric和它的工厂和代理类AudioDeviceModule。

AudioDeviceGeneric代表一个输入输出设备,提供数据的真正采集和播放,调整音量,mute等;

AudioDeviceModule是音频设备模块,它实际上内部会有一个AudioDeviceGeneric设备的引用(成员),然后把设备相关的调用转到设备对象上。它主要的目的是WebRTC音频的抽象接口定义,并完成不同平台的设备对象的创建。

这个关系结构非常清晰,不需要更多解释,请看下图:

可以看到有各个平台的不同实现,继承了AudioDeviceGeneric。

AudioDeviceModuleImple类里面有一个成员变量audio_device_, 在初始化ADM对象时候的CreatePlatformSpecificObjects()方法时候创建不同的平台相关音频设备。

我们来看Windows平台的实现是AudioDeviceWindowsCore类。

Windows平台上的另一个ADM实现

实际上Windows平台上有一个更新的实现,它直接实现了AudioDeviceModule类,没有AudioDeviceGeneric。

它是WindowsAudioDeviceModule!我们目前使用这个对象。

它重新设计了设备定义,将输入和输出分别进行了定义,分别为:AudioOutput 和 AudioInput 接口。

输入输出设备的全局特性

输入和输出设备是全局的,它们在ADM创建的时候会init。然后再需要的时候start,在不需要的时候stop。

比如我们同时订阅了几路流,需要播放这些流的声音,只有所有流都不订阅的时候,才会调用stop关闭设备。

而实际上声音数据经过process和mix之后,应该是统一传给device的。

播放和采集的线程

播放和采集都需要独立的线程。

在windows实现中,通过Windows Core Audio的接口IAudioClient->SetEventHandle()设置一个Event对象进去,在系统需要发送或者接收数据时候,会触发这个事件,然后发送给WebRTC的其他模块,或者从其他模块获取Audio数据去播放。

这个回调的时间是非常tricky的,特别是在play的时候。后续可以再聊。

实现Windows的外部音频采集和播放

我们的SDK需要实现支持外部音频数据的采集和播放,在外部实现背景音乐等的合成,然后输入到WebRTC系统。

了解了上面的架构设计,我们就可以着手设计提供给外部的接口类。后续可以探讨。

ADM的初始化

最后谈一下ADM的初始化,我们在SDK实现中ADM是在外部自己创建的,然后在创建PeerConnectionFactory时候传递进去。

我考虑WebRTC将ADM独立于PeerConnectionFactory大概是因为其全局性要求吧。考虑多个PeerConnectionFactory的时候。

音频管理模块AudioDeviceModule解读​blog.pprtc.com

springmvc 音频流输出_音频管理模块AudioDeviceModule解读相关推荐

  1. 系统管理模块_部门管理_设计(映射)本模块中的所有实体并总结设计实体的技巧_懒加载异常问题_树状结构...

    系统管理模块_部门管理_设计本模块中的所有实体并总结设计实体的技巧 设计实体流程 1,有几个实体? 一般是一组增删改查对应一个实体. 2,实体之间有什么关系? 一般是页面引用了其他的实体时,就表示与这 ...

  2. 在python中使用什么工具管理模块_怎么使用Python pip(管理模块工具)

    怎么使用Python pip(管理模块工具) 发布时间:2020-08-26 16:04:26 来源:亿速云 阅读:71 作者:Leah 本篇文章给大家分享的是有关怎么使用Python pip(管理模 ...

  3. 论坛模块_版块管理_增删改查实现上下移动

    论坛模块_版块管理1_增删改查 设计实体Forum.java public class Forum {private Long id;private String name;private Strin ...

  4. java部门管理_系统管理模块_部门管理_实现基本的增删改查功能

    系统管理模块_部门管理1_实现基本的增删改查功能 先不考虑上级部门 设计实体.表 1.设计实体 Department.java public classDepartment {privateLong ...

  5. java bs架构书_基于BS架构的图书借阅管理模块的分析与设计(JSP+MySQL)(新品)

    基于BS架构的图书借阅管理模块的分析与设计(JSP+MySQL)(新品) 来源:2BYSJ.cn 资料编号:2SJ295500 资料等级:★★★★★ %D7%CA%C1%CF%B1%E0%BA%C5% ...

  6. java webrtc ns降噪_单独编译和使用webrtc音频降噪模块(附完整源码+测试音频文件)...

    webrtc的音频处理模块分为降噪ns,回音消除aec,回声控制acem,音频增益agc,静音检测部分.另外webrtc已经封装好了一套音频处理模块APM,如果不是有特殊必要,使用者如果要用到回声消除 ...

  7. 音频管理器录制设备_如何同时从多个音频设备录制

    音频管理器录制设备 Every so often, you may need to record multiple things simultaneously for your audio proje ...

  8. 学成在线--媒资管理模块

    完整版请移步至我的个人博客查看:https://cyborg2077.github.io/ 学成在线–项目环境搭建 学成在线–内容管理模块 学成在线–媒资管理模块 学成在线–课程发布模块 学成在线–认 ...

  9. Android音频管理总结(个人笔记)

    Android音频管理 Android音频概述 media player接口 Android系统的播放器NuPlayer media extractor(高通的有自己的解封装模块mmparser) A ...

最新文章

  1. GitHub开源:一键生成前后端代码神器
  2. 【OpenCV 4开发详解】形态学应用
  3. vb如何测试连接mysql_怎么在vb程序中查找数据库信息并显示
  4. 【腾讯第二届校园编程马拉松】HDU-4525,威威猫系列故事——吃鸡腿
  5. 转:SqlServer中的datetime类型的空值和c#中的DateTime的空值的研究
  6. (转)如何检查系统是否支持Zend Optimizer
  7. git 修改tag 备注_【Git】第十二章:Git高级实战技巧
  8. 机器学习相关基本术语
  9. 用PBD制作餐饮店KPI分析仪-入门篇
  10. LeetCode 翻转字符串里的单词
  11. 附加:在在下部分区/县(数据表)
  12. linux查看udp丢包数量,Linux下UDP丢包问题分析思路
  13. 硬件--如何安全删除USB后不重新插拔而自动重连
  14. 微信小程序书籍翻页效果
  15. mysql 如何对集合进行遍历
  16. 阿里云服务器对企业有什么用?
  17. 170716 网线接口顺序
  18. 教你怎样选配电脑硬件
  19. RCNN系列论文学习:RCNN、FastRCNN、FaterRCNN、MaskRCNN(包含IOU、NMS介绍)
  20. 树莓派换源 bullseye

热门文章

  1. python 多维 条件获取
  2. 如何看懂照片的直方图
  3. np.newaxis 的使用
  4. opencv-dark channel -实现暗通道去雾详解
  5. 近两年跟踪速度较快的算法小结
  6. 青龙羊毛——关于脚本
  7. Cissp-【第1章 安全和风险管理】-2020-12-31(58页-85页)
  8. 王者荣耀服务器维护1月9号,王者荣耀1月9日维护到几点 王者荣耀1月9日几点能上游戏?...
  9. postman全局变量操作
  10. 手机连接投影机的步骤_投影机和电视机怎么选?看这一篇就够了!