企业网站怎么做推广比较好,网站开发时自适应,武义建设局网站,微信同城小程序开发教程WebRTC音频01 - 设备管理 WebRTC音频 02 - Windows平台设备管理 WebRTC音频 03 - 实时通信框架(本文) WebRTC音频 04 - 关键类 WebRTC音频 05 - 音频采集编码
一、前言#xff1a;
前面介绍了音频设备管理#xff0c;并且以windows平台为例子#xff0c;介绍了ADM相关的类…WebRTC音频01 - 设备管理 WebRTC音频 02 - Windows平台设备管理 WebRTC音频 03 - 实时通信框架(本文) WebRTC音频 04 - 关键类 WebRTC音频 05 - 音频采集编码
一、前言
前面介绍了音频设备管理并且以windows平台为例子介绍了ADM相关的类以及必须用到的重要API本文我们分析下在一个音视频呼叫过程中音频是如何参与其中的都有哪些成员参与其中。
二、呼叫时序图
先回顾下总体呼叫流程由大到小分析避免看半天代码不知道自己在哪儿 可以看出呼叫过程中先要创建非常重要的类PeerConnection接着进行媒体协商最后选择进行p2p或者turn这条路我们现在要分析这个过程中音频要做哪些事这件事分别是在上面总流程的哪个位置。
三、音频数据流转
我们先猜想下整个过程中应该做什么是不是下图这样 标注红色的就是我们关心的。
四、具体到每个音频模块 初始化阶段图中粉色线 这个流程之前分析过从Session层开始创建一个会话就会创建一个PeerConnection然后就是创建音频引擎接着创建ADMadm创建过程中会创建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音频解码器管理 channelsWebRtcMediaVoiceChannel的集合一个对应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来初始化之前创建的媒体引擎
七、总结
本文主要是介绍了音频各个模块在整个呼叫过程中所处的角色以及何时创建创建时机、创建的什么样类图主要从总体分析如果要具体到每个类后续会根据业务场景再做分析比如采集过程中用到哪几个类具体调用哪个函数等等关注我不迷路
扫描关注最早拿到一手资源