发明内容
鉴于上述现有技术所存在的缺点,本发明的目的是提供一种语音传输过程中实现动态调整抖动缓存的方法,从而使得接收网关的抗抖动机制能够动态地适配变化的IP网络。
本发明的目的是通过以下技术方案实现的:
本发明提供了一种语音传输过程中实现动态调整抖动缓存的方法,该方法包括:
A、统计并计算语音传输过程中的延时和抖动;
B、根据所述的延时和抖动对接收端的抖动缓存进行深度的调整。
所述的步骤A包括:
统计并计算语音传输过程中的平均延时和平均抖动,或者统计并计算语音传输过程中的最小延时和平均抖动,且所述的延时为语音数据包从发送方到接收方需要的时间,所述的抖动为各个语音数据包的延时的变化。
在上述步骤A中:
所述的平均延时dI和对应的平均抖动vi分别为:di=α×di-1+(1-α)×ni,vi=α×vi-1+(1-α)|di-ni|,α为通过测试获得的权值因子,且0≤α≤1,i为语音数据包的序号;
所述的最小延时为dmin和对应的平均抖动为vi分别为:dmin=min(dmin,ni),vi=α×vi-1+(1-α)(ni-dmin)。
所述的步骤A进一步包括:
A1、接收语音数据包,计算该语音数据包的平均延时和平均抖动值;
A2、将该语音数据包分拆为若干个以基本单位为打包时长的数据包,所述的基本单位是指JB(抖动缓存)队列中每个元素的打包时长;
A3、将拆分后的数据包加入抖动缓存队列中,同时,统计其中的丢包数量,并在丢包数量超过设定值时重新启动JB队列。
所述的步骤B包括:
B1、计算当前语音数据包的实际播放时间,即为旧播放时间,并根据计算获得的平均延时和平均抖动或最小延时和平均抖动计算当前语音数据包的播放时间,称为新播放时间;
B2、根据所述的旧播放时间和所述的新播放时间,对接收端的抖动缓存队列进行深度的调整。
所述的步骤B1包括:
根据当前的系统时间确定当前语音包的旧播放时间;
确定当前语音数据包的新播放时间:如果为基于平均延时和平均抖动计算,则所述的当前的第一个语音数据包的新播放时间为:pi=tsi+di+γ×vi,所述的后续的语音数据包的新播放时间为:pj=pi+tsj-tsi,所述的i为当前语音段的第一个语音数据包的序号,所述的j为后续的语音数据包的序号,所述的γ为对平均抖动的放大倍数,所述的tsi和tsj分别为发送端发送第i个和第j个语音数据包的时间;如果为基于最小延时dmin和平均抖动计算,则所述的当前语音数据包的新播放时间pi为:pi=tsi+dmin+γ×vi,所述的后续的语音数据包的新播放时间pj为:pj=pi+tsj-tsi。
所述的步骤B2包括:
当语音传输过程中发生语音数据包丢失的情况时,或处于静音期间时,则根据所述的语音数据包的旧播放时间和所述的新播放时间,对接收端的抖动缓存队列进行深度的调整。
所述的步骤B2包括:
B21、确定语音传输过程中的相应静音段的开始点;
B22、在所述的静音段的开始点根据所述的旧播放时间和所述的新播放时间,对接收端的抖动缓存队列进行深度的调整。
所述的步骤B22包括:
B221、计算新播放时间与旧播放时间间的差值,并判断该差值的绝对值是否大于允许的最大调整幅度值,如果大于,则令允许的最大调整幅度值为本次JB调整的幅度值,否则,以所述的差值的绝对值作为本次JB调整的幅度值;
B222、根据确定的本次JB调整的幅度值对所述的JB进行深度调整。
所述的步骤B222包括:
根据确定的本次JB调整的幅度值,并通过调整JB的出队指针进行JB长度的调整,包括进行增加JB深度的操作和缩短JB长度的操作。
本发明还包括,当进行所述的缩短JB深度的操作时,如果确定遇到语音数据包,则停止相应的缩短JB深度的操作。
本发明中,所述的步骤B包括:
判断上一次抖动缓存深度调整的时间距本次抖动缓存深度调整的时间的间隔值是否大于设定的允许进行抖动缓存深度调整的最小间隔时间,如果是,则根据所述的延时和抖动对接收端的抖动缓存进行深度的调整,否则,不进行抖动缓存的浓度调整。
由上述本发明所提供的技术方案可以看出,本发明中,通过实时统计网络的平均延时和平均抖动以准确地反映出当前网络的状况,并根据不断变化的网络中的平均延时和平均抖动状况对JB深度进行实时调整,从而使得接收网关的抗抖动机制能够动态地适配变化的IP网络,降低了在网络中传输语音的过程中的丢包率。本发明改变了原有的静态JB的技术方案所存在的因JB无法灵活地适应网络状况的变化而导致丢包率上升的问题。本发明中,在接收网关处可以根据实际需要灵活地选择相应的动态JB调整方案,以有效地改善网络中的语音传输效果。在相应产品中的测试结果表明本发明能很好地达到语音传输过程中的较佳的抗抖动效果,特别在网络质量较差的情况下可以较大地提高VOIP的语音质量。
具体实施方式
本发明提出了一种语音传输过程中实现动态调整抖动缓存的方法,该方法首先针对现有的静态JB提出了动态调整JB的概念,其次该方法提供了基于语音传输过程中产生的延时和抖动对接收端的JB的深度进行动态的调整,即兼顾了网络中进行语音传输时所产生的抖动和延时对JB的深度的不同要求,并进行相应的调整,从而有效地改善语音传输的质量,针对无法预计其延时变化的IP网络,采用动态JB可以达到很好的达到抗抖动效果,减少不必要丢包率或延时。如果仅根据平均抖动的变化作为JB深度需要调整的幅度,则当网络的平均延时增大,但平均抖动是不变时,无需对JB深度进行调整,而实际上由于平均延时增大,JB深度是需要进行增加调整的;因此,单纯依据平均抖动变化而不引入平均延时是无法准确地进行JB深度的调整,以适应不同的网络传输状况。
本发明中,可以采用实时地计算当前网络的平均延时和平均抖动,并根据实时统计的网络信息,动态调整JB深度的方便,从而使JB的深度可以适应当前的网络状况,降低了网络中的丢包率和延时,提高了VOIP(基于IP的语音业务)的语音质量。本发明的实现使得JB的深度不再仅与第一个语音数据包的到达时间的相关,如果第一个语音数据包早到或迟到导致JB的深度无法适应以后的需要,则可以通过后续的动态调整过程对JB深度进行调整补偿。
本发明所述的语音传输过程中实现动态调整抖动缓存的方法具体包括以下处理过程:
步骤1:实时统计并计算语音传输过程中的延时和抖动,以便于根据所述的延时和抖动确定所述的JB深度需要调整的幅度值;
为准确地衡量每次JB深度调整需要调整的幅度值,以保证调整后的JB可以很好地适应相应的网络传输情况,减少语音数据包的丢包率,并保证语音的质量;为此,可以根据语音传输过程中的平均延时和平均抖动进行相应的JB深度的调整,还可以根据语音传输过程中的最小延时和平均抖动进行相应的JB深度的调整,下面分别说明如何计算所述的各值:
(1)实时统计网络状况、计算每个包的播放时间,并通过如下公式对每个收到的语音数据包计算当前网络的平均延时di和平均抖动vi,其中涉及的ni为第i个语音数据包在网络中的总延时,ai为第i个语音数据包到达接收网送的时间(取自接收网关的系统时间),tsi为发送第i个语音数据包的时间(取自发送网关的DSP采样时间),α为可调的权植因子:
ni=ai-tsi→(算式1)
di=α×di-1+(1-α)×ni→(算式2)
vi=α×vi-1+(1-α)×|di-ni|→(算式3) 其中:0≤α≤1
语音数据包到达接收网关的时间和时戳之差就是语音数据包在网络中的相对延时ni;在此,我们并不考虑发送网关和接收网关的时钟同步问题。动态JB关注的问题是网络中的抖动,即延时的变化;而并不关注网络中产生的绝对延时,因此,只要保证发送网关和接收网关的相对时钟同步即可;上式中,通过对所述的α的调整可以设置本次数据包的计算值对平均值的影响程度,α可在实现中根据实际网络状况选择最优的权值;
(2)在对每个语音数据包进行网络状况统计时,所述的最小延时dmin和平均抖动vi2为根据如下算式进行计算:
ni=ai-tsi→(算式4)
dmin=min(dmin,ni)→(算式5)
vi=α×vi-1+(1-α)×(ni-dmin)→(算式6)
ni为第i个语音数据包在网络中的延时,dmin为最小延时,记录最小的网络延时;vi为平均抖动,与(1)中计算过程不同的是第i个语音数据包的抖动只要把第i个语音数据包的网络延时减去最小延时即可,而不必再进行取绝对值操作了,所述的α仍然是可调的权植因子。
步骤2:根据所述的平均延时和平均抖动,或者根据所述的最小延时和平均抖动计算每个语音数据包的播放时间,即语音数据包的新的播放时间;同时,还需要计算语音数据包的实际播放时间,即旧的播放时间;
即:以实时统计的网络中的语音传输的平均延时和平均抖动或最小延时和平均抖动作为计算依据,计算每个语音数据包的播放时间;以系统的当前时间为依据计算当前语音数据包的实际播放时间,
如果以平均延时和平均抖动为依据计算所述的语音数据包的播放时间时,具体计算可以采用以下算式进行,公式如下:
pi=tsi+di+γ×vi→(算式7)
pj=pi+tsj-tsi→(算式8)
其中,i为当前语音段的第一个语音数据包的序号,且pi为当前的第一个语音数据包的新的播放时间;j为当前语音段的后续的语音数据包的序号,且pj为后续的语音数据包的新的播放时间;γ表示对平均抖动的放大倍数,可在实现中根据实际网络状况选择最优的放大倍数;
如果以最小延时和平均抖动为依据计算所述的语音数据包的播放时间,则在计算每个语音数据包的播放时间可以采用如下算式:
pj=pi+tj-ti→(算式10)
其中,i为当前语音段的第一个语音数据包的序号,且pi为当前的第一个语音数据包的新的播放时间,j为当前语音段的后续的语音数据包的序号;且pj为后续的语音数据包的新的播放时间;γ表示对平均抖动的放大倍数,可在实现中根据实际网络状况选择最优的放大倍数;与前面不同的是,在计算pi时,不再使用平均延时,而是使用最小延时和平均抖动;
根据最小延时和平均抖动计算所述的语音数据包的播放时间时,因只要进行比较操作,所以计算量减小;而且,计算平均抖动时可以不必考虑取绝对值操作;然而,依据该方法计算出的播放时间进行JB深度调整,将可能导致JB深度不断增长,即计算出的pi值会偏大,例如,当网络正常时最小延时为dmin,经过一段时间后,由于某台关键路径上的路由器瘫痪而导致网络延时增加并且持续了一段时间,此时仍然使用网络正常状况下记录的dmin,将导致平均抖动增大,再经过γ倍的放大后,最终导致每次计算出的pi都会偏大;因此,如果要使用该方法还需要避免JB深度不断增大,例如可以采用当dmin值在设定的一段时间内没有更新时,则强迫更新其值,从而避免JB深度不断增大。
步骤3:根据所述的当前语音数据包的新的播放时间与旧的播放时间的差值进行JB深度的调整,即根据所述的差值确定JB深度需要调整的幅度值;
对JB深度通常采用调整JB队列出队指针的方式进行,如果增大JB的深度,则将相应的出队指针作递减处理,如果减小JB的深度,则将相应的出队指针作递增处理,所述的递增或递减的量则由所述的JB深度需要调整的幅度值确定;
通常在对JB深度进行调整时,为保证语音传输过程的相对稳定,还需要考虑两方面的问题,一方面是确定合适的对JB深度进行调整的频度,过于频繁的调整将导致JB深度的反复振荡,而频度大小又无法很好地体现出动态JB的优点,另一方面是对JB深度进行调整的幅度,如果一次调整的幅度过大,会出现JB深度瞬间大幅度伸长或大幅度缩减,对语音的瞬间传输效果产生较大的影响;
另外,对JB深度进行动态调整时,还需要确定一个调整的时间点;由于在一个持续通话中,通话双方传送的语音数据通常是一段语音和一段静音交替出现,因此,动态调整JB深度时间点可以采用两种方式确定:
一种是随机调整的方式,即语音传输过程中一旦出现丢包情况便立刻进行JB深度的调整,如图4所示,语音段K的第i+1个语音数据包迟到导致丢包,这时立刻根据相应的计算结果进行JB深度增长调整,从而使得后续的第i+2、i+3、i+4个包不被丢弃;随机调整方式的优点是减少丢包率,但会损坏通话的语音质量,影响交互通话的可理解性,例如当调整点恰好落在语音段时,此时如果增加JB深度会使一句连贯的话中出现了不应该的停顿;相反,如果减少JB深度会使一句话中的若干部分丢失,这些都会造成语音质量的下降;
另一种方案是静音期间调整的方式,即动态调整的时间点选择在静音期间,采用这种方案就可以避免第一种方案中造成的语音质量下降;如果在静音期间进行动态JB的调整,增加和减小JB深度只会影响静音阶段持续时间的长短,而静音阶段持续时间的稍微增长或缩短并不会影响到语音质量;如图5所示,在语音段K中,即使出现了丢包也不进行调整,在静音段K中进行动态JB深度增长调整,使得后续的语音段K+1不再出现丢包,所产生的影响只是静音段K的稍微增长。
下面以静音期间调整的方式为例,对本发明所述的的基于平均延时和平均抖动的动态调整JB的实现方法作进一步说明,具体的实现过程可以包括三个处理过程,分别为:语音数据包入队的处理过程、出队的处理过程、动态调整JB深度的处理过程。JB中的JB队列按时戳进行排序,JB队列的每个元素代表不同编解码打包时长的基本单位,如G.711规定基本单位为10ms、G.729规定基本单位为10ms、G.723规定基本单位为30ms。
首先,对语音数据包入队的处理过程进行说明,语音数据包入队过程中除了对所述的语音数据包进行加入JB队列的处理外,还需要计算所述的语音数据包的ni、di、vi,以便于后面的动态调整JB深度的处理过程根据该计算结果进行相应的调整,对ni、di、vi的计算可以采用前面描述过的算式实现,其中,考虑到算法在CPU(中央处理器)上的运行效率,所述的α的取值都应为2的N次幂的倒数,如0.875,0.75等,这样,在实现时可使用移位运算完成,例如,通过在网上实际测试得出α取值0.75时效果最佳,故α取值0.75。除上述计算外,对语音数据包进行加入JB队列的处理过程如图6所示,具体包括以下步骤:
步骤61:进行语音数据包的拆包处理,即将各种编解码各种打包时长的单个数据包拆成若干个以基本单位为打包时长的数据包,除了拆分语音数据包净荷部分外,还包括对拆分后各个RTP(实时传输协议)包首部时戳的重新计算,以确定新的时间戳。
步骤62:定义一个丢包计数器变量ucLossCounter,用于记录连续的无法进入JB队列的数据包个数,即语音数据包因迟到或早到导致丢包时,该变量开始计数。
步骤63:判断当前的拆分获得的数据包能否入JB队列,如果能,则执行步骤64,否则,执行步骤65;
步骤64:令丢包计数器变量ucLossCounter=0,并保存当前的数据包;另外,为确定保存的数据包不是重复的数据包,该步骤中在保存当前的数据包前还需要判断所述的数据包是否为重复的数据包,如果是,则作丢弃处理,如果不是,则保存。
步骤65:确定该数据包为迟到或早到的数据包而无法加入JB队列,即该数据包为丢弃的数据包,将丢包计数器变量ucLossCounter作加1处理;
此处还需要分别对迟到、早到的数据包进行统计,作为测试JB效果的参数,以便于根据该参数确定本发明中涉及的可调的参数,如α和γ等。
步骤66:判断丢包计数器变量ucLossCounter是否小于设定的丢包数量,如果小于,则执行步骤67,不对JB队列作处理,否则,执行步骤68,重新启动JB队列;
例如可以设定允许的丢包数量为3,则当连续三个数据包无法入JB队列时,便重启JB队列,同时为监测网络在一段时间内的语音传输性能,还需要对JB重新启动的次数进行统计,如果重新启动的次数过多则说明网络中存在着较严重的延时和抖动,如不进行维护已经无法再进行语音数据的传输。
相应的数据包进入JB队列缓存后,经过一定的延时后,接着,还需要对所述的数据包进行出队处理,具体的处理过程如图7所示,包括以下步骤:
步骤71:定义静态变量:空包计数器变量和调整频度变量,分别用于统计连续的空包的数量,及连续两次调整间隔的时间值;
所述的空包计数器变量用于确定当前是否处于静音期间;
所述的JB队列初始延时计数器用于实现一个设定的JB队列的初始延时,如初始可以设置为50ms,则经过50ms后JB队列中的数据包方可出队;具体的计数方式为:当需要执行一次出队处理时,判断初始延时计数器值是否小于或等于0,如果不是,则减去JB队列元素的基本单位(如10ms),如此循环操作,直到所述的初始延时计数器值小于或等于0时,开始进行出队处理,即执行以下步骤。
步骤72:判断出JB队列的数据包的类型,即根据数据包中的记录其类型的字段值确定数据包的类型,如果是空包,则执行步骤73,如果是静音包,则执行步骤74,对于语音包,则执行步骤75。
步骤73:对所述的空包进行进一步的处理,包括:
步骤731:根据静间标志判断当前是否处于静音期间,如果该标志为true,则为处于静音期间,如果为false,则不处于静音期间,从而进一步确定该空包是否为静音包,如果是,则执行步骤732,否则,执行步骤733;
步骤732:令空包计数器值为“0”,并创建非传输帧,执行步骤736;
步骤733:令空包计数器值加1,并判断空包计数器计数值是否大于设定值,如果大于,则执行步骤734,否则,执行步骤735;
步骤734:将所述的静音标志设置为true,确定当前处于静音期间,并确定该数据包为静音包,创建非传输帧,执行步骤736;
步骤735:创建丢包指示帧,以便于进行相应的丢包数量的统计,并执行步骤736;
步骤731至步骤735的处理过程主要为区分当出队的元素为空(即为空包)且当前不是处于静音期间时所存在的两种可能:一种是当前出队的数据包应该为语音包,但由于该数据包迟于其播放时间到达,造成丢包,这时应向DSP下发丢包指示帧;第二种可能是在此之前,丢失了一个静音帧,因而没有将静音标志置为静音期间,这时向DSP下发的应是非传输帧而不是丢包指示帧;例如,可以设定当空包计数器变量ucEmptyCounter记录的连续出现次数小于2次时,将当前空包当成丢包指示帧下发;当次数大于等于2次时,当成非传输帧下发,同时把当前静音标志改为静音期间;
步骤736:将数据包出队,统计出队数据包数量,并更新出队指针和出队时戳。
步骤74:对静音包作进一步的处理,具体包括:
步骤741:令空包计数器计数值为“0”,且记录当前最静音包大序列号,并将数据包的RTP头部转换成DSP头部;
步骤742:将数据包出队,统计出队数据包数量,并更新出队指针和出队时戳;
步骤743:判断静间标志是否为静音期间的标志,如果是,则执行步骤744,即不作任何处理,如果不是,则将静音标志设置为静音期间的标志,并执行步骤745;
步骤745:判断当前调整频度变量的统计值是否大于设定的允许的两次JB深度调整的间隔时间(即调整频度控制因子),如果是,则执行步骤746,否则,执行步骤747;
所述的调整频度控制因子为通过一个计时器进行统计,每进行一次JB深度调整,则该计时器清“0”,并始重新计时,当需要进行新的一次的JB深度的调整时,判断该计时值是否大于设定的值(即设定的允许的两次JB深度调整的间隔时间),如果大于,则执行步骤746,否则,执行步骤747;
所述的调整频度控制因子为通过测试获得,可以在实际网或模拟实际网上测试获得,例如可以取值为100毫秒,即控制两次动态JB调整的时间间隔至少为100毫秒;
步骤746:进行JB深度的调整,具体的调整过程,将在后面的动态调整JB深度的处理过程中进行说明;
步骤747:针对该静音包的处理过程结束。
步骤75:对所述的语音包进行处理,具体包括:
步骤751:令空包计数器变量为“0”,如果所述的静音标志为静音期间的标志,还需要将所述的静音标志改为非静音期间的标志;
步骤752:记录当前的数据包的最大序列号,并将所述的RTP头部转换成DSP头部;
步骤753:出队并统计出队的数据包的数量,更新出队指针和出队时戳,本次语音包的处理过程结束。
最后,对所述的动态调整JB深度的处理过程进行说明。对JB深度进行调整时,具体的调整点选择在每个静音段的开始点,以避免在语音段开始点进行缩短JB深度的调整,导致丢弃该语音段的前面若干语音包,造成语音质量下降的现象出现;具体的处理过程参见图8,包括以下步骤:
步骤81:为判断是否需要进行JB深度的动态调整时,首先需要计算当前静音包的实际播放时间,定义为旧播放时间,所述的旧播放时间为根据当前的系统时间确定,即旧播放时间=系统当前时间×时间转换变量,所述的时间转换变量为将毫秒转换为系统的计时单位1/8毫秒;
步骤82:根据前面所述的算式7或算式9,计算出当前静音包的播放时间,定义为新播放时间,新播放时间就是符合当前网络抖动状况的播放时间;
步骤83:计算新播放时间和旧播放时间之差,即为JB深度需要调整的幅度,为便于进行调整还需要将所得的差值除以JB的元素长度值(即打包时长的基本单位),获得最终的JB深度需要调整的幅度值,如果所得的差值为“0”,则不需要进行调整;
步骤84:比较确定所述的幅度值的绝对值与设定的允许的一次最大调整的幅度值中较小的一个,作为实际针对JB调整的幅度值;
所述的允许的一次最大调整的幅度值即为调整幅度控制因子,通过实际网或模拟实际网上测试,取值可以为10,单位为JB队列单元格所对应的时间(即基本单位),例如编解码为G.711时,动态JB一次调整的幅度范围允许为增长或缩短JB深度(10×10)毫秒;
步骤85:判断所述的计算获得的幅度值是否小于“0”,如果是执行步骤86,否则,执行步骤87;
步骤86:对JB进行深度缩短的调整,具体为:
步骤861:建立循环变量,并令其初始值为“0”;
步骤862:判断循环变量是否小于实际针对JB调整的幅度值,如果是,则执行步骤863,否则,执行步骤88;
步骤863:判断当前数据包是否为语音包,如果是语音包,则执行步骤88,否则,执行步骤864;
即在进行JB深度缩短操作时,只要遇到语音包就立刻停止缩短调整,以保证JB深度调整时不删除任何语音包,避免由于JB深度动态调整造成的语音质量下降;
步骤864:将当前数据包类型置为空包,并将出队指针递增1,循环变量加1,执行步骤862;
步骤87:对JB进行深度增长调整,具体为:
步骤871:建立循环变量,并令其初始值为“0”;
步骤872:判断循环变量是否小于实际针对JB调整的幅度值,如果是,则执行步骤863,否则,执行步骤88;
步骤873:将出队指针递减1,并将当前数据包类型置为空包,循环变量加1,执行步骤872;
步骤88:根据调整的结果更新JB的深度值,过程结束。
由上述针对本发明的详细的描述可以看出,与静态JB相比,本发明能根据不断变化的网络状况进行动态JB深度的实时调整,使得接收网关的抗抖动机制能够动态地适配变化的IP网络。通过实时统计网络的平均延时和平均抖动可以准确地反映出当前网络的状况。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求书的保护范围为准。