springmvc 音频流输出_音频管理模块AudioDeviceModule解读
最近重构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,有几个实体? 一般是一组增删改查对应一个实体. 2,实体之间有什么关系? 一般是页面引用了其他的实体时,就表示与这 ...
- 在python中使用什么工具管理模块_怎么使用Python pip(管理模块工具)
怎么使用Python pip(管理模块工具) 发布时间:2020-08-26 16:04:26 来源:亿速云 阅读:71 作者:Leah 本篇文章给大家分享的是有关怎么使用Python pip(管理模 ...
- 论坛模块_版块管理_增删改查实现上下移动
论坛模块_版块管理1_增删改查 设计实体Forum.java public class Forum {private Long id;private String name;private Strin ...
- java部门管理_系统管理模块_部门管理_实现基本的增删改查功能
系统管理模块_部门管理1_实现基本的增删改查功能 先不考虑上级部门 设计实体.表 1.设计实体 Department.java public classDepartment {privateLong ...
- java bs架构书_基于BS架构的图书借阅管理模块的分析与设计(JSP+MySQL)(新品)
基于BS架构的图书借阅管理模块的分析与设计(JSP+MySQL)(新品) 来源:2BYSJ.cn 资料编号:2SJ295500 资料等级:★★★★★ %D7%CA%C1%CF%B1%E0%BA%C5% ...
- java webrtc ns降噪_单独编译和使用webrtc音频降噪模块(附完整源码+测试音频文件)...
webrtc的音频处理模块分为降噪ns,回音消除aec,回声控制acem,音频增益agc,静音检测部分.另外webrtc已经封装好了一套音频处理模块APM,如果不是有特殊必要,使用者如果要用到回声消除 ...
- 音频管理器录制设备_如何同时从多个音频设备录制
音频管理器录制设备 Every so often, you may need to record multiple things simultaneously for your audio proje ...
- 学成在线--媒资管理模块
完整版请移步至我的个人博客查看:https://cyborg2077.github.io/ 学成在线–项目环境搭建 学成在线–内容管理模块 学成在线–媒资管理模块 学成在线–课程发布模块 学成在线–认 ...
- Android音频管理总结(个人笔记)
Android音频管理 Android音频概述 media player接口 Android系统的播放器NuPlayer media extractor(高通的有自己的解封装模块mmparser) A ...
最新文章
- GitHub开源:一键生成前后端代码神器
- 【OpenCV 4开发详解】形态学应用
- vb如何测试连接mysql_怎么在vb程序中查找数据库信息并显示
- 【腾讯第二届校园编程马拉松】HDU-4525,威威猫系列故事——吃鸡腿
- 转:SqlServer中的datetime类型的空值和c#中的DateTime的空值的研究
- (转)如何检查系统是否支持Zend Optimizer
- git 修改tag 备注_【Git】第十二章:Git高级实战技巧
- 机器学习相关基本术语
- 用PBD制作餐饮店KPI分析仪-入门篇
- LeetCode 翻转字符串里的单词
- 附加:在在下部分区/县(数据表)
- linux查看udp丢包数量,Linux下UDP丢包问题分析思路
- 硬件--如何安全删除USB后不重新插拔而自动重连
- 微信小程序书籍翻页效果
- mysql 如何对集合进行遍历
- 阿里云服务器对企业有什么用?
- 170716 网线接口顺序
- 教你怎样选配电脑硬件
- RCNN系列论文学习:RCNN、FastRCNN、FaterRCNN、MaskRCNN(包含IOU、NMS介绍)
- 树莓派换源 bullseye