一种高效的流媒体传输方法转让专利

申请号 : CN200910108577.3

文献号 : CN101945427B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 邹联忠

申请人 : 深圳市融创天下科技股份有限公司

摘要 :

本发明关于流媒体传输方法,基于UDP的数据传输协议,具体如下:在服务端建立视频文件,包括若干数据帧,每一个数据帧对应一个帧序列号和一个帧时间戳;将每一数据帧分割成若干数据包,或者将几个数据帧组合成一个数据包,每个数据包都对应一个包序列号和一个包时间戳;服务端向客户端发送数据包,并将数据包的包序列号与包时间戳记录到内存的队列里面;客户端检测有无丢失的数据包,有包丢失时,将丢失包序列号反馈至服务端,服务端根据队列中包序列号找到对应的包时间戳;根据包时间戳与帧时间戳的关系,找到丢失数据包对应的数据帧,将一个数据帧分割成几个数据包,或者将几个数据帧组成一个数据包,再向客户端发送丢失的数据包。

权利要求 :

1.一种高效的流媒体传输方法,该方法基于UDP的数据传输协议,其特征在于,该方法具体步骤如下:步骤S1:在服务端建立一个视频文件,该视频文件包括若干数据帧,每一个数据帧对应一个帧序列号和一个帧时间戳;

步骤S2:根据数据帧的长度将每一数据帧分割成若干数据包,或者将几个数据帧组合成一个数据包,每个数据包都对应一个包序列号和一个包时间戳;

步骤S3:服务端向客户端发送数据包,并将该数据包的包序列号与包时间戳记录到内存的队列里面;

步骤S4:客户端根据包序列号检测有无丢失的数据包,检测有包丢失时,将丢失包序列号反馈至服务端,服务端根据内存中的队列中包序列号找到对应的包时间戳;

步骤S5:根据包时间戳与帧时间戳的映射关系,在视频文件中找到丢失数据包对应的一个或多个数据帧,将一个数据帧分割成几个数据包,或者将几个数据帧组成一个数据包,再向客户端发送丢失的数据包。

2.如权利要求1所述的高效的流媒体传输方法,其特征在于:所述步骤S1中帧时间戳为等分的。

3.如权利要求2所述的高效的流媒体传输方法,其特征在于:所述步骤S2具体如下:S21:先确定一个无线传输环境下的数据包长度L,每个数据帧的大小为n,当n大于L时,将该帧切割成n/L+1个数据包,前n/L个数据包每个长度为L,最后一个数据包长度为n%L,其中:n/L为作除后取整函数,%为作除后取余函数;当n小于L时,由该帧或者与后续的小于n的数据帧相加组成一个数据长度小于或等于L的数据包;

S22:建立包时间戳与帧时间戳的映射关系,当n大于L时,其中n/L+1数据包记录具有相同的包时间戳,即该数据帧的帧时间戳;当n小于L时,该数据包记录的包时间戳为第一个长度小于L的数据帧对应的帧时间戳。

4.如权利要求3所述的高效的流媒体传输方法,其特征在于:所述步骤S3具体如下:S31:当n大于L时,队列中只记录n/L+1个数据包的第一个数据包的包序列号以及对应的包时间戳;

S32:当n小于L时,队列中记录几个小于n的数据帧相加组成一个数据长度小于或等于L的数据包的包序列号以及第一个长度小于L的数据帧对应的包时间戳。

5.如权利要求4所述的高效的流媒体传输方法,其特征在于:所述步骤S4具体如下:S41:如果在队列中能够查找到客户端反馈的丢失包序列号,则说明丢失的数据包为n大于L时的第一个数据包或者n小于L时的几个数据帧组成的数据包,服务器找到包序列号对应包时间戳;

S42:如果在队列中不能查找到客户端反馈的丢失包序列号,则说明这是一个大于L的数据帧中的一个数据包,则在序号时间队列中找到与这个包序列号相隔最近的前一个包序列号,找到该前一个包序列号对应包时间戳;

6.如权利要求5所述的高效的流媒体传输方法,其特征在于:所述步骤S5具体如下:S51:如果在队列中能找到丢失包序列号,n大于L时,则由包时间戳直接获得对应的帧时间戳,由帧时间戳读取视频文件中的数据帧,并将数据帧分割成n/L+1个数据包,向客户端重新发送第一个数据包;n小于L时,则由包时间戳找到第一个帧长度小于L的帧时间戳,该帧和后续的小于n的数据帧相加组成一个数据长度小于或等于L的数据包向客户端重新发送;

S52:如果在队列中不能查找到丢失包序列号,根据该前一个包序列号对应包时间戳对应帧时间戳的数据帧读出来,把这个数据帧切割为几个数据包将丢失包序列号与该前一个包序列号相减得出差值D,其中(n/L+1)个数据包中的第(D+1)数据包即丢失的数据包,将第(D+1)数据包重新发送给客户端。

7.如权利要求1所述的高效的流媒体传输方法,其特征在于:所述数据帧可以为视频帧或者是音频帧。

8.如权利要求3所述的高效的流媒体传输方法,其特征在于:当n等于L时,则将该帧直接作为一个数据包。

说明书 :

一种高效的流媒体传输方法

技术领域

[0001] 本发明涉及无线流媒体领域,尤其涉及一种高效的流媒体传输方法。

背景技术

[0002] 随着移动通信技术和视频压缩方法的迅速发展,利用无线IP网络传输实时视频流技术受到了人们的关注。在无线IP网络和尽力服务(best-effort)的Internet中传输数据时会发生丢包、超时等传输差错。丢包率的数值一般比较小,但是对用户的影响非常大,是影响视频质量的杀手,尤其是目前使用的压缩比率都比较高,一个视频帧的丢失或损坏同样会影响到其它相关帧的解压缩,直接损害接收端视频播放的流畅性和清晰性。因此,需要在视频传输的同时进行传输的差错控制处理。
[0003] 基于连接的TCP协议虽然能提供可靠的数据传输能力,但是它的流量控制机制是基于有线网络的低误码率及低时延的。随着网络带宽时延产品(BDP)的增加,通常的TCP协议开始变的低效。这是因为它的AIMD(additive increase multiplicative decrease)算法彻底减少了TCP拥塞窗口,但不能快速的恢复可用带宽。另外,TCP拥塞控制中的不公平的RTT(Round-Trip Time分组的往返时间)造成了拥有不同RTT的并发TCP流不公平地分享带宽。尽管在小的BDP网络中使用通常的TCP实现来相对平等的共享带宽,但在拥有大量BDP的无线网络中,通常不同RTT的并发TCP流就必须承受严重的不公平的问题。在TCP协议中,发送端通过发送窗和计时器管理所发送的数据包的信息,接收端对收到的正确数据包回送ACK确认字符(ACKnowledge Character)响应,ACK响应本身也将耗费相当多的网络和处理器资源。另外在TCP协议中,为了数据包重传,发送过但是还未确认的数据都保存在TCP协议栈中,对高并发量的无线流媒体服务器来说,对每一个用户都缓存会极大的浪费主机资源,在网络时延大,带宽抖动率高的无线网络中更加严重。
[0004] 而基于UDP协议,UDP即(User Datagram Protocol)用户数据报协议,的数据传输,没有TCP中所说的拥塞窗口,拥塞控制,及数据缓存。但UDP协议不提供TCP提供的差错控制功能。而现在有的以UDP为基础实现的可靠的数据传输,也是先缓存发送过的数据再等待ACK响应。这对数据量及用户量大的流服务器来说造成资源的浪费,而且会降低服务器的并发量。例如,服务器发送500个数据包,服务器并发量为8000,而每个数据包的大小为1K,那么服务器的缓存就需要500x8000x1K约4G的内存。这对服务器的性能有极大的影响。
[0005] 鉴于此,实有必要提出一种改进的方法以克服现有技术的缺陷。

发明内容

[0006] 有鉴于此,本发明目的在于提供一种基于UDP协议的一种高效的流媒体传输方法,根据无线网络的特点,提出一种高效的流媒体视频业务点播方案,能很好的提高用户的体验效果,及降低服务器自身的资源。
[0007] 为了解决上述问题本发明提供一种高效的流媒体传输方法方法,该方法具体步骤如下:
[0008] 步骤S1:在服务端建立一个视频文件,该视频文件包括若干数据帧,每一个数据帧对应一个帧序列号和一个帧时间戳;
[0009] 步骤S2:根据数据帧的长度将每一数据帧分割成若干数据包,或者将几个数据帧组合成一个数据包,每个数据包都对应一个包序列号和一个包时间戳;
[0010] 步骤S3:服务端向客户端发送数据包,并将该数据包的包序列号与包时间戳记录到内存的队列里面;
[0011] 步骤S4:客户端根据包序列号检测有无丢失的数据包,检测有包丢失时,将丢失包序列号反馈至服务端,服务端根据内存中的队列中包序列号找到对应的包时间戳,[0012] 步骤S5:根据包时间戳与帧时间戳的映射关系,在视频文件中找到丢失数据包对应的一个或多个数据帧,将一个数据帧分割成几个数据包,或者将几个数据帧组成一个数据包,再向客户端发送丢失的数据包。
[0013] 本发明的有益效果在于,使用本发明方法能避免了服务器缓存已经传过的数据及重传已经发送过的数据,能极大的节省服务器的资源。

附图说明

[0014] 图1为本发明高效流媒体传输方法的流程框图;
[0015] 图2为服务端本地视频文件的数据帧序列号、数据帧长度以及对应帧时间戳的示图;
[0016] 图3为将图2所示的视频文件按本发明方法打包后的包序列号、数据包长度以及对应的包时间戳的示图;
[0017] 图4为服务端将图3所示的数据包发送后存储在内存中的包序列与包时间戳对应的队列表示图;
[0018] 图5为本发明服务端发送数据包的示意图;
[0019] 图6为一种现有技术服务端发送流媒体时的内存占用量与用户量的关系图;
[0020] 图7为本发明方法服务端发送流媒体时的内存占用量与用户量的关系图。

具体实施方式

[0021] 本发明设计一种基于UDP协议的高效的流媒体点播方案,该方案根据播放的是点播文件这一特点,采取不缓存已经发送过的数据这一策略,极大地节约服务器的资源。
[0022] 下面结合附图来说明本发明具体实施。
[0023] 图1为本发明方法的流程示意图,该方法具体步骤如下:
[0024] 步骤S1:在服务端建立一个视频文件,该视频文件包括若干数据帧,每一个数据帧对应一个帧序列号和一个帧时间戳;其中数据帧可以为视频帧或者是音频帧。
[0025] 结合图2所示,为服务端本地视频文件的数据帧序列号、数据帧长度以及对应帧时间戳的示图,其中图中第一列:1、2、3、…18为数据帧序列号,第二列len=2853、len=167、len=68、…len=16为对应数据帧长度;第三列time=0.00000、time=0.12000、time=0.24000、…time=2.16000为对应的帧时间戳。此处帧时间戳的间隔是相等的即隔0.12000秒为一帧。
[0026] 步骤S2:根据数据帧的长度将每一数据帧分割成若干数据包,或者将几个数据帧组合成一个数据包,每个数据包都对应一个包序列号和一个包时间戳;
[0027] 此处将数据帧具体过程打包如下:
[0028] S21:先确定一个无线传输环境下的数据包长度L,每个数据帧的大小为n,当n大于L时,将该帧切割成n/L+1个数据包,前n/L个数据包每个长度为L,最后一个数据包长度为n%L,其中n/L为作除后取整函数,%为作除后取余函数;当n小于L时,由该帧或者与后续的小于L的数据帧相加组成一个数据长度小于或等于L的数据包;
[0029] S22:建立包时间戳与帧时间戳的映射关系,当n大于L时,其中n/L+1数据包记录具有相同的包时间戳,即该数据帧的帧时间戳;当n小于L时,该数据包记录的包时间戳为第一个长度小于L的数据帧对应的帧时间戳。
[0030] 图3所示为将图2所示的视频文件按本发明方法打包后的包序列号、数据包长度以及对应的包时间戳的示图:先设定一个数据包长度L等于1200,图2中帧序列1的数据帧长度n为2853,因此n大于L,将帧序列1数据帧切割成n/L+1个数据包,即2853/1200+1=3个数据,前2个数据包长度为1200,第3个数据包长度为n%L,即2853/1200的余数453,由此图3中,第一列为包序列号1、2、3对应的数据包长度分别为len=1200、len=1200、len=453,且为将数据帧1切割而得,因此包序列号1、2、3对应的时间与帧序列号1的时间戳相同,都为time=0.00000、time=0.00000、time=0.00000;
[0031] 在图2中,帧序列号2的长度为167小于L(1200)、与后续帧序列号3长度为68也小于L,且167加68等于235满足小于1200,因此帧序列号2、3组成一个数据包(图3中的数据包号4、数据包长度为235、对应的包时间戳为第一个小于L的数据帧对应的帧时间戳,即帧序列号2对应的帧时间戳time=0.12000)。
[0032] 如果n等于L时,则将该帧直接作为一个数据包。
[0033] 后续数据的打包过程由上述类推,在此不再赘述。
[0034] 步骤S3:服务端向客户端发送数据包,并将该数据包的包序列号与包时间戳记录到内存的队列里面;
[0035] S31:当n大于L时,队列中只记录n/L+1个数据包的第一个数据包的包序列号以及对应的包时间戳;
[0036] S32:当n小于L时,队列中记录几个小于n的数据帧相加组成一个数据长度小于或等于L的数据包的包序列号以及第一个长度小于L的数据帧对应的包时间戳。
[0037] 请参考图3和图5,服务端按照打包好的数据包依照包序列号1、2、3…18向客户端发送数据包,
[0038] 如图4所示,为服务端内存队列中记录的信息,第一列1、4、5…18为包序列号,其中1为3个包时间戳为0.00000中的第一个数据包号,4为包时间为0.12000的数据包号。
[0039] 步骤S4:客户端根据包序列号检测有无丢失的数据包,检测有包丢失时,将丢失包序列号反馈至服务端,服务端根据内存中的队列中包序列号找到对应的包时间戳,具体步骤如下:
[0040] S41:如果在队列中能够查找到客户端反馈的丢失包序列号,则说明丢失的数据包为n大于L时的第一个数据包或者n小于L时的几个数据帧组成的数据包,服务器找到包序列号对应包时间戳;
[0041] 本步骤中,例如客户端向反馈的丢失的包序列号为1、4,因此在服务端的内存中可以找到包序列号1、4(如图4所示)分别可以找到对应的包时间戳。
[0042] S42:如果在队列中不能查找到客户端反馈的丢失包序列号,则说明这是一个大于L的数据帧中的一个数据包,则在序号时间队列中找到与这个包序列号相隔最近的前一个包序列号,找到该前一个包序列号对应包时间戳;
[0043] 例如例客户端向反馈的丢失的包序列号为2或者3,因此在服务端的内存中不能找到包序列号2或者3(如图4所示)以及对应的包时间戳,因此在序号时间队列中找到与这个序列号相隔最近的前一个包序列号1,此处与包序列号2或者3相隔最近的前一个包序列号只有包序列号1。
[0044] 步骤S5:根据包时间戳与帧时间戳的映射关系,在视频文件中找到丢失数据包对应的一个或多个数据帧,将一个数据帧分割成几个数据包,或者将几个数据帧组成一个数据包,再向客户端发送丢失的数据包。
[0045] S51:如果在队列中能找到丢失包序列号,n大于L时,则由包时间戳直接获得对应的帧时间戳,由帧时间戳读取视频文件中的数据帧,并将数据帧分割成n/L+1个数据包,向客户端重新发送第一个数据包;n小于L时,则由包时间戳找到第一个帧长度小于L的帧时间戳,该帧和后续的小于n的数据帧相加组成一个数据长度小于或等于L的数据包向客户端重新发送;
[0046] 例如丢失包序列号1,对应的包时间戳为0.00000,由包时间戳0.00000找到对应的帧时间戳0.00000,帧时间戳0.00000读取视频文件中的数据帧1,并将数据帧分割成2853/1200+1=3个数据包,向客户端重新发送第一个数据包;丢失包序列号4时包时间戳为0.12000,由于该包时间戳就是第一个小于1200的帧序列号为2(图2所示)的帧时间戳
0.12000,因此由帧序列号2、3组成一个长度为253小于1200的数据包向客户端重新发送。
[0047] S52:如果在队列中不能查找到丢失包序列号,根据该前一个包序列号对应包时间戳对应帧时间戳的数据帧读出来,把这个数据帧切割为几个数据包,将丢失包序列号与该前一个包序列号相减得出差值D,其中(n/L+1)个数据包中的第(D+1)数据包即丢失的数据包,将第(D+1)数据包重新发送给客户端。
[0048] 例如例客户端向反馈的丢失的包序列号为2或者3,此处与包序列号2或者3相隔最近的前一个包序列号只有包序列号1,包时间戳0.00000找到对应的帧时间戳0.00000,帧时间戳0.00000读取视频文件中的数据帧1,并将数据帧分割成2853/1200+1=3个数据包,将丢失包序列号2或者3与该前一个包序列号1相减得出差值D等于1或2,其中3个数据包中的第(D+1)即第1+1=2个或者2+1=3个数据包即丢失的数据包,将第2个(包序列号为2,长度为1200)或者第3个数据包(包序列号为3,长度为453)重新发送给客户端。
[0049] 使用本文所述的这种方法能避免了服务器缓存已经改过过的数据及重传已经发送过的数据,能极大的节省服务器的资源。图六是普通流服务器用户量与内存的关系,图七为采用本文所述方法之后的流服务器用户量与内存关系,从中可以看到采用本技术后,内存使用量明显减小,并发量明显提高。在延迟大的无线网络中对服务器性能改善更加明显。
[0050] 以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。