发明内容
有鉴于此,本申请实施例提供了一种数据流发送方法、装置、电子设备和存储介质,通过设置能自动调整的数据缓存帧数,自动调节缓存队列的长度,达到数据流的平滑发送。
第一方面,本申请实施例提供了一种数据流发送方法,所述数据流发送方法包括:
获取数据流之后,确定当前周期内每帧数据的实际接收时刻。
根据获取的所述数据流的当前接收帧率,设置所述当前周期内每帧数据的第一发送时刻。
根据相邻两帧数据的所述第一发送时刻之间的第一发送间隔、预设的表示与所述第一发送间隔接近程度的允许偏差、每帧数据的实际接收时刻和第一发送时刻之间所允许的最大时间间隔,确定缓存在所述当前周期内的缓存队列的长度。
根据所述缓存队列中当前已缓存的数据帧数,设置所述当前周期内每帧数据的第二发送时刻。
按照所述第二发送时刻向目标设备发送所述数据流。
在一个可行的实施方案中,所述根据获取的所述数据流的当前接收帧率,设置所述当前周期内每帧数据的第一发送时刻,包括:
计算预设时长与当前接收帧率的比值,以将所述比值作为第二发送间隔。
根据所述第二发送间隔,设置在所述当前周期内,每帧数据的第一发送时刻。
在一个可行的实施方案中,所述根据相邻两帧数据的所述第一发送时刻之间的第一发送间隔、预设的用来表示与所述第一发送间隔接近程度的允许偏差、每帧数据的实际接收时刻和第一发送时刻之间所允许的最大时间间隔,确定缓存在所述当前周期内的缓存队列的长度,包括:
计算所述最大时间间隔和所述第一发送间隔的差值,以将所述差值作为第一数值。
计算所述第一数值与所述允许偏差的和值,以将所述和值作为第二数值。
计算所述第二数值与所述第一发送间隔的比值,以将所述比值作为缓存在所述当前周期内的缓存队列的长度。
在一个可行的实施方案中,所述根据所述缓存队列中当前已缓存的数据帧数,设置所述当前周期内每帧数据的第二发送时刻,包括:
判断所述缓存队列中当前已缓存的数据帧数是否处于预设区间;其中,所述预设区间是由大于预设第一阈值且小于或等于预设第二阈值的实数构成的集合。
若所述缓存队列中当前已缓存的数据帧数在预设区间之内,设置每帧数据的第二发送时刻与所述第一发送时刻相同。
若所述缓存队列中当前已缓存的数据帧数在预设区间之外,设置每帧数据的第二发送时刻与所述第一发送时刻不同。
在一个可行的实施方案中,所述设置每帧数据的第二发送时刻与所述第一发送时刻不同,包括:
计算所述第一发送间隔与预设的平滑调整值的乘积,以将所述乘积作为第三数值;其中,所述平滑调整值表示从所述第一发送间隔到相邻两帧数据第二发送时刻发送间隔变化的幅度。
计算所述缓存队列中当前已缓存数据的帧数与所述平滑调整值的和值,以将所述和值作为第四数值。
计算所述第四数值与所述预设第二阈值的差值,以将所述差值作为第五数值。
计算所述第三数值与所述第五数值的比值,以将所述比值作为第三发送间隔。
根据所述第三发送间隔,设置所述当前周期内每帧数据的第二发送时刻。
第二方面,本申请实施例还提供了一种数据流发送装置,所述装置包括:
接收单元,用于获取数据流之后,确定当前周期内每帧数据的实际接收时刻。
设置单元,用于根据获取的所述数据流的当前接收帧率,设置所述当前周期内每帧数据的第一发送时刻。
计算单元,用于根据相邻两帧数据的所述第一发送时刻之间的第一发送间隔、预设的表示与所述第一发送间隔接近程度的允许偏差、每帧数据的实际接收时刻和第一发送时刻之间所允许的最大时间间隔,确定缓存在所述当前周期内的缓存队列的长度。
调整单元,用于根据所述缓存队列中当前已缓存的数据帧数,设置所述当前周期内每帧数据的第二发送时刻。
发送单元,用于按照所述第二发送时刻向目标设备发送所述数据流。
在一个可行的实施方案中,所述设置单元用于根据获取的所述数据流的当前接收帧率,设置所述当前周期内每帧数据的第一发送时刻,具体用于:
计算预设时长与当前接收帧率的比值,以将所述比值作为第二发送间隔。
根据所述第二发送间隔,设置在所述当前周期内,每帧数据的第一发送时刻。
在一个可行的实施方案中,所述计算单元用于根据相邻两帧数据的所述第一发送时刻之间的第一发送间隔、预设的用来表示与所述第一发送间隔接近程度的允许偏差、每帧数据的实际接收时刻和第一发送时刻之间所允许的最大时间间隔,确定缓存在所述当前周期内的缓存队列的长度,具体用于:
计算所述最大时间间隔和所述第一发送间隔的差值,以将所述差值作为第一数值。
计算所述第一数值与所述允许偏差的和值,以将所述和值作为第二数值。
计算所述第二数值与所述第一发送间隔的比值,以将所述比值作为缓存在所述当前周期内的缓存队列的长度。
在一个可行的实施方案中,所述调整单元用于根据所述缓存队列中当前已缓存的数据帧数,设置所述当前周期内每帧数据的第二发送时刻,具体用于:
判断所述缓存队列中当前已缓存的数据帧数是否处于预设区间;其中,所述预设区间是由大于预设第一阈值且小于或等于预设第二阈值的实数构成的集合。
若所述缓存队列中当前已缓存的数据帧数在预设区间之内,设置每帧数据的第二发送时刻与所述第一发送时刻相同。
若所述缓存队列中当前已缓存的数据帧数在预设区间之外,设置每帧数据的第二发送时刻与所述第一发送时刻不同。
在一个可行的实施方案中,所述调整单元用于设置每帧数据的第二发送时刻与所述第一发送时刻不同,具体用于:
计算所述第一发送间隔与预设的平滑调整值的乘积,以将所述乘积作为第三数值;其中,所述平滑调整值表示从所述第一发送间隔到相邻两帧数据第二发送时刻发送间隔变化的幅度。
计算所述缓存队列中当前已缓存数据的帧数与所述平滑调整值的和值,以将所述和值作为第四数值。
计算所述第四数值与所述预设第二阈值的差值,以将所述差值作为第五数值。
计算所述第三数值与所述第五数值的比值,以将所述比值作为第三发送间隔。
根据所述第三发送间隔,设置所述当前周期内每帧数据的第二发送时刻。
第三方面,本申请实施例提供了一种电子设备,包括:处理器、存储介质和总线,所述存储介质存储有所述处理器可执行的机器可读指令,当电子设备运行时,所述处理器与所述存储介质之间通过总线通信,所述处理器执行所述机器可读指令,以执行如第一方面中任一项所述的一种数据流发送方法的步骤。
第四方面,本申请实施例提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器运行时执行如第一方面中任一项所述的一种数据流发送方法的步骤。
本申请实施例在获取数据流之后,确定出当前周期内每帧数据的实际接收时刻;根据获取的所述数据流的当前接收帧率,设置所述当前周期内每帧数据的第一发送时刻;根据相邻两帧数据的所述第一发送时刻之间的第一发送间隔、预设的表示与所述第一发送间隔接近程度的允许偏差、每帧数据的实际接收时刻和第一发送时刻之间所允许的最大时间间隔,确定缓存在所述当前周期内的缓存队列的长度;根据所述缓存队列中当前已缓存的数据帧数,设置所述当前周期内每帧数据的第二发送时刻;按照所述第二发送时刻向目标设备发送所述数据流。在上述方法中,通过预设周期,根据每个周期内接收数据流的情况,确定当前周期内缓存队列的长度。即在每个周期内,都会自动调整缓存队列的长度,不会出现缓存数据太多或缓存数据过少的现象,解决了由于设置固定帧数的数据缓存帧数造成的数据卡顿或延迟的问题,能够平滑的发送数据流。
为使本申请的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,应当理解,本申请中附图仅起到说明和描述的目的,并不用于限定本申请的保护范围。另外,应当理解,示意性的附图并未按实物比例绘制。本申请中使用的流程图示出了根据本申请的一些实施例实现的操作。应该理解,流程图的操作可以不按顺序实现,没有逻辑的上下文关系的步骤可以反转顺序或者同时实施。此外,本领域技术人员在本申请内容的指引下,可以向流程图添加一个或多个其他操作,也可以从流程图中移除一个或多个操作。
另外,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本申请实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本申请的实施例的详细描述并非旨在限制要求保护的本申请的范围,而是仅仅表示本申请的选定实施例。基于本申请的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。
需要提前说明的是,本申请实施例中将会用到术语“包括”,用于指出其后所声明的特征的存在,但并不排除增加其它的特征。
需要提前说明的是,本申请实施例涉及到的装置或电子设备等可以执行在单个服务器上,也可以执行在服务器组。服务器组可以是集中式的,也可以是分布式的。在一些实施例中,服务器相对于终端,可以是本地的,也可以是远程的。例如,服务器可以经由网络访问存储在服务请求方终端、服务提供方终端、或数据库、或其任意组合中的信息和/或数据。作为另一示例,服务器可以直接连接到服务请求方终端、服务提供方终端和数据库中至少一个,以访问存储的信息和/或数据。在一些实施例中,服务器可以在云平台上实现;仅作为示例,云平台可以包括私有云、公有云、混合云、社区云(community cloud)、分布式云、跨云(inter-cloud)、多云(multi-cloud)等,或者它们的任意组合。
另外,本申请实施例涉及到的装置或电子设备可以执行在接入设备或者第三方设备上,具体可以包括:移动设备、平板计算机、膝上型计算机、或机动车辆中的内置设备等,或其任意组合。在一些实施例中,移动设备可以包括智能家居设备、可穿戴设备、智能移动设备、虚拟现实设备、或增强现实设备等,或其任意组合。在一些实施例中,智能家居设备可以包括智能电器设备的控制设备、智能监控设备、智能电视、智能摄像机、或对讲机等,或其任意组合。在一些实施例中,可穿戴设备可包括智能手环、智能头盔、智能手表、智能配件等、或其任何组合。在一些实施例中,智能移动设备可以包括智能手机、个人数字助理(Personal Digital Assistant,PDA)、游戏设备、导航设备等,或其任意组合。在一些实施例中,虚拟现实设备和/或增强现实设备可以包括虚拟现实头盔、增强现实头盔等,或其任意组合。例如,虚拟现实设备和/或增强现实设备可以包括各种虚拟现实产品等。
实施例一
图1为本申请实施例所提供的一种数据流发送方法的流程图,如图1所示,该数据流发送方法包括:
步骤S101、获取数据流之后,确定当前周期内每帧数据的实际接收时刻。
具体的,为了能够对数据流进行平滑发送,需要预先设置周期,以便根据不同周期内的数据接收情况和发送情况对缓存在该周期内的缓存队列的长度进行调整,对于任一周期,可以将该周期内获得的数据流的每帧的接收时间点作为该帧数据的实际接收时刻,以便根据实际接收时刻确定该周期内数据量、数据帧率和实际接收情况。
假设预设周期为1s,获取的数据流当前接收帧率为n。
在每个当前1s周期内,确定出每帧数据的实际接收时刻RT1、RT2、RT3、…… 、RTn。
假设在1s周期内,接收了10帧数据,即当前周期内的接收帧率n=10,实际接收时刻可能包括以下情况:
例一:在当前1s(1000ms)周期内,每帧数据的实际接收时刻为 100ms、S105ms、200ms、450ms、499ms、500ms、700ms、709ms、800ms、890ms。即RT1=100ms、RT2=S105ms、RT3=200ms、RT4=450ms、RT5=499ms、RT6=500ms、RT7=700ms、RT8=709ms、RT9=800ms、RT10=890ms。
例二:在当前1s(1000ms)周期内,每帧数据的实际接收时刻为60ms、100ms、200ms、300ms、400ms、500ms、600ms、700ms、750ms、900ms。即RT1=60ms、RT2=100ms、RT3=200ms、RT4=300ms、RT5=400ms、RT6=500ms、RT7=600ms、RT8=700ms、RT9=750ms、RT10=900ms。
步骤S102、根据获取的所述数据流的当前接收帧率,设置所述当前周期内每帧数据的第一发送时刻。
具体的,为了平滑的将接收的数据流发送出去,在确定出每帧数据的实际接收时刻RT1、RT2、RT3、…… 、RTn之后,还需要设置一个能平滑发送每帧数据的第一发送时刻,以便能根据每帧数据的实际接收时刻和第一发送时刻之间的差值,判断是否需要在当前周期内缓存一定的数据。当每帧数据的第一发送时刻晚于实际接收时刻的时候,说明在第一发送时刻到来的时候已经接收到数据,能够将当前接收数据平滑的发送出去;当每帧数据的第一发送时刻早于实际接收时刻的时候,说明在发送的时候并没有接收到数据,即没有数据可供发送,数据发送就会变得卡顿。
设置第一发送时刻的方法为:假设预设周期为1s,获取的数据流当前接收帧率为n。在每个当前1s周期内,确定出当前周期内每帧数据的第一发送时刻ST1、ST2、ST3、……、STn。即若当前1s周期内,接收了10帧数据,则需要确定出当前1s周期内的10个第一发送时刻,即:ST1、ST2、ST3、ST4、ST5、ST6、ST7、ST8、ST9、ST10。
步骤S103、根据相邻两帧数据的所述第一发送时刻之间的第一发送间隔、预设的表示与所述第一发送间隔接近程度的允许偏差、每帧数据的实际接收时刻和第一发送时刻之间所允许的最大时间间隔,确定缓存在所述当前周期内的缓存队列的长度。
具体的,为了确定出当前周期内缓存队列的长度,需要提前设置表示与所述第一发送间隔接近程度的允许偏差,通过提前设置允许偏差,将允许偏差作为影响缓存队列的长度的因素。
当允许偏差较大的时候,缓存队列的长度略小于实际需要发送的数据长度,可能会出现肉眼无法识别出的短暂卡顿;当允许偏差较小,即要求十分平滑的时候,缓存队列的长度等于实际需要发送的数据长度,能够使得缓存队列的长度能够保证数据的平滑发送。
每帧数据的实际接收时刻和第一发送时刻之间所允许的最大时间间隔越大,说明数据接收和发送的差距越大,例如在第1000ms接收到了该数据,在第10ms就需要发送出去,则第10ms发送的时候,没有接收到可供发送的数据,会造成卡顿现象,因此,理论上最大时间间隔越大,缓存队列的长度就应该越长;同时,相邻两帧数据的所述第一发送时刻之间的第一发送间隔越小,说明每秒内发送的数据越多,因此缓存队列的长度也需要越长。
因此,在加入允许偏差因素之后,同时还要引入最大时间间隔和第一发送间隔参数来平衡该缓存队列的长度的计算,达到缓存队列长度的计算。
步骤S104、根据所述缓存队列中当前已缓存的数据帧数,设置所述当前周期内每帧数据的第二发送时刻。
具体的,如果所述缓存队列中当前已缓存的数据帧数小于或等于预设第一阈值,说明缓存的数据太少,需要慢速发送;如果所述缓存队列中当前已缓存的数据帧数大于预设第二阈值,说明有大量的缓存数据未能发送,需要快速发送;如果所述缓存队列中当前已缓存的数据帧数大于预设第一阈值且小于或等于预设第二阈值,说明缓存的数据量合理,不需要调整发送速度。
步骤S105、按照所述第二发送时刻向目标设备发送所述数据流。
本申请实施例在获取数据流之后,确定出当前周期内每帧数据的实际接收时刻;根据获取的所述数据流的当前接收帧率,设置所述当前周期内每帧数据的第一发送时刻;根据相邻两帧数据的所述第一发送时刻之间的第一发送间隔、预设的表示与所述第一发送间隔接近程度的允许偏差、每帧数据的实际接收时刻和第一发送时刻之间所允许的最大时间间隔,确定缓存在所述当前周期内的缓存队列的长度;根据所述缓存队列中当前已缓存的数据帧数,设置所述当前周期内每帧数据的第二发送时刻;按照所述第二发送时刻向目标设备发送所述数据流。在上述方法中,通过预设周期,根据每个周期内接收数据流的情况,确定当前周期内缓存队列的长度。即在每个周期内,都会自动调整缓存队列的长度,不会出现缓存数据太多或缓存数据过少的现象,解决了由于设置固定帧数的数据缓存帧数造成的数据卡顿或延迟的问题,能够平滑的发送数据流。
在一个可行的实施方案中,在执行步骤S102根据获取的所述数据流的当前接收帧率,设置所述当前周期内每帧数据的第一发送时刻时,可以通过以下步骤实现:
计算预设时长与当前接收帧率的比值,以将所述比值作为第二发送间隔。
根据所述第二发送间隔,设置在所述当前周期内,每帧数据的第一发送时刻。
具体的,可以把每帧数据的第一发送时刻理解为能够完成数据平滑发送的理想发送时刻,为了理想的发送数据,相邻两帧数据的第一发送的时刻的相差间隔可以是直接设置成相等的第二发送间隔,也可以设置为不等的,本申请实施例不对其余设置方法具体举例。
举例说明:设置相邻两帧数据的第一发送的时刻的相差间隔相等,设置预设时长为1000ms,当前1s周期内,数据接收帧率为40帧/秒。
第二发送间隔=1000/40=25ms。
则1s周期内每帧数据的第一发送时刻为0ms、25ms、50ms、……、975ms。
在一个可行的实施方案中,图2为本申请实施例所提供的另一种数据流发送方法的流程图,如图2所示,在执行步骤S103根据相邻两帧数据的所述第一发送时刻之间的第一发送间隔、预设的表示与所述第一发送间隔接近程度的允许偏差、每帧数据的实际接收时刻和第一发送时刻之间所允许的最大时间间隔,确定缓存在所述当前周期内的缓存队列的长度时,可以通过以下步骤实现:
步骤S201、计算所述最大时间间隔和所述第一发送间隔的差值,以将所述差值作为第一数值。
具体的,在执行完步骤S102之后,当前周期内每帧数据的实际接收时刻和第一发送时刻之间所允许的最大时间间隔的设置方法包括:
计算当前周期内每帧数据的实际接收时刻和第一发送时刻的差值:
RSoffset(第一差值)=RTn-STn。
计算在当前预设的1s周期内所有第一差值中最大的值:
MaxRSoffset(最大差值)=Max(RSoffset)(当前周期内的最大第一差值)。
判断计算的当前周期内的最大差值是否大于预设差值,如果当前周期内的最大差值大于预设差值时,把这个最大差值设置为当前周期内每帧数据的实际接收时刻和第一发送时刻之间所允许的最大时间间隔。
若当前周期内的最大差值小于或等于预设差值,说明当前周期内数据流能够实现平滑发送,因此不需要调整缓存队列的长度。
其中,预设差值可以设置为0、1等具体数值,也可以根据其他数据进行设置,本申请实施例在此不做限制。
例如,可以设置预设差值为0ms,即设置当前周期内每帧数据的实际接收时刻与第一发送时刻之间预设差值为0ms,从而使得接收的数据刚好能够平滑的发送出去,不会有卡顿、延迟问题。
步骤S202、计算所述第一数值与所述允许偏差的和值,以将所述和值作为第二数值。
表示与所述第一发送间隔接近程度的允许偏差的设置方法可以根据所述第一发送间隔进行调整,举例说明:
例一:设置所述允许偏差为0%,即要求所述允许偏差与所述第一发送间隔最接近,公式为:
diffOffset(表示与所述第一发送间隔接近程度的允许偏差)=averageRecvOffset(相邻两帧数据的所述第一发送时刻之间的第一发送间隔)-1。
例二:设置所述偏差为50%,公式为:
diffOffset=averageRecvOffset /2。
其中,在例一和例二中,单位均为毫秒。
步骤S203、计算所述第二数值与所述第一发送间隔的比值,以将所述比值作为缓存在所述当前周期内的缓存队列的长度。
具体的,在获取到数据流之前,给缓存队列的长度设置一个默认值,默认值可以设置为:0、1、2……。
在执行步骤S103时,确定缓存队列长度的方法包括:cacheCount(缓存队列的长度)=(MaxRSoffset-averageRecvOffset+diffOffset)/averageRecvOffset。
可以看出,允许偏差越接近第一发送间隔averageRecvOffset的时候,分子越接近于最大差值MaxRSoffset,这时候得到的缓存队列的长度也就是能保证数据平滑发送的最合适的缓存量,当允许偏差与第一发送间隔差距越大的时候,分子就会小于最大差值MaxRSoffset,因此得到的缓存队列的长度就会小于能够保证数据平滑发送的缓存量,可能会造成略微的卡顿,但是处在肉眼无法感知出的范围内。
在一个可行的实施方案中,在执行步骤S104时,根据所述缓存队列中当前已缓存的数据帧数,设置所述当前周期内每帧数据的第二发送时刻,包括:
判断所述缓存队列中当前已缓存的数据帧数是否处于预设区间;其中,所述预设区间是由大于预设第一阈值且小于或等于预设第二阈值的实数构成的集合;
具体的,预设第一阈值与预设第二阈值可以根据计算的在当前周期内每帧数据发送之前可能缓存的最大缓存长度进行设置,也可以设置为具体的数值,本申请实施例对第一阈值和第二阈值的设置方法不做限制。例如,可以设置预设第一阈值为所述缓存队列长度的一半,可以设置预设第二阈值为所述缓存队列长度的2倍。
若所述缓存队列中当前已缓存的数据帧数在预设区间之内,设置每帧数据的第二发送时刻与所述第一发送时刻相同。
当casheCount/2(预设第一阈值)<queueCount(当前已缓存的数据帧数)≤cacheCount*2(预设第二阈值)时,根据计算,认为缓存的数据能够确保通过所述第一发送时刻平滑的发送出去,因此设置每帧数据的第二发送时刻与所述第一发送时刻相同。
若所述缓存队列中当前已缓存的数据帧数在预设区间之外,设置每帧数据的第二发送时刻与所述第一发送时刻不同。
当queueCount(当前已缓存的数据帧数)≤cacheCount/2(预设第一阈值)时,根据计算,认为缓存的数据过少,为了避免数据卡顿问题,应当调慢发送速度积累数据,即适当调整第二发送时刻,使得第二发送时刻晚于第一发送时刻。
当queueCount(当前已缓存的数据帧数)>cacheCount*2(预设第二阈值)时,根据计算,认为缓存的数据过多,为了避免数据延时问题,应当调快发送速度发送数据,即适当调整第二发送时刻,使得第二发送时刻早于第一发送时刻。
在一个可行的实施方案中,在执行步骤S104中的设置每帧数据的第二发送时刻与所述第一发送时刻不同时,可以通过以下步骤实现:
计算所述第一发送间隔与预设的平滑调整值的乘积,以将所述乘积作为第三数值;其中,所述平滑调整值表示从所述第一发送间隔到相邻两帧数据第二发送时刻之间发送间隔变化的幅度。
具体的,当设置的平滑调整值越大的时候,最终得出的第三发送间隔与第一发送间隔之间的变化幅度就越小,发送间隔波动较小;当设置的平滑调整值越小的时候,最终得到的第三发送间隔与第一发送间隔之间的变化幅度就越大,发送间隔波动过大。
举例说明:第一发送间隔为50ms时,如果设置平滑调整值为当前帧率的6倍(即设置的平滑调整值越大),那么计算得到的第三发送间隔的结果可能是48ms或62ms;如果设置平滑调整值为当前帧率的1倍(即设置的平滑调整值越小),那么计算得到的第三发送间隔的结果可能是30ms或70ms。其中,经过计算之后,第三发送间隔是变大还是变小取决于公式中的其他因素。
当发送间隔从50ms突然变成30ms时,即发送速度突然变得很快,那么缓存的数据量可能会不够多,这就会造成数据发送过程的轻微卡顿;当发送间隔从50ms突然变成70ms时,即发送速度突然变的很慢,那么可能会造成大量积累的缓存数据没有被发送出去,这就会造成数据发送过程中的轻微延时,为了避免这种轻微的延时和卡顿问题,在调整第三发送间隔的时候,我们要保证数据流发送的平滑度,因此我们需要在较小的波动范围内完成调整,通过设置一个合理的平滑调整值实现上述功能。
计算所述缓存队列中当前已缓存数据的帧数与所述平滑调整值的和值,以将所述和值作为第四数值。
计算所述第四数值与所述预设第二阈值的差值,以将所述差值作为第五数值。
计算所述第三数值与所述第五数值的比值,以将所述比值作为第三发送间隔。
根据所述第三发送间隔,设置所述当前周期内每帧数据的第二发送时刻。
举例说明,计算公式包括:
sendOffset(第三发送间隔) = averageRecvOffset(第一发送间隔) *cacheSmoothCount (用来表示与所述第一发送间隔接近程度的允许偏差)/(cacheSmoothCount + queueCount(当前已缓存数据的帧数) - cacheCount *2(预设第二阈值))。
具体的,在执行步骤S104时,若queueCount(当前已缓存的数据帧数)<cacheCount/2(预设第一阈值)时,说明缓存的数据过少,为了避免数据卡顿问题,应当调慢发送速度,即适当调整第二发送时刻,使得第二发送时刻晚于第一发送时刻。为了保证发送的平滑,最终计算得到的第三发送间隔需要在很小的范围内波动,因此需要引入平滑调整值这个参数,完成对第一发送间隔的矫正,根据上述公式,可以看到,在queueCount<cacheCount/2时,分母的数值会变小,从而使得第三发送间隔大于第一发送间隔,最终使得第二发送时刻略晚于第一发送时刻。
若queueCount(当前已缓存的数据帧数)>cacheCount*2(预设第二阈值),说明缓存的数据过多,为了避免数据延时问题,应当调快发送速度,即适当调整第二发送时刻,使得第二发送时刻早于第一发送时刻。为了保证发送的平滑,最终计算得到的第三发送间隔需要在很小的范围内波动,因此需要引入平滑调整值这个参数,完成对第一发送间隔的矫正,根据上述公式,可以看到,在queueCoun>cacheCount*2时,分母的数值会变大,从而使得第三发送间隔小于第一发送间隔,最终使得第二发送时刻略早于第一发送时刻。
本申请实施例中对平滑调整值的设置方法不做限制,在本申请实施例中对平滑调整值的设置方法是设置为当前周期内接收数据帧率的2倍。
假设经过上式计算出来的第三发送间隔为20ms,预设周期为1s,则在当前1s周期内,第二发送时刻的设置方法包括:
把第三发送间隔作为每两帧相邻数据的第二发送时刻之间的间隔,即设置第二发送时刻为:0ms、20ms、40ms、……、980ms。
实施例二
参照图3所示,为本申请实施例二提供的一种数据流发送装置的结构示意图,所述装置包括:
接收单元S301,用于获取数据流之后,确定当前周期内每帧数据的实际接收时刻。
设置单元S302,用于根据获取的所述数据流的当前接收帧率,设置所述当前周期内每帧数据的第一发送时刻。
计算单元S303,用于根据相邻两帧数据的所述第一发送时刻之间的第一发送间隔、预设的表示与所述第一发送间隔接近程度的允许偏差、每帧数据的实际接收时刻和第一发送时刻之间所允许的最大时间间隔,确定缓存在所述当前周期内的缓存队列的长度。
调整单元S304,用于根据所述缓存队列中当前已缓存的数据帧数,设置所述当前周期内每帧数据的第二发送时刻。
发送单元S305,用于按照所述第二发送时刻向目标设备发送所述数据流。
在一个可行的实施方案中,所述设置单元S302用于根据获取的所述数据流的当前接收帧率,设置所述当前周期内每帧数据的第一发送时刻,具体用于:
计算预设时长与当前接收帧率的比值,以将所述比值作为第二发送间隔。
根据所述第二发送间隔,设置在所述当前周期内,每帧数据的第一发送时刻。
在一个可行的实施方案中,所述计算单元S303用于根据相邻两帧数据的所述第一发送时刻之间的第一发送间隔、预设的用来表示与所述第一发送间隔接近程度的允许偏差、每帧数据的实际接收时刻和第一发送时刻之间所允许的最大时间间隔,确定缓存在所述当前周期内的缓存队列的长度,具体用于:
计算所述最大时间间隔和所述第一发送间隔的差值,以将所述差值作为第一数值。
计算所述第一数值与所述允许偏差的和值,以将所述和值作为第二数值。
计算所述第二数值与所述第一发送间隔的比值,以将所述比值作为缓存在所述当前周期内的缓存队列的长度。
在一个可行的实施方案中,所述调整单元S304用于根据所述缓存队列中当前已缓存的数据帧数,设置所述当前周期内每帧数据的第二发送时刻,具体用于:
判断所述缓存队列中当前已缓存的数据帧数是否处于预设区间;其中,所述预设区间是由大于预设第一阈值且小于或等于预设第二阈值的实数构成的集合。
若所述缓存队列中当前已缓存的数据帧数在预设区间之内,设置每帧数据的第二发送时刻与所述第一发送时刻相同。
若所述缓存队列中当前已缓存的数据帧数在预设区间之外,设置每帧数据的第二发送时刻与所述第一发送时刻不同。
在一个可行的实施方案中,所述调整单元S304用于设置每帧数据的第二发送时刻与所述第一发送时刻不同,具体用于:
计算所述第一发送间隔与预设的平滑调整值的乘积,以将所述乘积作为第三数值;其中,所述平滑调整值表示从所述第一发送间隔到相邻两帧数据第二发送时刻发送间隔变化的幅度。
计算所述缓存队列中当前已缓存数据的帧数与所述平滑调整值的和值,以将所述和值作为第四数值。
计算所述第四数值与所述预设第二阈值的差值,以将所述差值作为第五数值。
计算所述第三数值与所述第五数值的比值,以将所述比值作为第三发送间隔。
根据所述第三发送间隔,设置所述当前周期内每帧数据的第二发送时刻。
本申请实施例在获取数据流之后,确定出当前周期内每帧数据的实际接收时刻;根据获取的所述数据流的当前接收帧率,设置所述当前周期内每帧数据的第一发送时刻;根据相邻两帧数据的所述第一发送时刻之间的第一发送间隔、预设的表示与所述第一发送间隔接近程度的允许偏差、每帧数据的实际接收时刻和第一发送时刻之间所允许的最大时间间隔,确定缓存在所述当前周期内的缓存队列的长度;根据所述缓存队列中当前已缓存的数据帧数,设置所述当前周期内每帧数据的第二发送时刻;按照所述第二发送时刻向目标设备发送所述数据流。在上述方法中,通过预设周期,根据每个周期内接收数据流的情况,确定当前周期内缓存队列的长度。即在每个周期内,都会自动调整缓存队列的长度,不会出现缓存数据太多或缓存数据过少的现象,解决了由于设置固定帧数的数据缓存帧数造成的数据卡顿或延迟的问题,能够平滑的发送数据流。
实施例三
图4为本申请实施例三提供的一种电子设备的结构示意图,包括:处理器S401、存储介质S402和总线S403,所述存储介质S402存储有所述处理器S401可执行的机器可读指令,当电子设备运行如实施例一中的方法时,所述处理器S401与所述存储介质S402之间通过总线S403通信,所述处理器S401执行所述机器可读指令,以执行如实施例一中的步骤。
在本申请实施例中,所述存储介质S402还可以执行其它机器可读指令,以执行如实施例一中其它所述的方法,关于具体执行的方法步骤和原理参见实施例一的说明,在此不再详细赘述。
实施例四
本申请实施例四还提供了一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行,以执行如实施例一中的步骤。
在本申请实施例中,该计算机程序被处理器运行时还可以执行其它机器可读指令,以执行如实施例一中其它所述的方法,关于具体执行的方法步骤和原理参见实施例一的说明,在此不再详细赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个模块或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
以上仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以权利要求的保护范围为准。