专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

WebRTC音频引擎实现分析

  WebRTC的音频引擎作为两大基础多媒体引擎之一,实现了音频数据的采集、前处理、编码、发送、接收、解码、混音、后处理、播放等一系列处理流程。本文在深入分析WebRTC源代码的基础上,学习并总结其音频引擎的实现框架和细节。1。WebRTC音频引擎整体架构
  WebRTC音频引擎的实现代码主要分布在如下几个源码目录中:webrtcaudiowebrtccommonaudiowebrtcmediaenginewebrtcvoiceenginewebrtcmoduleaudiocodingwebrtcmoduleaudioconferencemixerwebrtcmoduleaudiodevicewebrtcmoduleaudioprocessing
  WebRTC音频引擎的整体架构如图1所示。
  图1WebRTC音频引擎的整体架构。png
  从整个WebRTC框架结构来看,音频引擎和和视频引擎都位于比较底层的位置,负责音视频数据的采集、编解码、渲染播放等工作。音视频引擎的上一层是多媒体引擎WebRtcMediaEngine2,是对底层音视频引擎VideoEngine的进一步高层抽象,由WebRtcVoiceEngine对VoiceEngine进行封装,WebRtcVideoEngine2对VideoEngine进行封装。
  在内部实现上,音频引擎VoiceEngineImpl通过一系列对象来实现音频处理,包括VoEAudioProcessingImpl、VoECodecImpl、VoENetworkImpl等等,每个对象负责具体某方面功能,例如VoEAudioProcessingImpl负责调用底层AudioProcessing模块对音频数据进行预处理。在这些功能对象中,比较重要的有VoEBaseImpl、SharedData和Channel。其中VoEBaseImpl是连接音频设备AudioDevice和音频引擎VoiceEngineImpl的纽带,是音频数据流水线上的重要一站;SharedData是一个聚合类,持有一系列重要对象;Channel则代表一路音频数据,负责大部分对该路数据的重要操作,包括音频数据的前处理、编解码、发送和接收、后处理、混音等等。
  从功能依赖上讲,VoiceEngineImpl依赖五个重要的底层功能模块:音频数据采集和播放AudioDeviceModule、音频数据预处理AudioProcessing、音频数据编解码AudioCodingModule、接收端音频数据缓冲区NetEq、接收端混音AudioConferenceMixer。此外音频数据编解码还依赖一系列音频编解码器如G711、G722、Opus等等。在发送端,音频数据由AudioDevice采集得到,经过AudioProcessing预处理后,到达AudioCodingModule进行编码,然后由RTPRTCP模块发送到网络。在接收端,音频数据经过RTPRTCP模块接收后到达AudioCodingModule,存储在NetEq中进行抖动控制和错误消除,然后解码。解码后的数据经过AudioConferenceMixer进行混音,最终发送到AudioDeviceModule进行播放。
  2。WebRTC音频引擎重要数据结构
  本节在第一节的基础上,静态分析WebRTC音频引擎实现上的一些重要数据结构。为了便于理解,采用从高层到底层的顺序进行分析。
  WebRtcMediaEngine2在MediaEngine层对底层的音视频引擎进行封装,分别是WebRtcVoiceEngine和WebRtcVideoEngine2。而WebRtcVoiceEngine则封装了音频引擎层的VoiceEngineImpl对象。VoiceEngineImpl以多继承方式聚集一系列接口,包括SharedData、VoEAudioProcessingImpl、VoECodecImpl、VoENetworkImpl、VoEBaseImpl等等。
  SharedData是一个聚合类,内部包括ChannelManager、AudioDeviceModule、OutputMixer、TransmitMixer、AudioProcess等对象,大部分关于VoiceEngineImpl的操作最终都会经过SharedData委托给内部对象。在创建SharedData对象时,其构造函数会创建一个名为VoiceProcessThread的线程,该线程用以处理音频引擎的周期性事务。
  VoEBaseImpl是连接底层音频采集播放模块AudioDeviceModule和音频引擎内部音频通道Channel的重要纽带。它实现三个接口:VoEBase负责创建Channel、启动停止音频数据的发送接收;AudioTransport负责AudioDeviceModule模块和Channel之间数据传送,包括采集后的音频数据发送到Channel进行编码、从Channel拉取解码后的音频数据进行播放;AudioDeviceObserver负责把AudioDeviceModule工作过程中出现的错误和警告向上层报告。
  Channel是对一路音频数据及其处理过程的抽象,是VoiceEngineImpl中最重要的底层实现类,其继承并实现RtpData、RtpFeedback、FileCallback、Transport、PacketizationCallback、ACMVADCallback、MixerParticipant等多个接口,分别负责音频数据编码后回掉、发送到网络、接收后存储到NetEq缓冲区、播放前混音等一些列重要操作。在类内部,Channel包含的重要成员对象包括RtpReceiver、RtpRtcpModule、AudioCodingModule、CodecManager、OutputMixer、TransmitMixer、ProcessThread、AudioDeviceModule、VoiceEngineObserver、Transport、AudioProcessing、PacketRouter等等。
  AudioDeviceModule模块负责音频数据的采集和播放,是音频数据的发源地和目的地。其内部主要包含三个对象:AudioDeviceModule、AudioDeviceGeneric和AudioDeviceBuffer。AudioDeviceModule是对外接口类,负责对AudioDevice和AudioDeviceBuffer进行管理、设置和对音频数据进行传递。AudioDevice是平台相关的音频设备,它管理音频采集设备和播放设备,包括初始化、设置音频采集设备和播放设备、开始停止设备、控制设备音量、设置设备的音频数据缓冲区,等等。在初始化阶段,AudioDevice创建采集线程和播放线程,用来执行采集任务和播放任务。AudioDeviceBuffer是音频数据缓冲区,负责临时存储和传递音频数据。
  AudioCodingModule模块负责音频数据的编解码,它由音频引擎层的Channel持有并调用。在内部,AudioCodingModul包含如下重要对象:AcmReceiver、AudioEncoder、AudioDecoder和NetEq,其中AcmReceiver负责接收音频数据并存储到NetEq中,NetEq负责音频数据的抖动消除和错误隐藏,AudioEncoder负责音频数据编码,AudioDecoder负责音频数据解码。WebRTC支持一系列音频编解码器,包括CNG、G711、G722、ilbc、isac、opus等等。数据编码完成后通过AudioPacketizationCallback接口回调到Channel进行下一步发送工作,数据解码完成后由Channel拉取进行下一步播放工作。
  AudioProcessing模块实现音频数据的预处理操作,包括声学回声消除AEC、自动增益控制AGC、噪声抑制NS、语音活动检测VAD,等等。AudioProcessing聚合一系列子模块实现各种音频处理算法,其重要的对外接口由两个:ProcessStream()和ProcessReverseStream(),前者负责采集后编码前的音频数据的前处理,后者播放前解码后的音频数据的后处理。
  TransmitMixer用于发送端混音。OutputMixer用于接收端混音。OutputMixer在内部使用AudioConferenceMixer负责解码后音频数据的混音操作。【免费分享】音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(CC,Linux,FFmpegwebRTCrtmphlsrtspffplaysrs等等)有需要的可以后台私信扣1免费领取
  3。WebRTC音频引擎数据流分析
  本节在前两节分析的基础上,动态分析WebRTC音频引擎的数据流,包括音频数据的采集、前处理、编码、发送、接收、缓存、解码、混音、后处理、播放。如图2所示。
  图2WebRTC音频引擎数据流。png
  3。1音频引擎创建及初始化
  音频引擎的创建及初始化流程如图3所示:
  图3WebRTC音频引擎创建及初始化。png
  WebRTC音频引擎的创建从PeerConnectionFactory对象的创建及初始化开始,这个过程由WebRTC的应用程序发起,并在signal线程在进行,最终调用CreateMediaEnginew()转到worker线程。在worker线程中,先创建WebRtcMediaEngine2,进而WebRtcVoiceEngine,最终创建VoiceEngineImpl。而最重要的初始化操作则VoEBaseImpl的Init()函数中完成。
  3。2音频数据的采集和编码
  音频数据的采集是平台相关的,在此以Windows平台为例,整个采集和编码过程如图4所示:
  图4音频数据的采集和编码。png
  在Windows7平台上,WebRTC默认使用WindowsCore接口采集和播放音频数据。采集线程叫做webrtccoreaudiocapturethread,线程入口是AudioDeviceWindowCore的CaptureAudio函数。该函数从麦克风中采集到音频数据后,存储到AudioDeviceBuffer中,并调用DeliverRecordedData()把音频数据向上推送到VoEBaseImpl对象中。VoEBaseImpl对象调用ProcessRecordedDataWithAPM()函数进行处理,首先创建AudioFrame对象并进行前处理,然后进行解复合和混音,最后数据到达Channel进行编码和发送。
  在Channel对象中,编码任务委托给AudioCodingModule对象,首先从AudioFrame中获取10ms的音频数据,然后调用具体的编码器如Opus进行编码。编码后的数据通过AudioPacketizationCallback接口的SendData()回到Channel对象进行下一步的RTP打包和发送过程。
  3。3音频数据的发送
  音频数据在AudioCodingModule编码完成后,通过回调接口回到Channel对象进行下一步的RTP打包和发送过程,如图5所示。
  图5音频数据的发送。png
  Channel调用把数据发送给RtpRtcp模块,后者经过一系列的调用进行RTP打包后到达RtpSender对象。如果没有配置平滑发送线程PacedSender,则RtpSender直接调用SendPacketToNetwork()把数据发送到network线程。否则数据会先存储到PacedSender线程中,再由后者进行平滑发送,最终数据发送到network线程。
  3。4音频数据的接收
  network线程从网络接收到音频数据后,交给worker线程进行下一步接收。Worker线程的工作流程如图6所示。
  图6音频数据的接收。png
  worker线程在收到网络数据后,通过BaseChannel的OnPacketReceived()接口向下传递,到达MediaEngine层的WebRtcVoiceMediaChannel,然后继续向下经过Call和AudioReceiveStream到达Channel的ReceivedRTPPacket()接口。Channel把数据推送到RtpRtcp模块进行RTP解包操作,得到纯音频数据,然后再经过Channel的OnReceivedPaylaodData()接口把数据推送到AudioCodingModule模块,最终经过AcmReceiver把数据存储在NetEq中,进行抖动消除和错误隐藏等操作。
  3。5音频数据的解码和播放
  worker线程把接收到的音频数据存储到NetEq后,为播放线程提供数据源。播放线程具体负责音频数据解码和播放操作。WindowsCore接口的播放线程名称为webrtccoreaudiorenderthread,其工作流程如图7所示。
  图7音频数据的解码和播放。png
  AudioDeviceWindowsCore设备向AudioDeviceBuffer请求音频数据,后者进一步向VoeBaseImpl请求数据,接下来主要操作都在GetPlayoutData()中进行:1)在AudioConferenceMixer中对所有活动Channel中的音频数据进行混音,每个Channel都作为混音的参与者。这包括获取解码后的音频数据(从AudioCodingModule模块中解码音频数据并返回)、对音频数据进行混音、得到最终音频数据并返回给OutputMixer。2)OutputMixer对混音后的音频数据执行AudioProcessing后处理操作。3)对后处理操作后的音频数据进行再混合和再采样。最终OutputMixer拿到最终的音频数据,交给VoEBaseImpl,并进一步向下交给AudioDeviceBuffer。AudioDeviceBuffer则把数据交给AudioDeviceWindowsCore进行播放操作。
  至此,我们完整分析了音频数据从采集到播放的全部过程。4。总结
  本文在深入分析WebRTC关于音频引擎实现代码的基础上,首先给出了WebRTC音频引擎的整体框架,然后静态分析了其实现上的若干重要对象,最后完整分析了音频数据从采集到播放的完整流动过程。通过本文,对WebRTC有了更深入的认识和体会,为未来进一步学习打下坚实基础。
  作者:weizhenwei

16年沉淀回归,魔域世界新征程在智能手机普及的今天,为了适应玩家们对碎片化时间的娱乐诉求,很多固有的老牌IP纷纷移转战手游,但效果并不理想,他们原封不断的照搬了端游,并没有考虑到玩家对游戏新的诉求,而魔域手游2吕布昭君打团猛得一P,如何有效针对?不妨试试这4位Hello大家好,这里是胖虎Game。王者荣耀迄今已经推出了上百位英雄,受到版本的影响,每个英雄的强度各有不同,但有的时候,一些英雄的组合在经过搭配后,会打出112的效果,这种组合郭晶晶现身大学演讲!穿雪纺衫加A字裙,少女打扮像在校大学生如今郭晶晶和以前完全是判若两人,现在的她越来越像大学生一样,她前段时间现身大学演讲,穿着雪纺衫加a字裙,整个人可以说是特别的性感,她整个人打扮感觉就像是在校大学生,完全不像是已婚妇层次感懒卷锁骨发锁骨发烫一个懒人卷会更好看,看起来不仅显得更温柔,还能更好地修饰你的脸型,发量少的女生烫个卷,瞬间让你拥有蓬松感的头发。搭配有点卷的刘海增加俏皮灵动感,自然的黑发或者棕发就非常好看写给低谷期的你搞钱最重要大家好,我是淘气娜娜,每天坚持分享写作故事,感谢你的观看。日复一日,年复一年,你是否也会常常陷入低谷阶段呢。人生本就是起起伏伏的,如果没有那些不如意怎么成就你后来的如意呢。文章断更能挤出奶,源于每天吃的草吃进去的是草,挤出来的是奶。通常我们用这句话调侃打工人待遇不公。但是仔细琢磨,这何尝不是有所成就的必经之路呢。要想实现挤奶般地成功人生,就得每天勤奋地去吃草。吃草的过程,就是你得不好时光溪山美郡幼儿园中一班2022秋家长助教活动好时光溪山美郡幼儿园中一班2022秋家长助教活动疫情三年时间,琦琦从小班到中班,还未曾去过一次她的幼儿园,看看她每天玩耍学习和生活的环境,但这对于我们家长来说,是十分理解的,不说预名称的变化现在,我国有不少家庭只有女儿,女儿长大结婚后生育的孩子,当父母的都喜欢让孩子叫自己爷爷奶奶。按照我国传统风俗习惯自己儿子的孩子叫自己爷爷奶奶自己女儿生的孩子叫自己姥爷姥姥(或外公外散瞳眼药水为什么说它比窦娥还冤?为什么要散瞳呢?散瞳是不是对眼睛有伤害啊?有些家长们一听到散瞳两个字就避之唯恐不及因为孩子散瞳后会怕光看不清东西。那么,散瞳究竟会不会伤害孩子的眼睛呢?散瞳不会伤害眼睛,反而能让眼大博弈结局前瞻3人意料之中,5人意料之外,马怡变数最大有没有一种感觉,大博弈正在以飞快的节奏,马不停蹄地奔向大结局?真过瘾。连续几次多方博弈,其精彩程度,让人目不暇接。先是孙和平连续几次与深陷囹圄的刘必定碰头,商讨红星重装的那批法人股沈梦辰婚礼泡汤?曝婆家希望与孩子满月酒一起办,网友替她叫屈饿了吗?戳右边关注我们,每天给您送上最新出炉的娱乐硬核大餐!11月23日,有八卦媒体爆料,沈梦辰期待了许久的梦幻婚礼,似乎彻底泡汤了,原因与婆家有关,引发网友热议。众所周知,沈梦辰
高血压患者应低盐饮食,均衡营养,可以喝这些汤一般认为,如果收缩压高于140毫米汞柱或舒张压高于90毫米汞柱,就是高血压的现象。高血压是以动脉血压升高为主要表现的疾病,多见于中老年人。高血压患者应注意低盐饮食均衡营养。明星食材我来国家队只为三件事,绝杀绝杀还是甜蜜的绝杀我看过很多无与伦比的绝杀。科比双绝杀太阳队初代詹姆斯绝命三分但最喜欢的还是王仕鹏那记价值连城的三分。没有别的原因,因为这是中国队的比赛。纵观他的职业生涯,王仕鹏的个人数据并不出彩,娜可露露新手怎么玩?熟悉连招技巧,轻松掌控野区打卡挑战局说到娜可露露这个英雄相信大家都不陌生,作为SNK系列里秒人能力最强的刺客,不论是在KPL职业赛场上还是我们的日常对局中都有不错的表现,所以这个英雄是打野玩家必须要学会的一太空舱民宿酒店纷繁都市中奢侈的自然梦幻体验看过外地很多地方有类似的太空舱酒店,感觉好酷!不是在探秘旅游,就是在去探秘旅游的路上。太空舱民宿休闲度假的宝藏地,悬在半空中超酷炫,如果你有一个太空梦,那这里也一定适合你!民宿将住福建省首次开展一试双证考核用于职业技能等级认定3日上午,福建省首次首场互联网营销师巨量认证(一试双证)职业技能等级认定考核结束。据悉,此次一试双证考核考点位于福州市互联网小镇,分两个四级工种岗位互联网营销师视频创推员(四级)短中密控股在手订单仍然处于高位扩产计划正常进行中中密控股在手订单仍然处于高位扩产计划正常进行中财联社9月10日电,中密控股近日接受机构调研时表示,公司在手订单仍然处于高位,增量业务占比高于存量业务,新签订单和增量业务同比都略有增美阿尔忒弥斯计划重返月球,盘点史上最惨痛的航天事故自从上世纪70年代载人登月狂潮退却后,月球的表面迄今已有48年没有人类踏足,几十年后,在各项技术都已大步发展的今天,NASA公布了阿尔忒弥斯登月计划,这是希腊神话中的月亮女神,与当智能门锁安全吗?家庭安全第一关如何守护?随着智能家装的普及和大众安全防范意识的提高,智能门锁近年来逐渐成为家居装修的标配,出入方便,再也不用随身揣一把钥匙。但是,在智能门锁备受关注的同时,也有不少消费者表示担忧智能锁真的HoK四国测试收获海外用户好评,中国最流行MOBA尝试进军海外市场近年来,海外游戏市场发展迅速,越来越多的国产知名游戏IP也开始摸索出海之路,其中就包括了由天美工作室研发的人气MOBA手游HonorofKings(王者荣耀,以下简称HoK)。游戏SuperLeagueGaming成为元宇宙游戏AnimeBattlegroundsX发行商据VentureBeat报道,元宇宙游戏发行商SuperLeagueGaming与SmallWorldGames建立了合作伙伴关系,作为新合作的一部分,SmallWorld广受欢迎多特蒙德VS霍芬海姆!防守竟成多特的亮点,霍村今天能否多点开花今天跟大家聊聊德甲,多特蒙德和霍芬海姆。多特这赛季终究还是没留住哈兰德,将他送到了曼城。不过,送走哈兰德之后,多特也是在夏窗做出了回应,进行了一系列的引援。可是呢,今年多特采购的运
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网