一种基于webrtc实现多方音频通话的方法以及系统与流程

文档序号:13673298阅读:405来源:国知局
技术领域本发明涉及一种基于webrtc实现多方音频通话的方法以及系统。

背景技术:
WebRTC是一项在浏览器内部进行实时视频和音频通信的技术,是谷歌2010年以6820万美元收购GlobalIPSolutions公司而获得一项技术。它是一系列技术的组合,能在端到端之间实现实时、低延时的通信,可以用于视频和音频会议以及游戏。虽然通常都使用WebSockets来实现实时通信,但WebRTC却尝试通过直接在端到端之间建立连接来显著地降低延迟。一对一的视频和音频通话使用WebRTC来实现是最简单的。但多方通话较难实现,如图1所示,一种方法是所有参与者两两相连,但由于WebRTC终端的CPU占用率过高和带宽的限制,这种方法不能供超过5-6人使用。如图2所示,另一种方法是使用一个外设服务器,聚集所有的流,以合并成单一流的方式将其广播到所有其他参与者,但这种方法往往需要在终端之外再搭建一个中间服务器,造成资源的浪费。

技术实现要素:
本发明要解决的技术问题,在于提供一种基于webrtc实现多方音频通话的方法以及系统,节约了资源,并使得更多人参与通话。本发明之一是这样实现的:一种基于webrtc实现多方音频通话的方法,包括如下步骤:步骤1、发起端与n个参与端发起通话,建立n路语音通路;步骤2、发起端开辟缓冲区,发起端将n个参与端的音频编码数据存入缓冲区,并采集发起端的音频编码数据;其中音频编码数据为16bit的语音帧;步骤3、将n+1个音频编码数据扩展为32bit的数据,分别存储到n+1个变量中;步骤4、将n+1个变量逐一累加得到和值;步骤5、发起端将所述和值减去所要发送的参与端的变量得到一发送值;步骤6、将所述发送值重新转换为16bit的音频帧,通过发起端将该音频帧打包发送至对应的参与端;步骤7、发起端重复步骤5和步骤6,直至发起端将所有对应的音频帧发送至对应的参与端。进一步地,所述步骤1进一步具体为:发起端与n个参与端发起通话,建立n路语音通路,并为发起端和n个参与端设置一权重因子,所述权重因子小于等于1。进一步地,所述步骤2进一步具体为:发起端开辟n个环形缓冲区,每个所述环形缓冲区设有一读取指针和写入指针,发起端将n个参与端的音频编码数据分别往所述参与端对应的环形缓冲区填充,之后将各环形缓冲区的写入指针指向距离填充完成时间最近的语音帧,并采集发起端的音频编码数据;将各个音频编码数据乘以其对应的权重因子;其中音频编码数据为16bit的语音帧。进一步地,所述步骤2与步骤3之间还包括一步骤a:在读取环形缓冲区中的语音帧前校准读取指针的位置,将读取指针前移一位;若读取指针指向的语音帧的获取时间早于写入指针指向的语音帧的获取时间,若时间间隔小于限定时间,则直接读取读取指针所指向的语音帧;若时间间隔大于等于限定时间,所述读取指针指向的语音帧的最大峰值是否大于声音阈值;是,则继续传输该语音帧;否,则直接略过该帧传输下一语音帧;若读取指针指向的语音帧的获取时间早于写入指针指向的语音帧的获取时间,此时读取指针指向的语音帧已被读取过,则直接读取写入指针所指向的语音帧,若该语音帧已被反复读取了m次,则直接略过该环形缓冲区内的语音帧,直至该环形缓冲区内的有新的语音帧填充;其中m为正整数。进一步地,所述步骤a中,限定每个语音帧的时间长度为Tms,若读取指针指向的语音帧的获取时间早于写入指针指向的语音帧的获取时间;若时间间隔小于15*Tms,则直接读取读取指针所指向的语音帧;但时间间隔大于等于15*Tms,所述读取指针指向的语音帧的最大峰值是否大于声音阈值;是,则继续传输该语音帧;否,则直接略过该帧传输下一语音帧。进一步地,所述步骤6进一步具体为:所述发送值,若不在[-32768,32767]之间,则直接将发送值赋值为极限值,之后重新转换为16bit的音频帧,通过发起端将该音频帧打包发送至对应的参与端;若在[-32768,32767]之间,则直接将发送值转换为16bit的音频帧,通过发起端将该音频帧打包发送至对应的参与端。本发明之二是这样实现的:一种基于webrtc实现多方音频通话的系统,包括如下模块:发起模块,发起端与n个参与端发起通话,建立n路语音通路;收集数据模块,发起端开辟缓冲区,发起端将n个参与端的音频编码数据存入缓冲区,并采集发起端的音频编码数据;其中音频编码数据为16bit的语音帧;扩展模块,将n+1个音频编码数据扩展为32bit的数据,分别存储到n+1个变量中;混音模块,将n+1个变量逐一累加得到和值;发送值获取模块,发起端将所述和值减去所要发送的参与端的变量得到一发送值;发送模块,将所述发送值重新转换为16bit的音频帧,通过发起端将该音频帧打包发送至对应的参与端;完成模块,发起端重复发送值获取模块和发送模块,直至发起端将所有对应的音频帧发送至对应的参与端。进一步地,所述发起模块进一步具体为:发起端与n个参与端发起通话,建立n路语音通路,并为发起端和n个参与端设置一权重因子,所述权重因子小于等于1。进一步地,所述收集数据模块进一步具体为:发起端开辟n个环形缓冲区,每个所述环形缓冲区设有一读取指针和写入指针,发起端将n个参与端的音频编码数据分别往所述参与端对应的环形缓冲区填充,之后将各环形缓冲区的写入指针指向距离填充完成时间最近的语音帧,并采集发起端的音频编码数据;将各个音频编码数据乘以其对应的权重因子;其中音频编码数据为16bit的语音帧。进一步地,所述收集数据模块与扩展模块之间还包括一读取模块:在读取环形缓冲区中的语音帧前校准读取指针的位置,将读取指针前移一位;若读取指针指向的语音帧的获取时间早于写入指针指向的语音帧的获取时间,若时间间隔小于限定时间,则直接读取读取指针所指向的语音帧;若时间间隔大于等于限定时间,所述读取指针指向的语音帧的最大峰值是否大于声音阈值;是,则继续传输该语音帧;否,则直接略过该帧传输下一语音帧;若读取指针指向的语音帧的获取时间早于写入指针指向的语音帧的获取时间,此时读取指针指向的语音帧已被读取过,则直接读取写入指针所指向的语音帧,若该语音帧已被反复读取了m次,则直接略过该环形缓冲区内的语音帧,直至该环形缓冲区内的有新的语音帧填充;其中m为正整数。进一步地,所述读取模块中,限定每个语音帧的时间长度为Tms,若读取指针指向的语音帧的获取时间早于写入指针指向的语音帧的获取时间;若时间间隔小于15*Tms,则直接读取读取指针所指向的语音帧;但时间间隔大于等于15*Tms,所述读取指针指向的语音帧的最大峰值是否大于声音阈值;是,则继续传输该语音帧;否,则直接略过该帧传输下一语音帧。进一步地,所述发送模块进一步具体为:所述发送值,若不在[-32768,32767]之间,则直接将发送值赋值为极限值,之后重新转换为16bit的音频帧,通过发起端将该音频帧打包发送至对应的参与端;若在[-32768,32767]之间,则直接将发送值转换为16bit的音频帧,通过发起端将该音频帧打包发送至对应的参与端。本发明具有如下优点:本发明一种基于webrtc实现多方音频通话的方法以及系统,实现多达8人的实时语音通话,直接将其中一名参与者作为通话发起人,且把他的WebRTC终端当作中间服务器,负责混音并广播到所有其他参与者,能够使所有其他参与者只需要连接到发起人即可,减少了其他参与者CPU资源的消耗和带宽的浪费。同时,本发明提供的混音算法可以有效减小语音的失真和延时,并减小所述通话发起人WebRTC终端的CPU资源占用率。附图说明下面参照附图结合实施例对本发明作进一步的说明。图1是基于WebRTC的一种所有参与者两两相连的多方通话模型。图2是基于WebRTC的一种通过第三方外设服务器实现多方通话的模型。图3是本发明一种具体实施方式的八方通话的模型。图4是本发明一种具体实施方式的八方通话音频数据在WebRTC处理流程示意图。图5是本发明一种具体实施方式的减少混音失真方法的流程示意图。图6是本发明一种具体实施方式的减小混音时延方法的流程示意图。图7是本发明基于webrtc实现多方音频通话的方法的流程图。具体实施方式如图7所示,本发明基于webrtc实现多方音频通话的方法,包括如下步骤:步骤1、发起端与n个参与端发起通话,建立n路语音通路:发起端与n个参与端发起通话,建立n路语音通路,并为发起端和n个参与端设置一权重因子,所述权重因子小于等于1;步骤2、发起端开辟缓冲区,发起端将n个参与端的音频编码数据存入缓冲区,并采集发起端的音频编码数据;其中音频编码数据为16bit的语音帧:发起端开辟n个环形缓冲区,每个所述环形缓冲区设有一读取指针和写入指针,发起端将n个参与端的音频编码数据分别往所述参与端对应的环形缓冲区填充,之后将各环形缓冲区的写入指针指向距离填充完成时间最近的语音帧,并采集发起端的音频编码数据;将各个音频编码数据乘以其对应的权重因子;其中音频编码数据为16bit的语音帧;步骤a:在读取环形缓冲区中的语音帧前校准读取指针的位置,将读取指针前移一位;若读取指针指向的语音帧的获取时间早于写入指针指向的语音帧的获取时间,若时间间隔小于限定时间,则直接读取读取指针所指向的语音帧;若时间间隔大于等于限定时间,所述读取指针指向的语音帧的最大峰值是否大于声音阈值;是,则继续传输该语音帧;否,则直接略过该帧传输下一语音帧;若读取指针指向的语音帧的获取时间早于写入指针指向的语音帧的获取时间,此时读取指针指向的语音帧已被读取过,则直接读取写入指针所指向的语音帧,若该语音帧已被反复读取了m次,则直接略过该环形缓冲区内的语音帧,直至该环形缓冲区内的有新的语音帧填充;其中m为正整数;所述步骤a中,限定每个语音帧的时间长度为Tms,若读取指针指向的语音帧的获取时间早于写入指针指向的语音帧的获取时间;若时间间隔小于15*Tms,则直接读取读取指针所指向的语音帧;但时间间隔大于等于15*Tms,所述读取指针指向的语音帧的最大峰值是否大于声音阈值;是,则继续传输该语音帧;否,则直接略过该帧传输下一语音帧;步骤3、将n+1个音频编码数据扩展为32bit的数据,分别存储到n+1个变量中;步骤4、将n+1个变量逐一累加得到和值;步骤5、发起端将所述和值减去所要发送的参与端的变量得到一发送值;步骤6、将所述发送值重新转换为16bit的音频帧,通过发起端将该音频帧打包发送至对应的参与端:所述发送值,若不在[-32768,32767]之间,则直接将发送值赋值为极限值,之后重新转换为16bit的音频帧,通过发起端将该音频帧打包发送至对应的参与端;若在[-32768,32767]之间,则直接将发送值转换为16bit的音频帧,通过发起端将该音频帧打包发送至对应的参与端;步骤7、发起端重复步骤5和步骤6,直至发起端将所有对应的音频帧发送至对应的参与端。本发明之二是这样实现的:一种基于webrtc实现多方音频通话的系统,包括如下模块:发起模块,发起端与n个参与端发起通话,建立n路语音通路:发起端与n个参与端发起通话,建立n路语音通路,并为发起端和n个参与端设置一权重因子,所述权重因子小于等于1;收集数据模块,发起端开辟缓冲区,发起端将n个参与端的音频编码数据存入缓冲区,并采集发起端的音频编码数据;其中音频编码数据为16bit的语音帧:发起端开辟n个环形缓冲区,每个所述环形缓冲区设有一读取指针和写入指针,发起端将n个参与端的音频编码数据分别往所述参与端对应的环形缓冲区填充,之后将各环形缓冲区的写入指针指向距离填充完成时间最近的语音帧,并采集发起端的音频编码数据;将各个音频编码数据乘以其对应的权重因子;其中音频编码数据为16bit的语音帧;读取模块:在读取环形缓冲区中的语音帧前校准读取指针的位置,将读取指针前移一位;若读取指针指向的语音帧的获取时间早于写入指针指向的语音帧的获取时间,若时间间隔小于限定时间,则直接读取读取指针所指向的语音帧;若时间间隔大于等于限定时间,所述读取指针指向的语音帧的最大峰值是否大于声音阈值;是,则继续传输该语音帧;否,则直接略过该帧传输下一语音帧;若读取指针指向的语音帧的获取时间早于写入指针指向的语音帧的获取时间,此时读取指针指向的语音帧已被读取过,则直接读取写入指针所指向的语音帧,若该语音帧已被反复读取了m次,则直接略过该环形缓冲区内的语音帧,直至该环形缓冲区内的有新的语音帧填充;其中m为正整数;所述读取模块中,限定每个语音帧的时间长度为Tms,若读取指针指向的语音帧的获取时间早于写入指针指向的语音帧的获取时间;若时间间隔小于15*Tms,则直接读取读取指针所指向的语音帧;但时间间隔大于等于15*Tms,所述读取指针指向的语音帧的最大峰值是否大于声音阈值;是,则继续传输该语音帧;否,则直接略过该帧传输下一语音帧;扩展模块,将n+1个音频编码数据扩展为32bit的数据,分别存储到n+1个变量中;混音模块,将n+1个变量逐一累加得到和值;发送值获取模块,发起端将所述和值减去所要发送的参与端的变量得到一发送值;发送模块,将所述发送值重新转换为16bit的音频帧,通过发起端将该音频帧打包发送至对应的参与端:所述发送值,若不在[-32768,32767]之间,则直接将发送值赋值为极限值,之后重新转换为16bit的音频帧,通过发起端将该音频帧打包发送至对应的参与端;若在[-32768,32767]之间,则直接将发送值转换为16bit的音频帧,通过发起端将该音频帧打包发送至对应的参与端;完成模块,发起端重复发送值获取模块和发送模块,直至发起端将所有对应的音频帧发送至对应的参与端。本发明一种具体实施方式如下:为实现八方实时语音通话,本发明所述方法如下:任意选取一名通话参与者作为通话发起人,发起人给八个通话参与者分别设置一个权重因子(权重因子小于等于1),然后向所有其他参与者发起呼叫,由此建立7路通话。发起人的音频播放线程解码所有其他参与者的音频编码数据为16bit的语音帧,并分别存储到七个环形缓冲区中,且每个缓冲区分别拥有一个读取指针和一个写入指针,写入数据后更新写入指针。在发起人的音频采样线程获取到语音帧之后,语音帧被编码发送之前,先校准各缓冲区的读取指针,之后分别取出所有其他参与者的16bit的语音帧,将其乘以各参与者对应的权重因子,并扩展为32bit的数据,然后分别存储到7个变量中。同样,将发起人的语音帧也扩展为32bit的数据,并与上述的7个变量逐一累加,得到一个32bit和值。选取一名非发起人的参与者,将上述的和值减去上述七个变量中该参与者对应的变量,得到将要传输给该参与者的32bit的混音数据。将这个32bit混音数据做压限处理,并将它重新转换为16bit的音频帧就可以编码发送给所对应的参与者了。最后,分别更新七个环形缓冲区的读取指针。为有效减少混音造成的语音失真,本发明提供了一种方法,该方法如下:发起人在混音之前先将各语音帧扩展为32bit的语音数据,之后将所有参与者的语音帧逐一累加,得到一个和值,规避16bit每一步累加都可能造成的16bit二进制溢出。将这个和值减去参与者自身的32bit语音数据,得到将要传输给该参与者的32bit的混音数据。对上述32bit的混音数据做阈值判定,不在[-32768,32767]范围内,直接将混音数据赋值为极限值,最后将该32bit的混音数据转换为16bit,就得到了需要输出的语音帧。为有效减小混音造成的语音时延,本发明提供了一种方法,该方法如下:通话发起人开辟七个可以存储超过100个语音帧的环形缓冲区,分别设置一个读取标志和一个写入标志。发起人保存每一路通话接收到的语音帧,分别往该路通话参与者所对应的环形缓冲区中填充,之后将各环形缓冲区的写入指针指向距离填充完成时间最近的语音帧。发起人准备发送语音帧给其他各参与者前,先校准各缓冲区的读取指针,将读取指针前移一位。若读取指针领先于写入指针,说明对应语音通路的语音帧不足发生下溢(underflow),那么将读取指针重新指向写入指针,用旧的语音帧弥补缺失的语音,且同一旧语音帧只能被复用三次,超过三次则直接掠过该环形缓冲区,直至有新的语音帧插入;若读取指针落后于写入指针的距离较远,则说明对应语音通路的语音帧发生溢出(overflow),那么对准备读取的语音帧做阈值判定,小于阈值则忽略该帧直接读取下一帧,由此减小混音的延时。最后,读取指针指向最近读取的语音帧。六、具体实施方式:为了更清楚地说明本发明的技术方案,下面将以一个实例对附图作简单地介绍。对于本领域普通技术人员来讲,本发明不仅仅局限于WebRTC,它核心的多方语音混音方法适用于任何需要用到多方通话的软件或设备。这个实例所采用的八方通话模型如图3所示,A作为通话发起人,先给每个通话参与者设置一个权重因子(a、b...h),用以表示参与者在混音中的音量(权重因子不大于1),然后呼叫所有其他参与者(B、C、D、E、F、G和H),总共建立七路语音通路。一种呼叫方法是采用“群呼”的方式,同时向所有其他参与者发起呼叫,等待对方接听,建立语音通路。另一种是采用“逐一呼”的方式,先向其中一名参与者发起呼叫,对方接听后再呼下一名,如此反复,直至建立所有通路。所有通路建立之后,A按照图4所示的流程处理自身采集的16bit音频帧和七个通路中接收到16bit音频帧,具体流程如下:步骤401,A在创建每个语音通路的同时给每个通路开辟一段环形缓冲区,并初始化读取指针R和写入指针W,R/W开始指向同一位置。之后A的WebRTC音频接收播放线程每解码一个语音帧就放入相应的环形缓冲区,随后更新W,比如A收到B传来的n个语音帧,A按先到先存的原则将它们存储到B对应的环形缓冲区中,并将W指向最晚接收到的语音帧。步骤402,按照图5的处理流程,A的WebRTC音频采集发送线程先获取要读取的16bit语音帧(Xb1、Xc1、Xd1、Xe1、Xf1、Xg1、Xh1),将它们分别乘以对应的权重因子,之后扩展为32bit的数据(Xb2、Xc2、Xd2、Xe2、Xf2、Xg2、Xh2),这样可以确保后面的累加过程不会溢出。步骤403,需要说明的是发起人A的16bit语音帧也要做上述的处理。步骤404,逐一累加所有的32bit的语音数据,得到一个和值(Xa2+Xb2+Xc2+Xd2+Xe2+Xf2+Xg2+Xh2)。步骤406,步骤501,将和值减去Xb2后做阈值判定,大于32767则赋为32767,小于-32768则赋为-32768,然后将得到的值缩位回16bit,最后编码打包发送给B。再重复六次步骤406和步骤501,分别将处理后的语音帧编码打包发送给C、D、E、F、G和H。综上所述,本实例提供了一种基于WebRTC实现八方音频通话的方法,这个方法只需要简单地执行8次16bit到32bit数据的来回转换、8个加法和7次减法,即可实现语音的混音操作,减少了WebRTC程序的CPU占用率,且不用额外添加服务器合成混音流。图6是步骤402的一个应用实例,用来说明本发明提供的一种用于获取各环形缓冲区语音帧的方法。具体包括:发起人针对每路通话开辟一个可以存储超过100个语音帧的环形缓冲区,并分别添加一个读取指针R和写入指针W,之后交给步骤601和步骤605中的写入流程和读取流程操作。需要说明,在该实例中,每个语音帧的时间长度为20ms,设置的声音阈值为27。步骤605,在读取环形缓冲区中的语音帧前校准读取指针R的位置,先将R+1。步骤602,若R指向的语音帧的获取时间早于W指向的语音帧的获取时间,且时间间隔小于15x20ms,则直接读取R所指向的语音帧。步骤603,若R指向的语音帧是已经被读取过,则直接读取W所指向的语音帧,若该语音帧已经被反复读取了三次以上,则直接略过该环形缓冲区内的语音帧,除非它得到了更新。步骤604,若R指向的语音帧的获取时间早于W指向的语音帧的获取时间,但时间间隔大于15x20ms,那么就需要判断R指向的语音帧的最大峰值是否大于27,是则继续传输该语音帧,否则直接略过该帧传输下一语音帧。人在通话过程的发声必然是有停顿的,通过调整R略过极少部分声音微弱几乎听不到的语音帧来不断缩进R和W的距离,实现了减小混音时延的目的。虽然以上描述了本发明的具体实施方式,但是熟悉本技术领域的技术人员应当理解,我们所描述的具体的实施例只是说明性的,而不是用于对本发明的范围的限定,熟悉本领域的技术人员在依照本发明的精神所作的等效的修饰以及变化,都应当涵盖在本发明的权利要求所保护的范围内。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1