专利名称:一种直播流的快速缓冲方法
技术领域:
本发明涉及网络多媒体技术领域,尤其涉及一种用于移动通信网络的直播流快速缓冲的方法。
背景技术:
在现场直播类的流服务中,传统PC应用上可以使用PC的大缓存完美处理平滑播放的问题。然而手机上由于内存相对较小,需要服务端更多的参与平滑播放的处理,所以在服务端需要缓冲一大部分直播数据以保证随时连接的手机都有数据可以播放,对每个连接都需要不同的缓冲读取位置和连续播放的处理,每次读取位置的查找性能将成为服务主要 性能开销。传统的音视频流服务中,对于成帧的直播类服务,在服务端设计一个音视频流的缓冲池,通常的缓冲队列设计是以stl (标准模板库)实现中的list (队列)为基础,结合一些数据元素构成数据基础节点,然后采用“去头存尾”的方式对缓冲队列进行数据循环更新。当需要存取数据时,根据数据基础节点的时间戳或者序列号为关键值对list进行查找,由于队列循环更新,查找时除了在完全匹配情况下,其他情况不能使用Stl中的一些既有算法,只能采用循环遍历的方法进行,时间复杂度为o(n),当缓冲队列较长,同时需要服务大并发量用户时,致使性能开销很大。
公开日为2011年07月27日、公开号为CN102137124A的专利文献公开了这样的技术方案,一种P2P流媒体直播方法和系统,该方法包括监测直播流媒体的数据缓冲区的状态;当数据缓冲区的数据未填满数据安全区域时,客户节点优先向补偿服务器请求对应的直播流媒体数据;当数据缓冲区的数据填满数据安全区域时,客户节点根据上层节点的评分向上层节点请求直播流媒体数据。该技术方案需要增加补偿服务器等设备,以及检测缓冲区、对上层节点进行评分分级等操作,使得系统结构复杂、过程繁琐,性能开销大。
发明内容
本发明提供一种直播流的快速缓冲方法,它使得每个连接的缓冲位置查找复杂度为0(1),在实现了快速缓冲的同时,有效地减少了服务的性能开销。本发明针对现有技术问题主要是通过下述技术方案得以解决的,一种直播流的快速缓冲方法,包括
A.在移动流媒体系统中设置直播流缓冲池,对流媒体数据进行缓冲,以供移动终端平滑播放直播流;
B.采用数组的方式构建循环缓冲队列,以连续的数据标识序列号(Seq)作为基点来定位数据存放位置;
C.按存放位置对流媒体数据进行缓冲存取操作。在移动流媒体系统中,比如在手机移动电视系统中,设置较大容量的缓冲池。在缓冲队列的查找方法上,查找时间为常量的算法是最快的。因此,本技术方案采用数组下标访问的方式,使查找时间为常量,查找时间不会随数组的大小而变化,因而效率最高,时间复杂度为常数阶0(1)。操作中,以数组为数据基础单元集合的存储形式,在数据的保存上不使用STL (标准模板库)中的pushback (从队尾处存入)等通用方式,而是采用了非连续的存入方式。取数据时,根据数据标识序列号对数组长度的取模操作,确定数据基础单元在数组中的存放位置。这种缓冲队列设计,可以允许每 个连接用户在查找某个数据基础单元时,在完全命中情况下时间复杂度为0(1),在不完全命中情况下为0(l+n/3)。有效地加快了查找速度,减少了 CPU的工作量。作为优选,数组是指针数组,数组长度根据所需的缓冲队列大小确定。数组的长度根据缓冲队列实际需求来确定。作为优选,缓冲队列大小根据设定时长以及视频帧率确定。比如可以根据15分钟时长以及视频帧率计算缓冲队列大小。作为优选,数组的基础单元包括数据标识序列号(Seq)、时间戳(PtS)和一个指向实际流媒体数据的指针。本发明带来的有益效果是,采用非循环的队列形式构建循环队列,利用定点存取的方式进行缓冲存取处理,即采用数组的方式构建循环缓冲队列,利用连续seq为基点快速定位数据存放位置,使循环缓冲队列的连续查找时间复杂度降为0(1)。在实现了快速缓冲的同时,有效地减少了服务的性能开销。
发明内容
下面通过实施例,并结合附图,对本发明的技术方案作进一步具体说明。实施例I :如图I所示,本发明是一种直播流的快速缓冲方法,基本流程包括 步骤101,在服务器上设置缓冲池,对流媒体数据进行缓冲,以供移动终端平滑播放直
播流;
步骤102,根据设定时长以及视频帧率确定缓冲队列大小;
步骤103,存数据,流媒体数据的基础单元根据序列号Seq值存入数组中对应的位置;步骤104,取数据,根据数据标识序列号Seq对数组长度的取模操作,确定流媒体数据的基础单元在数组中的存放位置;
按上述存、取位置对流媒体数据进行缓冲存取处理。图2所示为数据结构图,缓冲队列主要由三部分构成
a. 一个指针数组,其数组长度根据所需的缓冲队列大小(实际需求)而定,本实施例中是根据15分钟时长以及视频帧率计算得到。b.流媒体数据的基础单元结构体,该结构体包括有seq序列号、pts时间戳和一个指向实际流媒体数据的指针。c.流媒体数据的物理内存存放结构,此结构的实现可以多种多样,本实施例使用连续的内存块存储,由流媒体数据的基础单元结构体b来区分不同的数据帧。实施例2,采用类C语言实现缓冲的数据保存、数据查找的方法
I、数据保存方法
void Push (BStruct氺 package){
/*ppAarray为图一中表示的A数组*/ if (ppAarray 为空)
{
/*创建ppAarray数组*/ ppAarray = new BStruct*[maxLen];
}
/*获取BStruct结构内的seq序列号元素*/
DWORD seq = package_>seq(); /*这步是关键,流媒体数据基础单元根据自身的数据标识序列号Seq存入数组中相应位置的单元内,序列号超出数组最大长度的,对最大长度取余*/ppAarray [seq 对 manLen 取余]=package;
/*更新当前队列的队尾*/
TailIdx = seq % maxLen;
/*队列头部被尾部咬到了,头得往前挪一下*/ if (seq > maxLen && HeadIdx == Tailldx){
HeadIdx = (Tailldx + I) % maxLen;
}
}
数据保存方法中的关键是流媒体数据的基础单元要根据数据标识序列号Seq值保存入数组中对应的位置,数组本身不需要进行内部数据移位等操作,这相对于动态数组或LIST的pushback来说,性能上体现也较佳。 2、数据查找方法
void Find (int seq, int pts, DataType& refVec)
{
/*DataType为BStruct指针的动态数组类型*/ if (maxLen <=0){
/*判断缓冲队列是否有数据,没有则直接返回失败*/return;
}
int dwptsprv = pts;
/*根据seq参数计算查找数据在数组中存放的位置*/ int dwindex = seq % maxLen;
BStruct* pPack = NULL;
/*如果序列号为0,表示从队列头开始*/ if (0 == dwseqprv){
dwindex = HeadIdx % maxLen;
}
/*从数组中直接获取流媒体数据基础单元*/pPack = ppAarray[dwindex]; if (pPack) {
/*判断首次匹配的数据是否完全匹配*/
DWORD packpts = pPack_>GetPts(); if (packpts >= dwptsprv){
refVec. push_back(pPack);
}
}else {/*如果首次匹配位置上数组中并没有存入数据,则比较队列尾部数据是
否有效*/
pPack = ppAarray[Tailldx]; if (seq >= pPack_>GetSeq()){
/*如果尾部数据时间戳还小于要求值,说明数据缓冲未准备好,直
接退出查找*/
return;
}
}
/*首次匹配不命中情况下,在首次匹配的位置后进行遍历查找*/ for (;;) {
/*从dwindex位置开始到TaiIIdx之间遍历匹配查找,这个操作只会在首次查找时出现,后续的查找由于seq的连续存取前提条件,都会进入完全匹配的逻辑*/
}
}
有了数据保存时按Seq存入的基础,数据的取出就变得非常简单,根据Seq对数组长度的取模操作,就可以确定流媒体数据基础单元在数组中的存放位置。由于缓冲队列是循环更新的缘故,首次查找时,有可能不会完全匹配,需要从队列的头部开始往下遍历,这种情况下最长的查找距离是队列的长度n,当第二次查找时,由于seq是连续的,查找长度将会变为I。所以本发明具有以下特征采用非循环的队列形式构建循环队列,利用定点存取的方式进行缓冲存取处理,即采用数组的方式构建循环缓冲队列,利用连续seq为基点快速定位数据存放位置,使循环缓冲队列的连续查找时间复杂度降为0(1)。在实现了快速缓冲的同时,有效地减少了服务的性能开销。
图I所示为本发明的一种基本流程 图2所示为本发明的一种数据结构图。
权利要求
1.一种直播流的快速缓冲方法,其特征在于包括 A.在移动流媒体系统中设置直播流缓冲池,对流媒体数据进行缓冲,以供移动终端平滑播放直播流; B.采用数组的方式构建循环缓冲队列,以连续的数据标识序列号作为基点来定位流媒体数据存放位置; C.按所述存放位置对流媒体数据进行缓冲存取操作。
2.根据权利要求I所述一种直播流的快速缓冲方法,其特征在于所述数组是指针数组,数组长度根据所需的缓冲队列大小确定。
3.根据权利要求2所述一种直播流的快速缓冲方法,其特征在于所述缓冲队列大小根据设定时长以及视频帧率确定。
4.根据权利要求I或2所述一种直播流的快速缓冲方法,其特征在于所述数组的基础单元包括数据标识序列号、时间戳和一个指向实际流媒体数据的指针。
全文摘要
本发明公开了一种直播流的快速缓冲方法,它采用非循环的队列形式构建循环队列,利用定点存取的方式进行缓冲存取处理,即采用数组的方式构建循环缓冲队列,利用连续seq为基点快速定位数据存放位置,使循环缓冲队列的连续查找时间复杂度降为O(1)。在实现了快速缓冲的同时,有效地减少了服务的性能开销。步骤包括在移动流媒体系统中设置直播流缓冲池,对流媒体数据进行缓冲,以供移动终端平滑播放直播流;采用数组的方式构建循环缓冲队列,以连续的数据标识序列号(Seq)作为基点来定位数据存放位置。
文档编号H04N21/433GK102752193SQ20121016697
公开日2012年10月24日 申请日期2012年5月23日 优先权日2012年5月23日
发明者羊君 申请人:杭州斯凯网络科技有限公司