FLV数据传输方法、系统、设备及可读存储介质与流程

文档序号:23551355发布日期:2021-01-05 21:09阅读:162来源:国知局
FLV数据传输方法、系统、设备及可读存储介质与流程

本发明涉及通信技术领域,尤其涉及一种flv数据传输方法、系统、设备及可读存储介质。



背景技术:

随着电信运营商对减少直播时延的需求日渐增加,导致flv数据的使用频率也越来越高。

但是由于flv数据其格式的特殊性,目前只能使用tcp传输,属于单播模式。而观看直播的用户往往数以万计,若通过单播模式为这些用户传输flv数据,需要占用巨大的网络带宽资源,给现有的网络带宽资源带来严重冲击。



技术实现要素:

本发明的主要目的在于提供一种flv数据传输方法、系统、设备及可读存储介质,旨在解决现有技术中通过单播模式传输flv数据,需要占用巨大的网络带宽资源的技术问题。

第一方面,本发明提供一种flv数据传输方法,所述flv数据传输方法包括:

发送端将flv数据解析成多个tag,并分别将每个tag封装至rtp包;

发送端基于组播传输的方式,将rtp包传输到接收端;

接收端接收rtp包,并在rtp包丢失时,对丢失的rtp包所封装的tag进行恢复,得到新的tag,并基于未丢失的rtp包所封装的tag以及所述新的tag,得到新的flv数据。

可选的,所述分别将每个tag封装至rtp包的步骤包括:

当一tag的数据长度小于m时,将所述tag封装至一个rtp包中;

当一tag的数据长度大于n倍的m时,将所述tag封装至n+1个rtp包中;

当一tag的数据长度等于n倍的m时,将所述tag封装至n个rtp包中;

其中,n为正整数,m为一个rtp包可承载的最大数据长度。

可选的,rtp包的扩展字节中填充有所封装的tag的关键信息,所述关键信息包括tag序号、tag数据类型、tag的时间戳、tag的数据长度,且当rtp包为封装开始和/或封装结束包时,在其扩展字节中填充开始和/或结束标记,所述对丢失的rtp包所封装的tag进行恢复,得到新的tag的步骤包括:

若丢失的rtp包为封装有一tag部分数据的rtp包,则基于接收到的封装有所述tag其他部分数据的其他rtp包的扩展字节中填充的关键信息,以及所述tag其他部分数据的数据长度,构建所述tag新的部分数据;

基于所述tag新的部分数据以及所述tag其他部分数据,得到新的tag。

可选的,所述若丢失的rtp包为封装有一tag部分数据的rtp包,则基于接收到的封装有所述tag其他部分数据的其他rtp包的扩展字节中填充的关键信息,以及所述tag其他部分数据的数据长度,构建所述tag新的部分数据的步骤包括:

若丢失的rtp包为封装有一tag部分数据的rtp包,且所述tag部分数据包括tagheader参数;

根据接收到的封装有所述tag其他部分数据的其他rtp包,得到所述tag其他部分数据的数据长度;

以所述tag其他部分数据的数据长度,替换所述其他rtp包的扩展字节中填充的关键信息中记录的tag的数据长度,得到新的关键数据;

以所述新的关键数据构建所述tag新的部分数据。

可选的,在所述得到所述tag其他部分数据的数据长度的步骤之后,还包括:

计算所述其他rtp包的扩展字节中填充的关键信息中记录的tag的数据长度与所述tag其他部分数据的数据长度的差,得到第一差值;

计算第一差值与tagheader参数所对应的固定数据长度的差,得到第二差值;

以所述关键信息以及所述第二差值对应个数的预设字符,构建所述tag新的部分数据。

可选的,所述若丢失的rtp包为封装有一tag部分数据的rtp包,则基于接收到的封装有所述tag其他部分数据的其他rtp包的扩展字节中填充的关键信息,以及所述tag其他部分数据的数据长度,构建所述tag新的部分数据的步骤还包括:

若丢失的rtp包为封装有一tag部分数据的rtp包,且所述tag部分数据仅包括tagdata;

根据接收到的封装有所述tag其他部分数据的其他rtp包,得到所述tag其他部分数据的数据长度;

计算所述其他rtp包的扩展字节中填充的关键信息中记录的tag的数据长度与所述tag其他部分数据的数据长度的差,得到第三差值;

以所述第三差值对应个数的预设字符,构建所述tag新的部分数据。

可选的,所述对丢失的rtp包所封装的tag进行恢复,得到新的tag的步骤还包括:

若丢失的rtp包为封装有一tag全部数据的rtp包,则检测是否存在所述丢失的rtp包对应的冗余包;

若存在,则根据所述丢失的rtp包对应的冗余包得到新的tag;

若不存在,则基于所述丢失的rtp包的rtp编号,发送重传请求至发送端,以供发送端重传所述丢失的rtp包;

接收发送端重传的rtp包,并基于所述重传的rtp包得到新的tag。

第二方面,本发明还提供一种flv数据传输系统,所述flv数据传输系统包括:

发送端,用于将flv数据解析成多个tag,并分别将每个tag封装至rtp包;基于组播传输的方式,将rtp包传输到接收端;

接收端,用于接收rtp包,并在rtp包丢失时,对丢失的rtp包所封装的tag进行恢复,得到新的tag,并基于未丢失的rtp包所封装的tag以及所述新的tag,得到新的flv数据。

第三方面,本发明还提供一种flv数据传输设备,所述flv数据传输设备包括处理器、存储器、以及存储在所述存储器上并可被所述处理器执行的flv数据传输程序,其中所述flv数据传输程序被所述处理器执行时,实现如上所述的flv数据传输方法的步骤。

第四方面,本发明还提供一种可读存储介质,所述可读存储介质上存储有flv数据传输程序,其中所述flv数据传输程序被处理器执行时,实现如上所述的flv数据传输方法的步骤。

本发明中,发送端将flv数据解析成多个tag,并分别将每个tag封装至rtp包;发送端基于组播传输的方式,将rtp包传输到接收端;接收端接收rtp包,并在rtp包丢失时,对丢失的rtp包所封装的tag进行恢复,得到新的tag,并基于未丢失的rtp包所封装的tag以及所述新的tag,得到新的flv数据。通过本发明,将flv数据包括的tag封装至rtp后以组播传输的方式进行传输,即实现了通过组播的方式传输flv数据,所占用的网络带宽资源较小,且在接收端对丢失的rtp包进行修复处理,使得最终得到的新的flv数据能被正确解析,保证了通过组播方式传输的flv数据的可靠性。

附图说明

图1为本发明实施例方案中涉及的flv数据传输设备的硬件结构示意图;

图2为本发明flv数据传输方法一实施例的流程示意图;

图3为flv数据的格式示意图。

本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。

具体实施方式

应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

第一方面,本发明实施例提供一种flv数据传输设备。

参照图1,图1为本发明实施例方案中涉及的flv数据传输设备的硬件结构示意图。本发明实施例中,flv数据传输设备可以包括处理器1001(例如中央处理器centralprocessingunit,cpu),通信总线1002,用户接口1003,网络接口1004,存储器1005。其中,通信总线1002用于实现这些组件之间的连接通信;用户接口1003可以包括显示屏(display)、输入单元比如键盘(keyboard);网络接口1004可选的可以包括标准的有线接口、无线接口(如无线保真wireless-fidelity,wi-fi接口);存储器1005可以是高速随机存取存储器(randomaccessmemory,ram),也可以是稳定的存储器(non-volatilememory),例如磁盘存储器,存储器1005可选的还可以是独立于前述处理器1001的存储装置。本领域技术人员可以理解,图1中示出的硬件结构并不构成对本发明的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。

继续参照图1,图1中作为一种计算机存储介质的存储器1005中可以包括操作系统、网络通信模块、用户接口模块以及flv数据传输程序。其中,处理器1001可以调用存储器1005中存储的flv数据传输程序,并执行本发明实施例提供的flv数据传输方法。

第二方面,本发明实施例提供了一种flv数据传输方法。

参照图2,图2为本发明flv数据传输方法一实施例的流程示意图。如图2所示,一实施例中,flv数据传输方法包括:

步骤s10,发送端将flv数据解析成多个tag,并分别将每个tag封装至rtp包;

本实施例中,flv(flashvideo)是现在非常流行的流媒体格式,由于其视频文件体积轻巧、封装播放简单等特点,使其很适合在网络上进行应用,目前主流的视频网站无一例外地使用了flv格式。flv数据即flv格式的数据。flv是流媒体封装格式,参照图3,图3为flv数据的格式示意图。如图3所示,flv包括文件头(header)和文件体(body)两部分,其中文件体由一系列的tag及previoustagsize对组成。对flv数据进行解析,即可得到tag1、tag2、......、tagn。然后分别将每个tag封装至rtp包,封装的原则是一个rtp包中只能包含一个tag的全部数据,或一个tag的部分数据,封装时具体根据tag的大小选择是将tag封装至一个rtp包或是封装至多个rtp包。rtp即real-timetransportprotocol,实时传输协议。

具体的,一实施例中,所述分别将每个tag封装至rtp包的步骤包括:

当一tag的数据长度小于m时,将所述tag封装至一个rtp包中;当一tag的数据长度大于n倍的m时,将所述tag封装至n+1个rtp包中;当一tag的数据长度等于n倍的m时,将所述tag封装至n个rtp包中;其中,n为正整数,m为一个rtp包可承载的最大数据长度。

本实施例中,若网络传输的最大传输单元为1500字节,由于rtp自己的格式需要占用60字节,则一个rtp包可承载的最大数据长度为1440(单位:字节)。若一tag的数据长度小于1440,则将其封装至一个rtp包中;若一tag的数据长度为1600字节,其大于一倍的1440,则将其封装至两个rtp包中,其中第一个rtp包封装该tag前面的1440字节的数据,第二个rtp包封装该tag后160字节的数据;同理,若一tag的数据长度为3000字节,其大于两倍的1440,则将其封装至三个rtp包中;若一tag的数据长度刚好等于n倍的1440,则将其封装至n个rtp包中。

步骤s20,发送端基于组播传输的方式,将rtp包传输到接收端;

本实施例中,组播又称多目标广播、多播。网络中使用的一种传输方式,它允许把所发消息传送给所有可能目的地中的一个经过选择的子集,即向明确指出的多种地址输送信息。是一种在一个发送者和多个接收者之间进行通信的方法。组播传输为现有技术,在此不做赘述。通过组播传输的方式,即可将rtp包传输到多个接收端。

步骤s30,接收端接收rtp包,并在rtp包丢失时,对丢失的rtp包所封装的tag进行恢复,得到新的tag,并基于未丢失的rtp包所封装的tag以及所述新的tag,得到新的flv数据。

本实施例中,发送端基于组播传输的方式,可将rtp包传输到多个接收端,在此以多个接收端中的任一个为例进行说明。

接收端接收rtp包,而根据rtp标准协议规范,rtp包的发送编号是连续的,接收端根据接收到的rtp包的编号是否连续,即可确定是否发生了rtp包丢失的情况。容易理解的是,若接收端接收到的rtp包的编号连续,则说明未发生rtp包丢失,即tag数据未丢失,则可直接根据收到的rtp包中所封装的tag还原得到flv数据,且后续能对flv数据正确解析。

但是由于在传输过程中丢失rtp包也是很常见的情况,若接收端接收到的rtp包的编号不连续,则说明发生了rtp包丢失的情况,即丢失的rtp包所封装的tag丢失了,这种情况下,必须对丢失的rtp包进行恢复,即对丢失的tag进行恢复,得到新的tag,才能保证最终得到的新的flv数据能被正确解析。其中,恢复的手段包括:重构tag,重发rtp包等手段。

本实施例中,发送端将flv数据解析成多个tag,并分别将每个tag封装至rtp包;发送端基于组播传输的方式,将rtp包传输到接收端;接收端接收rtp包,并在rtp包丢失时,对丢失的rtp包所封装的tag进行恢复,得到新的tag,并基于未丢失的rtp包所封装的tag以及所述新的tag,得到新的flv数据。通过本实施例,将flv数据包括的tag封装至rtp后以组播传输的方式进行传输,即实现了通过组播的方式传输flv数据,所占用的网络带宽资源较小,且在接收端对丢失的rtp包进行修复处理,使得最终得到的新的flv数据能被正确解析,保证了通过组播方式传输的flv数据的可靠性。

进一步地,一实施例中,rtp包的扩展字节中填充有所封装的tag的关键信息,所述关键信息包括tag序号、tag数据类型、tag的时间戳、tag的数据长度,且当rtp包为封装开始和/或封装结束包时,在其扩展字节中填充开始和/或结束标记。

本实施例中,例如将tag1封装到rtp包1中,则将tag1的关键信息填充至rtp包1的扩展字节中;同理,若将tag1封装到rtp包1、rtp包2和rtp包3,则分别将tag1的关键信息填充至rtp包1、rtp包2、以及rtp包3的扩展字节中。且当rtp包为封装开始和/或封装结束包时,例如,一tag由rtp包1、rtp包2、rtp包3封装,则在rtp包1对应的扩展字节中除了填充所封装的tag的关键信息外,在扩展字节中还填充开始标记,用于表示rtp包1是tag对应的第一个rtp包;在rtp包3对应的扩展字节中除了填充所封装的tag的关键信息外,还填充结束标记,用于表示rtp包3是tag对应的最后一个rtp包;在rtp包2对应的扩展字节中仅填充所封装的tag的关键信息。若一tag由一个rtp包封装,则在该rtp包的扩展字节中除了填充所封装tag的关键信息外,还同时填充开始标记和结束标记。

可选地,扩展字节的定义如下:

typedefstruct

{

unsignedinttag_id;

unsignedintdata_size;

unsignedintdata_type;

unsignedinttime_stamp;

chartag_head_flag;

}ext_flv_rtp_hdr_t;

其中,tag_id记录tag序号,data_size记录tag的数据长度(这个数据长度指的是tagheader+tagdata的总长度),data_type记录tag数据类型,time_stamp记录tag的时间戳。tag_head_flag用于表示rtp封装tag的开始或结束时用标记,例如若tag_head_flag为1,则表示对应的rtp为封装开始包;若为2,则表示对应的rtp为封装结束包;若为12,则表示对应的rtp为封装开始和结束包,若不为封装开始包和/或封装结束包,tag_head_flag字段为空。

当然,可根据实际需要对扩展字节进行定义,扩展字节中还可以包括关键帧标记,用于标记所封装的tag是否为关键帧。例如,tag3为关键帧,则在封装tag3的rtp包的扩展字节中除了封装tag3的关键信息外,还封装关键帧标记。另一扩展字节的定义如下:

其中,tag_id记录tag序号,data_size记录tag的数据长度(这个数据长度指的是tagheader+tagdata的总长度),data_type记录tag数据类型,time_stamp记录tag的时间戳,当rtp封装tag数据的开始或结束时用tag_head_flag标记,tag的中的数据为视频关键帧时用frame_key标记。

在上一实施例的基础上,所述对丢失的rtp包所封装的tag进行恢复,得到新的tag的步骤包括:

步骤s301,若丢失的rtp包为封装有一tag部分数据的rtp包,则基于接收到的封装有所述tag其他部分数据的其他rtp包的扩展字节中填充的关键信息,以及所述tag其他部分数据的数据长度,构建所述tag新的部分数据;

本实施例中,若一tag是由多个rtp包封装的,当多个rtp包在传输过程中一个或多个rtp包发生丢失,即tag部分数据丢失,接收端即可根据多个rtp包中未丢失的其他rtp包的扩展字节中填充的关键信息,以及其他rtp包所封装的tag其他部分数据的数据长度,重新构建丢失的tag部分数据。

步骤s302,基于所述tag新的部分数据以及所述tag其他部分数据,得到新的tag。

本实施例中,基于重新构建得到的tag新的部分数据以及未发生丢失的rtp包中封装的tag其他部分数据,即可得到新的tag。

进一步地,一实施例中,步骤s301包括:

步骤s3011,若丢失的rtp包为封装有一tag部分数据的rtp包,且所述tag部分数据包括tagheader参数;

本实施例中,若tag1由rtp包34封装,则在rtp包34的扩展字节中填充有开始和结束标记,tag2由rtp包35、rtp包36和rtp包37封装,则在rtp包35的扩展字节中填充有开始标记,在rtp包37的扩展字节中填充有结束标记。rtp包34、rtp包35、rtp包36和rtp包37由发送端发出后,若接收端只收到rtp包34、rtp包36和rtp包37。由于接收到收到的rtp包的编号不连续,则确定当前发生了rtp包丢失的情况。且在rtp包34的扩展字节中填充有开始和结束标记,在rtp包37的扩展字节中填充有结束标记,中间缺失了开始标记,则说明丢失的rtp包35为封装开始包,封装开始包中封装有tag的tagheader参数。且rtp包36和rtp包37的扩展字节中填充的tag序号相同,均是tag2的序号,而rtp包34的扩展字节中填充的tag序号是tag1的序号,则说明丢失的rtp包35为封装有tag2部分数据的rtp包。综合上述分析,即可确定丢失的rtp包35封装有tag2的tagheader参数。

步骤s3012,根据接收到的封装有所述tag其他部分数据的其他rtp包,得到所述tag其他部分数据的数据长度;

本实施例中,当确定丢失的rtp包35封装有tag2的tagheader参数时,计算rtp包36封装的tag2其他部分数据的数据长度与rtp包37封装的tag2其他部分数据的数据长度之和s,即当前实际接收到的tag2其他部分数据的数据长度为s。

步骤s3013,以所述tag其他部分数据的数据长度,替换所述其他rtp包的扩展字节中填充的关键信息中记录的tag的数据长度,得到新的关键数据;

本实施例中,rtp包36和37的扩展字节中填充的关键信息中记录的tag的数据长度为完整的tag2的数据长度,而现在只接收到的tag2的部分数据,且部分数据的长度为s,则以s替换rtp包36和37的扩展字节中填充的关键信息中记录的tag的数据长度,得到新的关键数据。

步骤s3014,以所述新的关键数据构建所述tag新的部分数据。

本实施例中,新的关键信息包括tag2的tag序号、tag2的tag数据类型、tag2的tag的时间戳、tag2的tag的数据长度s,而tagheader包括:type(1字节),表示tag类型,包括音频(0x08),视频(0x09)和scriptdata(0x12),其他类型值被保留;datasize(3字节),表示tag的data部分数据长度;timestamp(3字节)表示该tag的时间戳;timestamp_ex(1字节)表示时间戳的扩展字节;streamid(3字节)表示streamid,总是0。则根据新的关键数据可构建得到新的tagheader,例如:以新的关键信息中的data_type对应的值,作为新的tagheader中的type对应的值;以新的关键信息中的数据长度s减去tagheader参数所对应的固定数据长度,以得到的差作为新的tagheader中的datasize的值;以新的关键信息中的time_stamp的值,作为新的tagheader中的timestamp的值;根据tagheader的定义,得到新的tagheader中的timestamp的值后,便可得到新的tagheader中的timestamp_ex的值;新的tagheader中的streamid,为0。综上,即可得到新的tagheader。后续,根据新的tagheader和rtp包36以及rtp包37封装的数据,即可得到新的tag2。

进一步地,一实施例中,在步骤s3012之后,还包括:

步骤s3015,计算所述其他rtp包的扩展字节中填充的关键信息中记录的tag的数据长度与所述tag其他部分数据的数据长度的差,得到第一差值;

本实施例中,当确定丢失的rtp包35封装有tag2的tagheader参数时,计算rtp包36封装的tag2其他部分数据的数据长度与rtp包37封装的tag2其他部分数据的数据长度之和s,即当前实际接收到的tag2其他部分数据的数据长度为s。rtp包36和37的扩展字节中填充的关键信息中记录的tag的数据长度,即为l,l为完整的tag2的数据长度,计算l与s的差,得到第一差值,第一差值即丢失的部分tag2的数据长度。

步骤s3016,计算第一差值与tagheader参数所对应的固定数据长度的差,得到第二差值;

本实施例中,丢失的部分tag2包括tagheader参数,还必然包括tagdata,tagheader参数的数据长度与tagdata的数据长度之和,而tagheader参数的数据长度一般为固定值11,则计算第一差值与tagheader参数所对应的固定数据长度11的差,得到第二差值。第二差值即丢失的rtp包35中tagdata部分的数据长度。

步骤s3017,以所述关键信息以及所述第二差值对应个数的预设字符,构建所述tag新的部分数据。

本实施例中,丢失的rtp包35封装有tag2的tagheader参数,和tagdata部分,且tagdata部分的数据长度为第二差值。当前rtp包35丢失了,而根据rtp包36和37的扩展字节中填充的关键信息可直接得到tag2的tagheader参数,上文中已详细说明了如何根据关键信息得到tagheader参数,在此不做赘述。在此基础上,再补充第二差值对应个数的预设字符(预设字符例如0),即可得到tag2新的部分数据。tag2新的部分数据与丢失的tag新的部分数据,仅tagdata部分的具体字符不同。

进一步地,一实施例中,步骤s301还包括:

若丢失的rtp包为封装有一tag部分数据的rtp包,且所述tag部分数据仅包括tagdata;根据接收到的封装有所述tag其他部分数据的其他rtp包,得到所述tag其他部分数据的数据长度;计算所述其他rtp包的扩展字节中填充的关键信息中记录的tag的数据长度与所述tag其他部分数据的数据长度的差,得到第三差值;以所述第三差值对应个数的预设字符,构建所述tag新的部分数据。

本实施例中,tag1由rtp包35、rtp包36和rtp包37封装,则在rtp包35的扩展字节中填充有开始标记,在rtp包37的扩展字节中填充有结束标记。tag2由rtp包38封装,则在rtp包38的扩展字节中填充有开始和结束标记。rtp包35、rtp包36、rtp包37以及rtp包38由发送端发出后,若接收端只接收到rtp包35、以及rtp包38,由于接收到收到的rtp包的编号不连续,则确定当前发生了rtp包丢失的情况。且在rtp包35的扩展字节中填充有开始标记,在rtp包38的扩展字节中填充有开始和结束标记,中间缺失了结束标记,则说明丢失的rtp包36和37不是封装开始包,而只有在封装开始包中才封装有tag的tagheader参数。则确定当前丢失的rtp包36和37封装的部分数据仅包括tagdata部分。且根据rtp包35的扩展字节中填充的tag1的序号、开始标记,以及rtp包38的扩展字节中填充的tag2的序号、开始和结束标记,可以确定丢失的rtp包36和37封装有tag1部分数据。综合上述分析,即可确定丢失的rtp包36和37封装有tag1部分数据,且rtp包36和37封装的tag1部分数据仅包括tagdata。

接收到的封装有tag1其他部分数据的其他rtp包只有rtp包35,则rtp包35所封装的tag1其他部分数据的长度即当前实际接收到的tag1的长度。而rtp包35的扩展字节中填充的关键信息中记录的tag1的数据长度即完整的tag1的数据长度,用完整的tag1的数据长度减去当前实际接收到的tag1的长度,得到的第三差值,第三差值即当前丢失的rtp包36和37封装的tag1部分数据的数据长度。故直接以第三差值对应个数的预设字符,作为丢失的tag1部分数据,即得到tag1新的部分数据。后续,根据tag1新的部分数据和rtp包35所封装的tag1其他部分数据,即可得到新的tag1。

进一步地,一实施例中,所述对丢失的rtp包所封装的tag进行恢复,得到新的tag的步骤还包括:

若丢失的rtp包为封装有一tag全部数据的rtp包,则检测是否存在所述丢失的rtp包对应的冗余包;若存在,则根据所述丢失的rtp包对应的冗余包得到新的tag;若不存在,则基于所述丢失的rtp包的rtp编号,发送重传请求至发送端,以供发送端重传所述丢失的rtp包;接收发送端重传的rtp包,并基于所述重传的rtp包得到新的tag。

本实施例中,发送端在发送rtp包时,还发送该rtp包对应的冗余包。或是,当tag中的数据为视频关键帧时,且该tag通过一个rtp包封装,在rtp包的扩展字节中便会填充有frame_key标记,针对带有frame_key标记的rtp包,发送端在发送该rtp包时,还发送该rtp包对应的冗余包。

例如,tag1由rtp包35封装,tag2由rtp包36封装,tag3由rtp包37和38封装,rtp包35、rtp包35的冗余包、rtp包36、rtp包36的冗余包、rtp包37以及rtp包38由发送端发出后,若接收端未收到rtp包36,由于rtp包35的扩展字节中填充有tag1的序号,在rtp包37的扩展字节中填充有tag3的序号,则说明tag2由rtp包36封装,且当前rtp包36丢失了,则从收到的冗余包中查找是否存在rtp包36对应的冗余包,若存在,则基于冗余包得到rtp包36。

若发送端在发送rtp包36时,由于rtp包36的扩展字节中未封装有关键帧标记,则不发送rtp包36。则接收端未收到rtp包36时,也查找不到对应的冗余包,则接收端基于丢失的rtp包36的rtp编号,发送重传请求至发送端,以供发送端重传丢失的rtp包36,并接收发送端重传的rtp包36,并基于重传的rtp包36得到新的tag。容易理解的是,基于冗余包或重传的rtp包得到的新的tag与原先发送的tag是完全一样的。

容易理解的是,若丢失的rtp包为封装有一tag部分数据的rtp包,也可以通过冗余包或重传的方式对丢失的tag部分数据进行恢复。在无法通过冗余包或重传的方式对丢失的tag部分数据进行恢复时,再按照上述实施例中重构tag的方式对丢失的tag部分数据进行恢复。

第三方面,本发明实施例还提供一种flv数据传输系统。

一实施例中,flv数据传输系统包括:

发送端,用于将flv数据解析成多个tag,并分别将每个tag封装至rtp包;基于组播传输的方式,将rtp包传输到接收端;

接收端,用于接收rtp包,并在rtp包丢失时,对丢失的rtp包所封装的tag进行恢复,得到新的tag,并基于未丢失的rtp包所封装的tag以及所述新的tag,得到新的flv数据。

进一步地,一实施例中,发送端具体用于:

当一tag的数据长度小于m时,将所述tag封装至一个rtp包中;

当一tag的数据长度大于n倍的m时,将所述tag封装至n+1个rtp包中;

当一tag的数据长度等于n倍的m时,将所述tag封装至n个rtp包中;

其中,n为正整数,m为一个rtp包可承载的最大数据长度。

进一步地,一实施例中,rtp包的扩展字节中填充有所封装的tag的关键信息,所述关键信息包括tag序号、tag数据类型、tag的时间戳、tag的数据长度,且当rtp包为封装开始和/或封装结束包时,在其扩展字节中填充开始和/或结束标记,接收端具体用于:

若丢失的rtp包为封装有一tag部分数据的rtp包,则基于接收到的封装有所述tag其他部分数据的其他rtp包的扩展字节中填充的关键信息,以及所述tag其他部分数据的数据长度,构建所述tag新的部分数据;

基于所述tag新的部分数据以及所述tag其他部分数据,得到新的tag。

进一步地,一实施例中,接收端具体用于:

若丢失的rtp包为封装有一tag部分数据的rtp包,且所述tag部分数据包括tagheader参数;

根据接收到的封装有所述tag其他部分数据的其他rtp包,得到所述tag其他部分数据的数据长度;

以所述tag其他部分数据的数据长度,替换所述其他rtp包的扩展字节中填充的关键信息中记录的tag的数据长度,得到新的关键数据;

以所述新的关键数据构建所述tag新的部分数据。

进一步地,一实施例中,接收端具体用于:

计算所述其他rtp包的扩展字节中填充的关键信息中记录的tag的数据长度与所述tag其他部分数据的数据长度的差,得到第一差值;

计算第一差值与tagheader参数所对应的固定数据长度的差,得到第二差值;

以所述关键信息以及所述第二差值对应个数的预设字符,构建所述tag新的部分数据。

进一步地,一实施例中,接收端具体用于:

若丢失的rtp包为封装有一tag部分数据的rtp包,且所述tag部分数据仅包括tagdata;

根据接收到的封装有所述tag其他部分数据的其他rtp包,得到所述tag其他部分数据的数据长度;

计算所述其他rtp包的扩展字节中填充的关键信息中记录的tag的数据长度与所述tag其他部分数据的数据长度的差,得到第三差值;

以所述第三差值对应个数的预设字符,构建所述tag新的部分数据。

进一步地,一实施例中,接收端具体用于:

若丢失的rtp包为封装有一tag全部数据的rtp包,则检测是否存在所述丢失的rtp包对应的冗余包;

若存在,则根据所述丢失的rtp包对应的冗余包得到新的tag;

若不存在,则基于所述丢失的rtp包的rtp编号,发送重传请求至发送端,以供发送端重传所述丢失的rtp包;

接收发送端重传的rtp包,并基于所述重传的rtp包得到新的tag。

其中,上述flv数据传输系统中发送端、接收端的功能实现与上述flv数据传输方法实施例中各步骤相对应,其功能和实现过程在此处不再一一赘述。

第四方面,本发明实施例还提供一种可读存储介质。

本发明可读存储介质上存储有flv数据传输程序,其中所述flv数据传输程序被处理器执行时,实现如上述的flv数据传输方法的步骤。

其中,flv数据传输程序被执行时所实现的方法可参照本发明flv数据传输方法的各个实施例,此处不再赘述。

需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者系统中还存在另外的相同要素。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在如上所述的一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备执行本发明各个实施例所述的方法。

以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

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