应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

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

库里NBA只有4个人真正影响了全世界,我还不够资格库里:NBA只有4个人真正影响了全世界,我还不够资格!众所周知,库里的横空出世在全世界范围掀起了一股三分热潮,并彻底终结了NBA得内线者得天下的时代。此外,库里还率领勇士……时刻笼罩着离婚和破产的传言,贤妻良母的刘涛,她得罪了谁?曾在知乎上看到一个问题:为什么有人讨厌刘涛?这么贤妻良母的女人,能在丈夫破产后,力挽狂澜的火线复出,三年拍戏25部,挣来5个亿,替夫还债,为何还遭到反感与唱衰?来源网络……传奇手游法师的练级首选!白白胖胖的小怪物成为香饽饽传奇老玩家都知道,白野猪在石墓地图中是一个存钱罐的存在,玩家要是在石墓地图中都会想打上两只。今天和小白来看看一些刷白野猪的小技巧,感兴趣的就关注评论哦!对于那些aoe伤害……原创诗贺天绘卫星七律贺天绘卫星题记:2010年8月24日至2015年10月26日,传输型立体测绘卫星天绘一号01、02、03星相继发射成功,组成了航天测绘网,开启了中国实时全球测绘的新纪……噩梦!回顾多哥国家队非洲杯遇袭案十年前,士气高昂的多哥国家队在出征非洲杯的路途上遭遇枪击事件,一队人的命运就此改变我不想死在那儿。阿德巴约每当回忆这起发生在十年前的恐怖袭击,仍然心有余悸。在201……今日推荐的游戏是愚公移山游戏介绍:《愚公移山》是一款极休闲的放置类手游,是根据典故愚公移山改编而来的,其中智叟将扮演一个破坏生孩子大计的坏蛋。每当你生一定数量的子孙,或者你正在进行生育动作时,他……冬天又干又冷,记得给孩子吃1道暖和菜,通便润肠,真香啊年难留,时易损,不知不觉我们投入冬天的怀抱很久了。尽管不喜欢瑟瑟的寒风,可为了生活不得不从暖和的被窝爬起去为了几两碎银子奋斗。大人可以忍住寒冷、承受一切的不如意,可孩子们呢?他……父母,您们一定要挺住这几天,在疫情虐待下,医院急珍室人满为患,来的都是老人家,子女围在身边,不敢离开半步,这是孝子感恩戴德!曾记否,父母将你我捧在手心,含在嘴里,因为我们是父母的手心里的宝!……冬天进补,吃猪肉不如多吃它,味道鲜美又下饭,营养滋补不上火冬天进补,吃猪肉不如多吃它,味道鲜美又下饭,营养滋补不上火。进入冬季后,天气越来越冷,正是进补的好时机,平时可以多给家人吃一些营养丰富,脂肪含量少的肉菜,一来可以增加营养……好声音十位冠军,如今仅有两人活跃在荧幕,其他几人输在了哪《中国好声音》作为知名度最高,也是国内最长寿的音乐选秀节目,从这档节目走出了很多优秀的歌手,其中包括周深、希林娜依高、吴莫愁、黄霄云等人,不过这档节目已经做了十期,总共出了十位……800万年薪到期后,丁彦雨航尚未回归山东男篮集结续约又是大麻CBA休赛期当中,对于山东男篮的话题,吸引众多媒体和球迷的关注,根据济南时报的报道,球队已经恢复集结,但丁彦雨航,陶汉林,马鑫鑫,刘毅等人,因为个人事务,或者是疫情的影响,并没……经济低速增长时期,品牌如何正确迈出第一步?本次直播我们邀请到用户在左,体验在右自媒体主理人,用户研究市场洞察专家蔡鑫老师,他将为我们深度分析品牌如何实现健康成长的相关问题。本文为直播内容整理,内容有删改。大家好,……
iPhone14Pro换设计华为Mate50续航大升级最强折iPhone14手机壳与上一代通用据爆料,苹果iPhone14Plus的MagSafe手机壳图片流出,代表着iPhone14大杯版将命名为iPhone14Plus。……正式官宣!辽宁男篮实力球员离队,核心郭艾伦去向日趋明朗化北京时间8月25日,让我们继续关注中国篮球、关注CBA联赛,也希望点击关注了解更多篮球资讯。目前距离新赛季还有不到两个月时间,各支球队都在积极调整备战新赛季,今夏人员调整力度,……冷门不断!国乒3将输球,2人输外战,世青赛冠军刘夜泊惨遭剃光8月24日,WTT捷克支线赛继续进行,在凌晨结束的男单资格赛第二轮比赛中,国乒10人出战,3将输球,其中2位猛将惨败外协选手,连世青赛冠军都未能幸免,真是太出乎意料了。0……遇见一个相爱的人不容易,别轻易放弃遇见一个相爱的人不容易,别轻易放弃秋日生活打卡季你对自己最想说的一句话是什么家庭嗨,好久不见!一句好久不见道出了多少人的前尘往事,尽管可以再见,但却已是你我的……前三季度深圳武汉长沙西安福州烟台大连等表现突出与去年同期相比,2022年前三季度,我国大部分城市的经济增长率都出现了放缓。比如上海市,按可比价格计算,同比缩减了1。4;北京市的经济实际增长率也在疫情的影响下,放缓至0。8。……泰山游泰山又名岱山、岱宗、岱岳、东岳、泰岳,位于山东省中部,有五岳之首、五岳之长、天下第一山之称,是世界自然与文化遗产,世界地质公园。下面是为大家整理的泰山景点导游词,欢迎各位的阅读……日经全球芯片业繁荣不再跌入深坑美国对中国封锁加速滑向谷底周期中国小康网10月31日讯老马此前有旺盛需求支撑的半导体的繁荣周期正在恶化。由于个人电脑(PC)和智能手机等需求放缓,行情迅速恶化。美国英特尔和韩国三星电子等各大型企业的利润相继……猪饲料价格逼近普通大米!300斤猪要吃800斤饲料,养殖户心本文来源:时代财经作者:张昕迎最近猪肉价格回暖了,但养猪人熊爷却开心不起来。熊爷已经养猪10年有余。2019年,非洲猪瘟让猪价进入一轮上涨周期,熊爷曾因为家中的猪仔……全国哪里的白酒最好喝?经评选,这3个省榜上有名,有你家乡的吗说起酒,它的酿造历史最早可追溯到公元前7000年,在我国历史的长河中也是扮演者重要的角色。开心时:人生得意须尽欢,莫使金樽空对月;愁苦时有:何以解忧唯有杜康;孤单时:举杯……从海外购到海南购离岛免税以开放契合消费升级图片源于网络图文无关刚刚过去的国庆假期,今年反复受到疫情冲击的海南离岛免税市场呈现回暖势头,假期日均销售额超1。5亿元(人民币,下同)。三亚国际免税城逐渐恢复热闹景象,一……您还在为怎样结束一段关系而苦恼吗?以下三种方式,也许会帮到您在成人的世界里,结束一段关系往往不是尖叫和争吵,而是无声的疏远。朋友的疏远会让我们难过,亲人的梳离会让我们不安,恋人的冷落会让我们心生怨恨。当一个人开始疏远你的时候……名记曝詹姆斯离开湖人条件!5000万年薪无所谓,不续约等联盟在NBA球员交易市场开启后,大牌球星的交易一直是人们的关注点。但欧文、杜兰特、威少、米切尔等人的交易目前进程缓慢,让人们的目光回到了球员续约的问题上。作为当今NBA联盟第一人的……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网