一种基于p2p技术实现准实时网络视频的方法
技术领域
本发明属于p2p网络流媒体领域,特别是准实时网络视频领域。
背景技术
近几年来,p2p(peer-to_peer)技术得到了广泛的关注和发展。利用p2p技术来下载文件已经相对成熟,BT、eMule等成为人们常用的下载软件。随着流媒体和网络技术的快速发展,通过互联网传输多媒体特别是实时视频流越来越受到关注。但由于通过互联网传输多媒体需要占用很大的网络带宽,传统的C/S架构采用服务器转发模式,服务器有限的带宽和处理能力,已经很难支持大规模用户应用。P2P技术有效地解决了这一难题,每个用户在下载观看流媒体的同时,向其他用户上传自己拥有的资源,有效地利用了每个用户的带宽和处理能力,将对服务器的带宽和处理能力要求有效地分布到每个节点上。
目前的p2p流媒体系统大多数采用基于gossip协议的网状拓扑结构,节点加入系统时,从服务器或其他节点获取观看同一视频的伙伴节点,然后在伙伴节点间周期性发送缓冲区映射,采用一定的调度方法通过“推”或者“拉”的方式从其伙伴节点获得数据块放入到本地数据缓冲区之中。这种结构的特点是客户端需要较长的缓冲时间,也就是在客户端开启较大的缓冲区缓冲足够的视频数据来达到视频播放初期的流畅性,同时缓冲足够的视频来提供给其他节点。由于这些特点导致用p2p流媒体系统传输实时视频流会有很大的延时,同时为了适应网络波动提高视频质量,在缺少数据时会造成视频停顿。
利用p2p技术来传输所谓“准实时视频”是指客户端的视频相对于视频源的延时在固定范围之内,并且节点之间或节点和视频源之间利用p2p技术来相互传输数据。这种系统的特点是,由于视频的无边界性,不能在客户端开辟固定长度的缓冲区来缓冲整个视频;同时又要缓冲一段时间的当前视频来实现p2p传输,即从其他节点来拉取视频流和提供给其他节点视频资源,这个缓冲区缓冲的视频必须是随时间向前移动;由于对视频有一定的实时性要求,当网络质量差发生数据不全时客户端不能停顿等待数据收满。
发明内容
针对上述特点本发明主要提供一种基于p2p技术实现准实时网络视频的方法。本发明能够根据网络状况自动调整视频质量;在系统节点间实现负载均衡;同时做到客户端相对视频源延时在固定范围之内。
本发明包括节点本地缓冲区的构建和更新、节点间数据的p2p传输调度并实现负载均衡。
对系统作如下假设:
(1)系统以每帧视频为一个基本的调度数据块,为每块数据加上序列号,节点和监控视频源本地都维护一个固定时间长度的缓冲区,缓冲当前时间之前的固定时间的视频数据;假设视频源本地记录maxbufseq_source到minbufseq_source的数据,观看节点i本地记录maxbufseq[i]到minbufseq[i]的数据。
(2)假设整个系统的帧率为f/s,伙伴节点之间周期性交换缓冲区映射,节点记录并周期更新和伙伴节点的数据交换情况。了
(3)为了让节点根据网络状况自动调整视频质量,采用udp和tcp结合方式从伙伴节点拉取数据,伙伴节点间交换的数据块中附带自己的本地缓冲区边界,即minbufseq和maxbufseq。
节点本地缓冲区的构建和更新:
(1)视频源周期性(ts即tf帧)记录一个当前帧序号periodseq。
(2)当某节点i要观看该视频时,首先请求目标视频源的periodseq、当前帧序号maxbufseq_source、帧率f,节点i将periodseq作为本节点的缓冲区起始帧。并每隔1/fs自动将缓冲区向前移动一帧,即minbufseq+1->minbufseq,maxbufseq+1->maxbufseq;由于节点加入时间的随机性,所有节点相对视频源的延时范围为0<=maxbufseq_source-periodseq<=tf,延时随机分布且相互交错开。
(3)节点每1/fs将本地缓冲区向前移动一帧。
(4)节点通过和伙伴节点的交互数据中附带的信息来调整自己的缓冲区移动速度。
本发明还提供一种准实时视频系统的调度方法,步骤如下:
(1)节点i从服务器获取伙伴节点列表,从中选择一个伙伴节点,在本节点和其他伙伴节点建立通道之前,首先通过服务器从选择的伙伴节点中转一帧最实时的关键帧,直接解码播放出来,作为初始画面。
(2)节点i每1/fs检查maxbufseq之前mf的数据完整情况,缺少的数据从maxbufseq-maxbufseq[i]最小且maxbufseq>maxbufseq[i]的节点拉取;所有节点间会构成一定的拓扑,可有效做到负载均衡。
(3)节点i每1/fs查看缓冲区中maxbufseq-mf到minbufseq+nf(n为临近播放的时间阈值)的缺少情况,从拥有该帧数据的伙伴节点中选取一个,从伙伴节点拉取缺少的数据块。
(4)节点检查当前缓冲区临近播放的ns内的关键帧的缺少情况,然后从拥有该数据块的伙伴节点中选择一个,通过服务器或其他伙伴节点tcp中转的方式拉取缺少的关键帧。
(5)转至步骤(2)开始下一次调度。
所述步骤(2)中从伙伴节点拉取当前增加帧,其具体步骤如下:
(a)为了负载均衡,从缓冲maxbufseq和自己最接近并大于自己的伙伴节点j作为拉取对象。
(b)检查maxbufseq到maxbufseq-mf帧间的数据节点j的拥有情况。如果有从该节点拉取,并记录已经拉取过,下次调度不再拉取。如果有局域网内节点拥有该数据块,直接向该节点发送拉取数据请求,记录并更新该数据块从该伙伴节点的拉取次数。
所述步骤(3)具体步骤如下:
(a)从maxbufseq-mf开始至minbufseq+nf依次检查本地缓冲区中每帧数据的缺少情况,当检查到某一数据块缺少时,开始步骤b,否则开始下一数据块的检查。
(b)根据伙伴节点的buffermap,检查能够直接建立数据通道的伙伴节点中哪些节点拥有该数据块,如果拥有该数据块的伙伴节点个数为1,直接向该节点发送拉取数据请求,记录并更新该数据块从该伙伴节点的拉取次数。
(c)如果个数大于1,检查有没有同属一个公网IP且能够建立数据通道的节点。如果有,向该节点发送拉取数据请求,记录并更新该数据块从该伙伴节点的拉取次数,开始下一块数据的检查。
(d)从拥有该数据的伙伴节点中,选取一个拉取次数最少的节点拉取数据。
所述步骤(4)中从伙伴节点拉取临近播放关键帧,其具体步骤如下:
(a)节点从minbufseq到minbufseq+n f依次检查本地缓冲区中关键帧的数据完整情况,若发现某关键帧缺少数据,开始步骤b,否则继续检查下一关键帧。
(b)根据伙伴节点的buffermap,检查伙伴节点中拥有该数据块的情况。首先从拥有该数据块的伙伴节点中选择一个直接建立数据通道的伙伴节点,拉取缺少的数据。
(c)如果所有拥有该数据块的伙伴节点都不能建立数据通道,通过服务器或者伙伴节点中转的方式获取该缺少的关键帧数据块。
(d)当临近播放的关键帧缺少数据数超过一定阈值时,停止上述步骤(4)和(5)。
当所述节点收到数据后,具体操作步骤如下:
(a)为了让节点本地缓冲区自增速度随伙伴节点自适应调整。节点初次收到伙伴节点的数据时,根据数据中附带的maxbufseq,记录和本地maxbufseq的差距basemargeseq,并以此作为参照,调整本地缓冲区的移动速度。
(b)本节点从其他伙伴节点i处收到数据后,根据数据块的帧序号判断是否已经过时(即判断是否小于minbufseq),如果没有过时将数据放入缓冲区中,并更新数据块拉取记录。
为了适应节点的网络异构性,节点根据帧率,周期性从本地缓冲区中取出minbufseq,判断该帧的完整性,如果前一关键帧直至本帧数据都完整,则播放之,否则丢弃该帧,直至检查到完整的关键帧。
本发明采用的方法能够解决以下问题,并具有如下优点:
1)提供一种基于p2p技术实现准实时网络视频的方法,本发明能够适应网络或节点的异构性,采用对缓冲区分区段区别调度的方法,在网络带宽不足时优先保证关键帧的传输,自动调整自己的视频质量。
2)本发明中所有节点相对于视频源的延时都可以控制在一定的范围之内,实现所谓的准实时效应。节点自动移动自己的本地缓冲区,并通过伙伴节点间的交换数据中附带的缓冲区边界来调整自己的缓冲区移动速度,加强整个系统的自适应性能。
3)本发明记录伙伴节点的数据交换情况,在拉取数据时能够做到负载均衡,同时能够尽量利用各个节点的带宽能力。
4)本发明通过和伙伴节点建立通道前,先通过服务器中转一帧最新数据的方式,来增加初始画面的显示,在节点观看视频请求后,很快的显示出初始画面,提高用户的体验度。
附图说明
图1为本发明的节点缓冲区构建及更新示意图。
图2为本发明的节点加入系统及整体的调度方法流程图。
图3为本发明的节点拉取增长帧数据的调度方法流程图。
图4为本发明的节点检查缺包的调度方法流程图。
图5为本发明的节点保证关键帧完整性的调度方法流程图。
具体实施方式
下面以具体实施例对本发明作进一步的阐述,但实施例仅用于说明,并不限制发明的范围。
下面结合附图对本发明的方法和系统作详细描述:
实施例1
首先设定系统的几个如下参数:
1)minbufseq_src视频源本地缓存数据的最小帧序号,即最后端边界。
2)maxbufseq_src视频源本地缓存数据的最大帧序号,即最前端边界。该参数同时为视频源的当前帧序号。
3)periodseq视频源周期性记录的当前帧序号。
4)minbufseq[i]节点i本地缓存数据的最小帧序号。
5)maxbufseq[i]节点i本地缓存数据的最小帧序号。
6)整个系统的视频帧率为f/s。
7)partnerset伙伴节点集。
8)checkseqnum为当前检查的数据块序列号。
下面结合图1来说明节点的缓冲区的构建和更新方法:
s100为某个p2p视频系统的时间线,s110为视频源的周期性记录的帧序号。节点a、b、c分别在某时刻开始观看视频。a在s120、b在s130、c在s140时刻加入该p2p视频系统。节点a、b、c相对于视频源的延时为s120-nT、s130-nT、s140-nT。其值在0至T范围内。
s150至s180为某时刻视频源、a、b、c的本地缓冲区的边界。根据这个边界差,本发明在调度方法中第一步调度时采取视频源->c->a->b的视频流向。有效地起到了负载均衡。
s190为节点的本地缓冲区更新示意图,节点每1/fs将缓冲区向前移动一帧。即maxbufseq+1->maxbufseq,minbufseq+1->minbufseq。并根据伙伴节点间的交互信息来自适应调整自己的缓冲区移动速度。
如图2所示,节点i观看视频的步骤为:
首先视频源s周期性记录当前帧序号periodseq。
在步骤s200中,节点i通过服务器获取视频源s的maxbufseq_src,minbufseq_src和periodseq。同时令maxbufseq[i]=periodseq,minbufseq=periodseq,本地缓冲区最大帧边界maxbufseq相对于视频源最大帧边界maxbufseq_src的差值为maxbufseq_src-periodseq。
在步骤s210中,节点i通过服务器获取初始伙伴节点集partnerset[i],然后随机选择一个伙伴节点p,通过服务器中转p的缓冲区中最大的关键帧至本节点,本节点收到之后,直接解码播放出初始画面。
在步骤s220中,节点i开始周期性调度,每1/fs调度一次,首先将缓冲区前移一帧即maxbufseq=maxbufseq+1,minbufseq=minbufseq+1。
在步骤s230中,对maxbufseq数据块进行调度,给予其ms的调度时间。第三步对minbufseq+nf至maxbufseq-mf中丢失的数据进行调度重传。
在步骤s240中,对minbufseq至minbufseq+mf中不完整的关键帧进行调度重传。
在步骤s220中,节点i对maxbufseq的调度步骤为:
步骤s300:节点i将缓冲区前移一帧,即maxbufseq=maxbufseq+1,检查partnerset中拥有maxbufseq的节点集合partnerset2中,是否有位于同一公网IP之后的节点,如果有,向该节点发送拉数据请求。本步骤目的是为节省节点i的带宽,位于同一公网IP之后的节点间互传数据,就不会占用节点i的公网带宽。
步骤s310:根据伙伴节点的buffermap,判断拥有该数据的伙伴节点的个数是否为1。
步骤s320:如果只有1个伙伴节点拥有该数据,直接向该节点请求数据。
步骤s320:为整个系统的负载均衡考虑,节点i从partnerset2中选择maxbufseq>=maxbufseq[i],且maxbufseq-maxbufseq[i]最小的伙伴节点,向该节点拉取数据。
如图4所示,步骤s230中,节点i对maxbufseq-mf至maxbufseq的调度步骤为:
步骤s400:初始化checkseqnum=maxbufseq-mf。
步骤s420:检查checkseqnum数据块的完整性,如果完整转至s410。
步骤s430:检查拥有该数据块的伙伴节点集partnerset2中,是否有位于同一公网IP之后的节点,如果有,向该节点发送拉数据请求(步骤s440),转至步骤s410。
步骤s450:从partnerset2中选取拉取次数最少的伙伴节点p,拉取缺少的数据块seqnum。
步骤s410:checkseqnum=checkseqnum+1,转至s450,开始下一块数据检查。
如图5所示,步骤s240中,节点i对minbufseq至minbufseq+nf之间关键帧的调度步骤为:
步骤s500:初始化checkseqnum=minbufseq。
步骤s510:判断checkseqnum是否为关键帧,如果不是关键帧转至s520。
步骤s530:如果为关键帧,检查得到拥有该数据块的伙伴节点集partnerSet2。通过服务器或则伙伴节点中转的方式获取该数据块checkseqnum。
步骤s520:checkseqnum=checkseqnum+1,转至s510。