语音传输过程中动态调整抖动缓存的实现方法
技术领域
本发明涉及网络通信技术领域,尤其涉及一种语音传输过程中动态调整抖动缓存的实现方法。
背景技术
随着Internet(互联网)应用的普及和技术的不断成熟,使得传统的语音信息承载在Internet上传输成为可能,因此,VOIP(基于互联网协议的语音)相关的各项技术也就应运而生。其中Jitter Buffer(抖动缓存,简称JB)技术正是VOIP的核心技术之一,JB的功能是在网络的接收方对接收的语音数据包进行缓存处理,然后,再进行播放处理,从而可以有效地降低丢包率,减少网络抖动对语音质量的影响。因此,JB技术直接影响到VOIP的语音质量,尤其在网络质量状况较差的情况下,JB的作用更为突出。JB技术主要分为两类:静态JB技术和动态JB技术。
目前Internet网络中固有的延时、抖动、丢包、乱序已经证明静态JB技术不能很好地起到抗抖动的效果,因此,针对不断变化的网络质量状况,只有采用可动态调整深度的JB才能有效地去除网络抖动,达到低延时、低丢包率的效果,从而保证网络中传输的语音的质量。
现有的动态JB的实现方案中,一种是基于平均延时和平均抖动的动态JB方案。对每个到达接收网关的数据包,都进行平均延时和平均抖动的统计,如下公式:
ni=ai-tsi→(算式1)
di=α×di-1+(1-α)×ni→(算式2)
vi=α×vi-1+(1-α)×|di-ni|→(算式3) (0≤α≤1)
其中:di为平均延时;vi为平均抖动;α为可调的权植因子,通过α的调整可以设置本次数据包的计算值对平均值的影响程度,可在实现中根据实际网络状况选择最优的权值;tsi为发送第i个包的时间(来自发送网关的DSP采样时间);ai为第i个包到达接收网关的时间(来自接收网关的系统时间);pi为第i个包在接收网关被播放的时间;ni为第i个包在网络中的总延时;
在计算每个包的播放时间时,按如下公式:
pi=tsi+di+γ×vi→(算式4)
pj=pi+tsj-tsi→(算式5)
其中:i为语音段第一个数据包,j为语音段的后续数据包。γ表示对平均抖动的放大辈数,可在实现中根据实际网络状况选择最优的放大辈数。
现有的动态JB的另一种实现方案是基于最小延时和平均抖动的动态JB方案。对每个到达接收网关的数据包,都进行最小延时和平均抖动的统计,如下公式:
ni=ai-tsi→(算式6)
dmin=min(dmin,ni)→(算式7)
vi=α×vi-1+(1-α)×(ni-dmin)→(算式9)
其中:ni为第i个包在网络中的延时,dmin为最小延时,记录最小的网络延时。vi为平均抖动,和上述第一种方案不同的是计算第i个包的抖动,只要把第i个包的网络延时减去最小延时即可,而不必再进行取绝对值操作了。α仍然是可调的权植因子。
在计算每个包的播放时间时,按如下公式:
pi=tsi+di+×γvi-(算式10);
pj=pi+tsj-tsi-(算式11);
其中:i为语音段第一个数据包,j为语音段的后续数据包。γ表示对平均抖动的放大辈数,与第一种方案不同的是在计算pi时,不再使用平均延时,而是使用最小延时和平均抖动。
可以看出,基于平均延时或最小延时和平均抖动的动态JB均未实现对语音传输过程中的丢包率进行设置和控制,而丢包率和延时是衡量VOIP语音质量的重要因素,并且在语音传输过程中,丢包率和延时两个参数是相互矛盾的,如果增加JB深度,则丢包率将减少,但增加了JB队列缓存产生的延时;相反,如果减小JB深度,则丢包率增加,但可减少JB队列缓存产生的延时。对于延时可以通过设置JB队列深度进行控制,可是对于丢包率目前还无法对其进行控制。
然而,在实际应用中,对丢包率进行控制进而得到不同效果的延时是很有意义。例如,不同的编解码方式对丢包率的要求是不一样,对于那些对丢包率要求不是很苛刻的编解码,如G.711,我们可以通过稍微放大丢包率来得到较小的延时效果;相反,对于那些对丢包率很敏感的编解码,如G.723,我们就应该以适当地牺牲延时来换取更低的丢包率。因此,为了更好保证基于各种编解码的语音质量,丢包率的可控制便成为了关键。但目前还无法通过设置丢包率来控制JB队列的深度,进而控制端到端的延时,并最终获得更优的语音质量。
发明内容
鉴于上述现有技术所存在的缺点,本发明的目的是提供一种在语音传输过程中动态调整抖动缓存的实现方法,以根据语音传输过程中允许的丢包率对JB的深度进行相应的调整,最终获得较佳的语音质量。
本发明的目的是通过以下技术方案实现的:
所述的一种语音传输过程中动态调整抖动缓存的实现方法,包括:
A、确定语音传输过程中允许的丢包率;
B、根据允许的丢包率确定语音传输过程中的需要调整的抖动值;
C、根据确定的语音传输过程中需要调整的抖动值及语音传输过程中的延时值对抖动缓存进行深度调整。
所述的步骤A包括:
根据进行语音传输的网络的要求确定语音传输过程中允许的丢包率。
所述的步骤B包括:
分别确定并保存一组连续的数据包中各个数据包的播放时间与到达接收网关的时间的差值,再根据保存的一组连续的数据包的差值及允许的丢包率确定语音传输过程中的需要调整的抖动值。
所述的步骤B进一步包括:
B1、分别确定一组连续的数据包中各个数据包的播放时间与到达接收网关的时间的差值,定义为差值因子;
B2、根据允许的丢包率确定所述的一组连续的数据包中不可以丢失的数据包数量;
B3、在所述的一组连续的数据包中,根据差值因子的由大到小确定出其中不可以丢失的数据包数量的数据包组,并在所述的数据包组中确定最小差值因子;
B4、根据所述的最小差值因子确定语音传输过程中的需要调整的抖动值。
所述的步骤B2和步骤B3包括:
将所述的一组连续的数据包中的各个数据包根据所述的差值因子由大到小顺序排列成为一组差值因子组;
根据允许的丢包率确定出一组连续的数据包中不可以丢失的数据包数量,并以该数量值为顺序号在所述的差值因子组中确定出对应的差值因子,作为差值因子组中的最小差值因子。
所述的步骤B4包括:
基于该组连续的数据包的语音传输过程中需要调整的抖动值等于基于前一组连续的数据包的语音传输过程中需要调整的抖动值减去所述的最小差值因子。
所述的步骤C包括:
C1、根据当前的系统时间确定当前语音包的旧播放时间;
C2、基于当前语音包计算确定语音传输过程中的平均延时值dI为:di=α×di-1+(1-α)×ni,α为通过测试获得的权值因子,且0≤α≤1,i为语音数据包的序号,ni为第i个语音数据包在网络中的总延时,且ni=ai-tsi,其中涉及的ai为第i个语音数据包到达接收网送的时间,tsi为发送第i个语音数据包的时间;
C3、根据所述的平均延时及需要调整的抖动值vk确定当前语音数据包的新播放时间为:
其中,i为语音段第一个数据包,j为语音段的后续数据包,所述的tsi和tsj分别为发送端发送第i个和第j个语音数据包的时间,k为语音段的序号;
C4、根据当前语音数据包的旧播放时间与新播放时间的差值对抖动缓存的深度进行调整。
所述的步骤C4包括:
C41、确定语音传输过程中的相应静音段的开始点;
C42、计算新播放时间与旧播放时间间的差值,并判断该差值的绝对值是否大于允许的最大调整幅度值,如果大于,则令允许的最大调整幅度值为本次JB调整的幅度值,否则,以所述的差值的绝对值作为本次JB调整的幅度值;
C43、根据确定的本次JB调整的幅度值,并通过调整JB的出队指针进行JB长度的调整,包括进行增加JB深度的操作和缩短JB长度的操作。
所述的步骤地C43还包括:
当进行所述的缩短JB深度的操作时,如果确定遇到语音数据包,则停止相应的缩短JB深度的操作。
所述的步骤C4还包括:
判断上一次抖动缓存深度调整的时间距本次抖动缓存深度调整的时间的间隔值是否大于设定的允许进行抖动缓存深度调整的最小间隔时间,如果是,则根据所述的延时和抖动对接收端的抖动缓存进行深度的调整,否则,不进行抖动缓存的深度调整。
由上述本发明提供一技术方案可以看出,本发明提供了一种丢包率可控的动态JB的实现方案,使丢包率在动态JB深度调整过程中成为一个可控的因素。本发明的实现使得在语音传输过程中可以根据实际的应用需求来设置丢包率大小,从而控制VOIP端到端的总体延时,最终获得更优的VOIP语音质量。具体的讲,本发明的实现可以在基于不同的编解码方式进行语音传输的网络中采用不同的丢包率,例如,对于对丢包率要求不是很苛刻的编解码(如G.711)可以通过采用大一点的丢包率以得到较小的延时效果;相反,对于对丢包率很敏感的编解码(如G.723)则应该以适当地增加延时换取更低的丢包率。
附图说明
图1为动态JB涉及的变量含义示意图;
图2为本发明所述的方法的流程图。
具体实施方式
本发明所述的方法的核心是引入一个丢包率控制因子,所述的丢包率控制因子即为网络中传输语音过程中允许的丢包率。当允许的丢包率取值0时表示丢包率为0%,当允许的丢包率取值1时表示丢包率为100%。本发明中,是采用上一个语音段中所有数据包的分析统计结果以及当前允许的丢包率确定当前语音段的JB深度。因此,本发明的关键是结合允许的丢包率对上一个语音段中的数据包进行分析,从而得出针对后续的语音数据包的接收缓存处理时需要调整的JB深度值,使得语音传输过程中,既可以满足网络允许的丢包率的要求,还可以保证网络延时的最小化。即本发明的实现使得可以在网络中根据实际的需要确定最恰当的丢包率和网络延时,如在网络传输允许的情况下采用稍大一点的丢包率,以获得较小的网络延时,或者采用小一点的丢包率,此时将导致网络延时的增大。
本发明所述的方法的具体实现方式如图2所示,包括以下步骤:
步骤21:根据进行语音传输的网络的要求确定允许的丢包率;
通常为根据网络对丢包率的要求确定,例如,语音传输网络对丢包率的要求比较严格,则相应的允许的丢包率便需要确定的低一些,反之,如果语音传输网络对丢包率要求不是很严格,则可以将相应的允许的丢包率设定的高一些,以获得较小的网络延时。
步骤22:确定了允许的丢包率后,便可以根据所述的允许的丢包率确定语音传输过程中需要调整的抖动值;
该步骤中,是根据接收网关已经完成缓存及播放处理的一组语音数据包的相关参数及允许的丢包率进行抖动值的确定,具体为:首先,分别确定并保存一组连续的数据包(如一个语音段包括的数据包等)中各个数据包的播放时间与到达接收网关的时间的差值,然后再根据保存的一组连续的数据包的差值及允许的丢包率确定语音传输过程中的需要调整的抖动值;
因此,所述的步骤22可以进一步包括:
步骤221:分别确定一组连续的数据包中各个数据包的播放时间与到达接收网关的时间的差值,定义为差值因子;
如果一组连续的数据为一个语音段中包括的数据包时,则在分析上一个语音段中所有数据包的统计值时,所述的差值因子diff的相应的计算公式为:
其中:diffi k表示第k个语音段中第i个数据包的差值因子,pi k表示第k个语音段中第i个数据包的播放时间,ai k表示第k个语音段中第i个数据包的到达时间,所述的k为语音段的序号;所述的diffi k的取值可以为正值,也可以为负值,当第i个包迟到时,即在其预计播放时间之后才到达,则视之为丢包,此时diffi k为负值;当第i个包早到时,即在其预计播放时间之前就到达,则diffi k为正值;
步骤222:根据允许的丢包率确定所述的一组连续的数据包中不可以丢失的数据包数量;并在所述的一组连续的数据包中,根据差值因子的由大到小确定出其中不可以丢失的数据包数量的数据包组,然后,在所述的数据包组中确定最小差值因子,总之,该步骤的目的是在所有不可以丢失的数据包对应的差值因子中确定出一个最小的差值因子;
具体可以为:将所述的一组连续的数据包中的各个数据包根据所述的差值因子由大到小顺序排列差值因子组;根据允许的丢包率确定出一组连续的数据包中不可以丢失的数据包数量,并以该数量值为顺序号在差值因子组中确定出对应的差值因子,作为差值因子组中的最小差值因子;
仍以步骤221所述的实例为例,首先,构造一个差值数组diff_array[N]用于存放上一个语音段所有的N个包的diffi k,而且将该数组从大到小进行排序操作,这样,便可以根据允许的丢包率loss和排序后的差值数组求出第k个语音段的抖动值targetdiff k,该值即为最小差值因子:
也就是说,根据允许的丢包率loss可以确定应该控制语音段k中的N个数据包有(1-loss)×N个数据包不丢失,即应当有(1-loss)×N个数据包的diffi k为正值,而有loss×N个数据包的diffi k为负值,因此,若假设网络运行平稳,后续的语音段与当前的语音段特征相同,则为了使后续的语音段符合允许的丢包率要求,需要调整的抖动值便是排序后的差值数组中的第(1-loss)×N个元素值(即第(1-loss)×N个元素对应差值因子),使得调整后,在后续的语音段中该值为0,且当该值为0时,则语音传输过程中的实际丢包率正好可以满足允许的丢包率的要求,同时,还保证在满足允许的丢包率的情况下基于抖动缓存的延时最小;
步骤223:根据所述的最小差值因子确定语音传输过程中的需要调整的抖动值,基于步骤222,排序后的差值数组中的第(1-loss)×N个元素值targetdiff k便可以确定为在特定丢包率下当前网络抖动需要调整的精确差值;同时还考虑到前一个语音段的抖动值对当前语音段的抖动值的影响,可以确定当前语音段的抖动值vk为:
即第k个语音段的抖动值vk可通过第k-1个语音段抖动值vk-1和第k个语音段的最小差值因子targetdiff k之差得出;
也就是说,可以认为基于该组连续的数据包的语音传输过程中需要调整的抖动值等于基于前一组连续的数据包的语音传输过程中需要调整的抖动值减去所述的最小差值因子;
另外,在实际的通话过程中,每个语音段持续时间的长短是不定的,因此很难预计每个语音段中所有数据包的个数。在实现时,便可以采用一种简化的方式,即收集接收网关接收的连续50个数据包(作为一组连续的数据包,当然还可以为连续的40个数据包或连续60个数据包等)的差值因子,存入一个有50个元素空间的差值数组,并根据这连续50个数据包的统计信息再求出所述的最小差值因子target,最终计算出当前网络的抖动值;
经过上述处理过程后,便获得了网络中需要调整的抖动值,结合网络中的平均延时值便可以进行针对JB深度需要调整的幅度值的计算了,网络中的平均延时的计算可以采用背景技术中的算式进行计算,通常对于采用动态JB方案的网络中,应该实时计算出网络的平均延时值,以便于计算需要调整的JB深度值,具体过程如下:
步骤23:根据当前的系统时间确定当前语音包的播放时间,定义为旧播放时间,所述的旧播放时间为根据当前的系统时间确定,即旧播放时间=系统当前时间×时间转换变量,通过所述的时间转换变量可以将毫秒转换为系统的计时单位1/8毫秒;
步骤24:基于当前语音包计算确定语音传输过程中的平均延时值di为:di=α×di-1+(1-α)×ni,α为通过测试获得的权值因子,且0≤α≤1,i为语音数据包的序号,ni为第i个语音数据包在网络中的总延时,且ni=ai-tsi,其中涉及的ai为第i个语音数据包到达接收网送的时间,tsi为发送第i个语音数据包的时间;
即,计算出特定丢包率下的抖动值之后,对每个到达接收网关的数据包,只需再统计其平均延时即可,而不必再进行平均抖动的统计;
而且,根据上述计算结果,我们可以确定出第k个语音段每个数据包的播放时间,如下:
其中,i为语音段第一个数据包,j为语音段的后续数据包,所述的tsi和tsj分别为发送端发送第i个和第j个语音数据包的时间;
步骤25:确定语音传输过程中的相应静音段的开始点,本发明中可以选择在静音期间进行JB深度的调整,尤其对于将JB深度缩短的操作更应当选择静音段的开始点进行,从而避免丢包,保证语音传输的质量;
步骤26:计算新播放时间与旧播放时间间的差值,并判断该差值的绝对值是否大于允许的最大调整幅度值,如果大于,则令允许的最大调整幅度值为本次JB调整的幅度值,否则,以所述的差值的绝对值作为本次JB调整的幅度值;
步骤27:根据确定的本次JB调整的幅度值,并通过调整JB的出队指针进行JB长度的调整,包括进行增加JB深度的操作和缩短JB深度的操作;
当需要对JB深度进行调整时,与现有的动态JB实现方法中涉及的JB调整处理过程相同,即具体的JB深度调整点选择在每个静音段的开始点,尤其是对JB深度进行缩短调整时更应当选择在静音段进行,以避免在语音段开始点进行缩短JB深度的调整,导致丢弃该语音段的前面若干语音包,造成语音质量下降的现象出现;
而且,当进行所述的缩短JB深度的操作时,如果确定遇到语音数据包,则停止相应的缩短JB深度的操作。
本发明中,在执行步骤25至步骤27的过程中还包括:判断上一次抖动缓存深度调整的时间距本次抖动缓存深度调整的时间的间隔值是否大于设定的允许进行抖动缓存深度调整的最小间隔时间,如果是,则根据所述的延时和抖动对接收端的抖动缓存进行深度的调整,否则,不进行抖动缓存的深度调整,这样可以避免频繁地对JB进行深度的调整从而影响了系统的稳定性。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求书的保护范围为准。