一种处理网络抖动的方法及装置与流程

文档序号:20080944发布日期:2020-03-10 10:38阅读:827来源:国知局
一种处理网络抖动的方法及装置与流程

本申请涉及一种数据传输处理技术,特别是涉及一种语音数据包在网络传输过程中针对网络抖动的处理方法。



背景技术:

随着4g技术的成熟和普及,越来越多的音视频通过有线或者无线网络的分组交换(packetswitch,ps)实现互通,例如volte(voiceoverlte,长期演进语音承载)、vilte(videooverlte,长期演进视频承载)等。

当语音数据包(packet)通过分组交换从设备a发送到设备b时,每个数据包可能会经历多个基站、媒体网关等路由。由于每个路由的负载、数据包排队等待序列都不相同,所以不同的数据包在网络中传输的时间是不一样的。例如图1所示,当设备a按时序发送多个语音数据包给设备b时,设备b接收到数据包的时序和设备a发送的时序可能不同,这样数据包在设备b就产生了抖动(jitter)。这种抖动是由网络状况引起的,也称为网络抖动。

在设备b中,为了消除由网络引起的抖动,目前一般的做法是在设备b中添加抖动缓存模块(jitterbuffer)。这样,即使设备b从网络侧收到的数据包时序和设备a发送的时序不同,在设备b在经过抖动缓存模块的处理后,从抖动缓存模块出来的数据包时序和设备a发送的时序一致,这样就消除了网络的抖动,提升语音通话质量。

由于抖动缓存模块将语音数据包缓存起来,所以抖动缓存模块在消除网络抖动的同时,会带来语音延迟(delay)增加的影响。语音延迟指从设备a麦克风采集语音到设备b播放语音的时间。语音延迟太大同样会影响通话体验。

处理语音数据包传输过程中的网络抖动问题,目前主要有两种解决方案。

早期的解决方案通过在接收端放置一个固定大小的抖动缓存模块,不管网络抖动大小如何,抖动缓存模块的大小不变。这种方案无法根据网络实时状况调整抖动缓存模块的大小。

随后出现的解决方案在接收端设置自适应(adaptive)抖动缓存模块用来处理网络抖动,这种技术可以根据网络实时状况调整抖动缓存模块的大小。但目前的技术无法对网络的抖动大小做定量的计算。



技术实现要素:

本申请所要解决的技术问题是根据网络抖动情况实时地调整抖动缓存模块中的语音数据包消耗速度,同时确保语音延迟较小,以实现语音音质和语音延迟的平衡;还能够定量地计算网络抖动大小。

为解决上述技术问题,本申请提供了一种处理网络抖动的方法,包括如下步骤。第一步:在每次从网络收到语音数据包时,计算该语音数据包传输过程中的网络抖动。第二步:根据当前网络抖动,计算抖动缓存模块的目标深度。所述目标深度是指抖动缓存模块中所缓存的语音数据包的当前理想数量所对应的总时长。第三步:在每次从抖动缓存模块里面获取语音数据包时,计算抖动缓存模块的当前平滑深度。所述当前平滑深度是对当前实际深度经过平滑化处理的一个参数。所述当前实际深度是指抖动缓存模块中所缓存的语音数据包的当前实际数量所对应的总时长。第四步:调整抖动缓存模块中的语音数据包的消耗速度。所述第三步或者改为在第一步之前、或者改为与第一步同时进行、或者改为在第一步和第二步之间、或者改为与第二步同时进行。

上述方法通过分析收到的语音数据包的时序,计算当前网络的抖动,并且调整抖动缓存模块中的语音数据包的消耗速度,使其能够自适应网络抖动。

进一步地,所述第一步进一步包括如下步骤。步骤s12:接收语音数据包。步骤s14:将该语音数据包存入抖动缓存模块。步骤s16:判断该语音数据包是否为接收的第一个语音数据包;如果是,则回到步骤s12;如果否,则进入步骤s18。步骤s18:计算该语音数据包传输过程中的网络抖动。这是第一步的一种具体实现方式。

进一步地,所述步骤s18中,该语音数据包传输过程中的网络抖动jitter(k)=max(0,delay(k)),其中max函数表示取最大值,delay(k)表示该语音数据包在网络传输过程中的相对延迟。这是一个示例性的计算网络抖动值的数学公式。

进一步地,所述delay(k)=[r_time(k)-r_time(j)]-[timestamp(k)-timestamp(j)],其中timestamp()表示语音数据包的时间戳,r_time()表示语音数据包被接收设备收到的时刻。这是一个示例性的计算相对延迟的数学公式。

进一步地,所述第二步进一步包括如下步骤。步骤s22:采用一个统计窗口,其中的n个数值就是保存的最近收到的n个语音数据包的网络抖动数据。步骤s24:将统计窗口的n个数值与抖动缓存模块当前的目标深度进行比较,将统计窗口的n个数值中大于抖动缓存模块当前的目标深度的数量记为num。步骤s26:根据num与第一阈值、以及统计窗口的n个数值中的最大值与第二阈值的比较结果,调整抖动缓存模块的目标深度;如果num大于第一阈值,则将抖动缓存模块的目标深度增大。如果抖动缓存模块当前的目标深度减去统计窗口的n个数值中的最大值之差大于第二阈值,则将抖动缓存模块的目标深度减小。否则,保持抖动缓存模块的目标深度不变。这是第二步的一种具体实现方式。

进一步地,所述步骤s26中,将抖动缓存模块的目标深度增大是指加packet_duration,将抖动缓存模块的目标深度减小是指减packet_duration。所述packet_duration表示每个语音数据包的播放时长。这是一种优选的调整抖动缓存模块的目标深度的方式。

优选地,将抖动缓存模块的目标深度设置为最近收到的多个语音数据包中出现的最大网络抖动值加上packet_duration;所述packet_duration表示每个语音数据包的播放时长。这是另一种优选的调整抖动缓存模块的目标深度的方式。

进一步地,所述第三步进一步包括如下步骤。步骤s32:扬声器播放完当前语音数据包后,抖动缓存模块自动将下一个要播放的语音数据包发送出去。步骤s34:计算抖动缓存模块的当前实际深度buffer_size;将抖动缓存模块中语音数据包的时间戳的最大值记为timestamp_max,将抖动缓存模块中下一个要发送给扬声器播放的语音数据包中的时间戳记为timestamp_next,buffer_size=(timestamp_max-timestamp_next)。步骤s36:计算抖动缓存模块的当前平滑深度current_size;current_size=factor×current_size_old+(1-factor)×buffer_size,其中current_size_old是抖动缓存模块的平滑深度的最近取值,factor是遗忘因子,0<factor<1。这是第三步的一种具体实现方式。

进一步地,所述第四步中,如果抖动缓存模块的当前平滑深度小于目标深度,则减小抖动缓存模块中的语音数据包的消耗速度。如果抖动缓存模块的当前平滑深度大于目标深度,则增大抖动缓存模块中的语音数据包的消耗速度。如果抖动缓存模块的当前平滑深度等于目标深度,则对抖动缓存模块中的语音数据包的消耗速度不做调整。这是第四步的一种具体实现方式。

进一步地,所述第四步进一步包括如下步骤。步骤s42:比较抖动缓存模块的当前平滑深度current_size和目标深度optimal_size,以决定发送的控制信号的类型。如果current_size-optimal_size>第三阈值,发送第一控制信号。如果optimal_size-current_size>第三阈值,发送第二控制信号。否则,发送第三控制信号、或者不发送任何控制信号。步骤s44:对抖动缓存模块中将要播放的语音数据包进行解码。步骤s46:根据收到的控制信号的类型,对解码后的语音数据包进行相应处理。如果收到第一控制信号,对解码后的语音数据包做压缩处理,即减小语音数据包的播放时间,加快抖动缓存模块中的语音数据包的消耗速度。如果收到第二控制信号,对解码后的语音数据包做扩张处理,即增大语音数据包的播放时间,减缓抖动缓存模块中的语音数据包的消耗速度。如果收到第三控制信号、或者未收到任何控制信号,对解码后的语音数据包不做处理。这是第四步的另一种具体实现方式。

本申请还提供了一种处理网络抖动的装置,包括网络抖动计算单元、目标深度计算单元、当前深度计算单元和调整单元。所述网络抖动计算单元用于在每次从网络收到语音数据包的时候,计算该语音数据包传输过程中的网络抖动。所述目标深度计算单元用于根据当前网络抖动,计算抖动缓存模块的目标深度。所述目标深度是指抖动缓存模块中所缓存的语音数据包的当前理想数量所对应的总时长。所述当前深度计算单元用于在每次从抖动缓存模块里面获取语音数据包时,计算抖动缓存模块的当前平滑深度。所述当前平滑深度是对当前实际深度经过平滑化处理的一个参数。所述当前实际深度是指抖动缓存模块中所缓存的语音数据包的当前实际数量所对应的总时长。所述调整单元用于调整抖动缓存模块中的语音数据包的消耗速度。

上述装置通过分析收到的语音数据包的时序,计算当前网络的抖动,并且调整抖动缓存模块中的语音数据包的消耗速度,使其能够自适应网络抖动。

本申请取得的技术效果是:能够实时计算网络抖动,以定量的形式表征网络抖动情况;根据最近一段时间内的网络抖动的统计数据,提出了计算抖动缓存模块的目标深度的方法;通过比较抖动缓存模块的当前平滑深度和目标深度,实时地调整抖动缓存模块中的语音数据包的消耗速度。

附图说明

图1是一个通信网络的简化示意图。

图2是本申请提出的处理网络抖动的方法的流程图。

图3是图2中的第一步s10的一种具体实现方式的流程图。

图4是图2中的第二步s20的一种具体实现方式的流程图。

图5是图2中的第三步s30的一种具体实现方式的流程图。

图6是图2中的第四步s40的一种具体实现方式的流程图。

图7是本申请提出的处理网络抖动的装置的结构示意图。

图中附图标记说明:10为网络抖动计算单元;20为目标深度计算单元;30为当前深度计算单元;40为调整单元。

具体实施方式

为了表述方便,本申请文件中定义如下术语。

将rtp(real-timetransportprotocol,实施传输协议)序列号(sequence)为k的语音数据包记为packet(k)。将packet(k)的时间戳(timestamp)记为timestamp(k),表征packet(k)的发送时刻。将接收设备收到packet(k)的时刻记为r_time(k)。每个语音数据包的播放时长相等,记为packet_duration。接收设备b连续收到两个语音数据包,分别记为packet(j)和packet(k)。对于没有任何抖动的理想网络,公式一timestamp(k)-timestamp(j)=r_time(k)-r_time(j)成立。在公式一中,每个数据包上携带的时间戳与时钟(clock)单位一致。

公式一的推导过程如下。发送设备a在时钟为t1的时刻发送packet(j),其中携带的时间戳为timestamp(j)。发送设备a在时钟为t1+packet_duration的时刻发送packet(j+1),其中携带的时间戳为timestamp(j+1)。因为每个语音数据包的播放时长是packet_duration,那么timestamp(j+1)-timestamp(j)=packet_duration。接收设备b在r_time(j)时刻收到packet(j),在r_time(j+1)收到packet(j+1)。由于是没有抖动的理想网络,那么有r_time(j+1)-r_time(j)=packet_duration。由以上两个等式可得timestamp(j+1)-timestamp(j)=r_time(j+1)-r_time(j),将k=j+1带入上式得公式一。

将packet(k)在网络传输过程中的相对延迟记为delay(k),公式二delay(k)=[r_time(k)-r_time(j)]-[timestamp(k)-timestamp(j)]成立。相对延迟delay(k)表示packet(k)在网络中的传输时间[r_time(k)-timestamp(k)]与packet(j)在网络中的传输时间[r_time(j)-timestamp(j)]相比,增加或减少的时间。在公式二中,假设接收设备连续收到两个语音数据包,先收到packet(j),再收到packet(k)。如果没有乱序情况,则k=j+1。如果有乱序,则k>j+1或k<j。实际上在计算相对延迟时,packet(j)和packet(k)之间可以不是连续的语音数据包,中间可以间隔一个或多个语音数据包,也是可行的。

delay(k)有三种取值:delay(k)>0,表示接收设备从收到packet(j)到packet(k)的时间段内,网络延迟变大。delay(k)=0表示接收设备从收到packet(j)到收到packet(k)的时间段内,网络延迟未变,这种情况演变为公式一。delay(k)<0表示接收设备从收到packet(j)到收到packet(k)的时间段内,网络延迟变小。

将packet(k)传输过程中的网络抖动记为jitter(k),公式三jitter(k)=max(0,delay(k))成立。其中max函数表示取最大值。根据公式三的定义,当网络延迟变大时,产生了抖动。由于网络抖动时,延迟忽大忽小,所以只需要考虑延迟变大即可。

请参阅图2,本申请提供的处理网络抖动的方法包括如下步骤。

第一步s10:在每次从网络收到语音数据包的时候,按照公式三计算该语音数据包传输过程中的网络抖动。

第二步s20:根据当前网络抖动,计算抖动缓存模块的目标深度,记为optimal_size。所述目标深度是指抖动缓存模块中所缓存的语音数据包的当前理想数量所对应的总时长。

第三步s30:在每次从抖动缓存模块里面获取语音数据包用于播放语音的时候,计算抖动缓存模块的当前平滑深度,记为current_size。所述当前平滑深度是对当前实际深度经过平滑化处理的一个参数。所述当前实际深度是指抖动缓存模块中所缓存的语音数据包的当前实际数量所对应的总时长。

第四步s40:调整抖动缓存模块中的语音数据包的消耗速度。

一种示例性的调整方法如下。如果抖动缓存模块的当前平滑深度小于目标深度,则减小抖动缓存模块中的语音数据包的消耗速度。如果抖动缓存模块的当前平滑深度大于目标深度,则增大抖动缓存模块中的语音数据包的消耗速度。如果抖动缓存模块的当前平滑深度等于目标深度,则对抖动缓存模块中的语音数据包的消耗速度不做调整。

所述第三步可以改为在第一步之前、或改为与第一步同时进行、或改为在第一步和第二步之间、或改为与第二步同时进行。

请参阅图3,所述第一步s10的一种具体实现方式进一步包括如下步骤。

步骤s12:接收语音数据包packet(k)。

步骤s14:将该语音数据包packet(k)存入抖动缓存模块。

步骤s16:判断该语音数据包packet(k)是否为接收的第一个语音数据包。如果是,则回到步骤s12,这是因为计算语音数据包传输过程中的网络抖动必须要依赖两个语音数据包。如果否,则进入步骤s18。

步骤s18:按照公式三计算该语音数据包packet(k)传输过程中的网络抖动jitter(k)。公式三为jitter(k)=max(0,delay(k)),其中max函数表示取最大值,delay(k)表示该语音数据包在网络传输过程中的相对延迟。又根据公式二,delay(k)=[r_time(k)-r_time(j)]-[timestamp(k)-timestamp(j)],其中timestamp()表示语音数据包的时间戳,r_time()表示语音数据包被接收设备收到的时刻。

请参阅图4,所述第二步s20的一种具体实现方式进一步包括如下步骤。

步骤s22:采用一个统计窗口记为window,其中的n个数值window[1...n]就是保存的最近收到的n个语音数据包的网络抖动数据jitter[1...n]。换而言之,wndows(1)=jittr(1),wndows(2)=jittr(2),……,wndows(n)=jittr(n)。

步骤s24:将统计窗口的n个数值window[1...n]与抖动缓存模块当前的目标深度进行比较。将统计窗口的n个数值window[1...n]中大于抖动缓存模块当前的目标深度的数量记为num。显然,0≤num≤n。

步骤s26:根据num与第一阈值的比较结果、以及统计窗口的n个数值window[1...n]中的最大值与第二阈值的比较结果,调整抖动缓存模块的目标深度。通常,第一阈值和第二阈值都大于零。

如果num大于第一阈值,表明最近收到的语音数据包中有多个语音数据包的网络抖动值大于抖动缓存模块当前的目标深度,则将抖动缓存模块的当前目标深度增大作为新的目标深度optimal_size。所述增大例如为加packet_duration。

如果抖动缓存模块当前的目标深度减去统计窗口的n个数值中的最大值max(window[1...n])之差大于第二阈值,表明最近收到的语音数据包中出现的最大网络抖动值比抖动缓存模块的当前深度要小,则将抖动缓存模块的当前目标深度减小作为新的目标深度optimal_size。所述减小例如为减packet_duration。

否则,保持抖动缓存模块的当前目标深度不变作为新的目标深度optimal_size。

对于抖动缓存模块的特定目标深度,网络抖动越大的语音数据包越有可能被接收设备丢弃;反之亦然。对于某个特定网络抖动值的语音数据包,抖动缓存模块的目标深度越小,该语音数据包越有可能被接收设备丢弃;反之亦然。因此本申请统计最近收到的语音数据包的网络抖动值,来调整抖动缓存模块的目标深度。

举例说明如下:比如发送设备发送了一系列语音数据包packet(1)~packet(n),中间某一个语音数据包是packet(k),1<k<n。

第一种情况:如果是理想网络,不存在抖动,每个语音数据包在网络中的传输时间都是delta。此时接收设备的抖动缓存模块的目标深度是packet_duration就够了,因为接收设备收到语音数据包的速度和播放语音数据包的速度一样快,收到一个语音数据包,就拿出来播放。

第二种情况:如果网络有抖动,为了简化理解,假设其他的语音数据包的网络传输时间仍然是delta,只有packet(k)的网络传输时间比较大,是delta+2×packet_duration。

如果此时接收设备的抖动缓存模块的目标深度还是packet_duration,那么在t时刻,收到packet(k-1)时,接收设备将会播放packet(k-1);在t+packet_duration时刻,由于packet(k)延迟比较大,接收设备没有收到,抖动缓存模块已经空了,这个时候没有语音可以播放,给用户的体验就是听着就断续了;在t+2×packet_duration时刻,收到packet(k+1),接收设备将会播放packet(k+1);在t+3×packet_duration时刻,收到packet(k)和packet(k+2),接收设备将播放packet(k+2),并将packet(k)丢弃,因为已经过了packet(k)的播放时间点了。

如果此时接收设备的抖动缓存模块的目标深度是3×packet_duration,那么在t时刻,收到packet(k-1)时,由于抖动缓存模块的目标深度是3×packet_duration,抖动缓存模块中包含packet(k-3)、packet(k-2)和packet(k-1),接收设备将会播放packet(k-3)语音数据包;在t+packet_duration时刻,由于packet(k)延迟比较大,接收设备没有收到,抖动缓存模块中包含packet(k-2)和packet(k-1),此时播放packet(k-2)语音数据包;在t+2×packet_duration时刻,收到packet(k+1),抖动缓存模块中包含packet(k-1)和packet(k+1),接收设备将会播放packet(k-1);在t+3×packet_duration时刻,收到packet(k)和packet(k+2),抖动缓存模块中包含packet(k)、packet(k+1)和packet(k+2),接收设备将会播放packet(k)。

综合上面示例,当某一个语音数据包的网络抖动值比较大,比如packet(k)的网络传输时间是delta+2×packet_duration时,packet(k)在packek(k+1)后面被收到。网络抖动jitter(k)的计算值为2×packet_duration。所以,对于无抖动的理想网络,抖动缓存模块的目标深度设为packet_duration就够了。对于有抖动的非理想网络,如果语音数据包的抖动为2×packet_duration,那么抖动缓存模块的目标深度需要额外增加2×packet_duration才能保持语音连续。抖动缓存模块的目标深度太小的话,出现抖动的语音数据包会被接收设备丢弃。

优选地,抖动缓存模块的目标深度设置为最近收到的多个语音数据包中出现的最大网络抖动值加上packet_duration。如果最近收到的多个语音数据包中出现的最大网络抖动值为0,则抖动缓存模块的目标深度设置为packet_duration。

请参阅图5,所述第三步s30的一种具体实现方式进一步包括如下步骤。

步骤s32:扬声器播放完当前语音数据包后,抖动缓存模块自动将下一个要播放的语音数据包发送出去。

步骤s34:计算抖动缓存模块的当前实际深度buffer_size。将抖动缓存模块中语音数据包的时间戳的最大值记为timestamp_max。将抖动缓存模块中下一个要发送给扬声器播放的语音数据包中的时间戳记为timestamp_next。buffer_size=timestamp_max-timestamp_next,表示抖动缓存模块中所缓存的语音数据包的当前实际数量所对应的总时长。buffer_size的大小是跳动的,比如很短时间连续收到两个语音数据帧,那buffer_size会增大2×packet_duration;又如抖动缓存模块送出一个语音数据包给播放器播放时,buffer_size就会减少packet_duration,总之buffer_size变化比较频繁。

步骤s36:计算抖动缓存模块的当前平滑深度current_size。current_size=factor×current_size_old+(1-factor)×buffer_size,其中current_size_old是抖动缓存模块的平滑深度的最近取值,factor是遗忘因子,0<factor<1。计算出来的current_size值具有平滑性,避免了因buffer_size变动频率而导致频繁地调整抖动缓存模块的目标深度。

请参阅图6,所述第四步s40的另一种具体实现方式进一步包括如下步骤。

步骤s42:比较抖动缓存模块的当前平滑深度current_size和目标深度optimal_size,以决定发送的控制信号的类型。

如果current_size-optimal_size>第三阈值,发送第一控制信号。

如果optimal_size-current_size>第三阈值,发送第二控制信号。

否则,发送第三控制信号、或者不发送任何控制信号。

步骤s44:对抖动缓存模块中将要播放的语音数据包进行解码(decode)。

步骤s46:根据收到的控制信号的类型,对解码后的语音数据包进行相应处理。

如果收到第一控制信号,解码器对解码后的语音数据包做压缩处理。比如正常播放一个语音数据包需要packet_duration的时间,当压缩后,一个语音数据包可能只需要packet_duration/2的时间就可以播放完,然后继续取抖动缓存模块中的下一个语音数据包播放,这样可以更快的消耗抖动缓存模块里面的语音。

如果收到第二控制信号,解码器对解码后的语音数据包做扩张处理。比如正常播放一个语音数据包需要packet_duration的时间,当扩张后,一个语音数据包可能需要2×packet_duration的时间才能播放完,然后继续取抖动缓存模块中的下一个语音数据包播放,这样可以更慢地消耗抖动缓存模块里面的语音。

如果收到第三控制信号、或者未收到任何控制信号,对解码后的语音数据包不做处理。

请参阅图7,本申请提供的处理网络抖动的装置包括网络抖动计算单元10、目标深度计算单元20、当前深度计算单元30和调整单元40。

所述网络抖动计算单元10用于在每次从网络收到语音数据包的时候,按照公式三计算该语音数据包传输过程中的网络抖动。

所述目标深度计算单元20用于根据当前网络抖动,计算抖动缓存模块的目标深度,记为optimal_size。所述目标深度是指抖动缓存模块中所缓存的语音数据包的当前理想数量所对应的总时长。

所述当前深度计算单元30用于在每次从抖动缓存模块里面获取语音数据包用于播放语音的时候,计算抖动缓存模块的当前平滑深度,记为current_size。所述当前平滑深度是对当前实际深度经过平滑化处理的一个参数。所述当前实际深度是指抖动缓存模块中所缓存的语音数据包的当前实际数量所对应的总时长。

所述调整单元40用于调整抖动缓存模块中的语音数据包的消耗速度。

本申请首先对当前的网络情况做定量的计算,实时地计算当前网络抖动;再根据网络抖动的结果,计算抖动缓存模块的当前最优大小,实时调整抖动缓存模块的大小。

以上仅为本申请的优选实施例,并不用于限定本申请。对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1