一种基于环形缓冲的实时流媒体多路转发方法技术

技术编号:14943718 阅读:63 留言:0更新日期:2017-04-01 10:08
本发明专利技术公开了一种基于环形缓冲区的实时流媒体多路转发控制方法,该方法包括:1)在服务器端和客户端分别建立环形缓冲及多线程并发的框架结构;2)当客户端要查看视频采样设备的视频时,客户端向服务器端发请求视频的消息;3)服务器端接到消息后向NVR请求视频,由主线程接收NVR发来的视频流,挂接到环形缓冲上,由视频流通道对应子线程向客户端发送视频流;4)客户端主线程接收到视频流后挂接到环形缓冲上,由对应的子线程播放到对应的窗口上。通过改进算法,可优化系统,减少系统资源浪费,提高系统综合性能,改善用户的实时性体验。

【技术实现步骤摘要】

本专利技术涉及实时视频流媒体多路转发软件,具体涉及一种基于环形缓冲区管理视频数据包的实时流媒体多路转发控制方法,属于实时流媒体软件领域。
技术介绍
流媒体是指在网络上以流式传输方式传送的视频数据,传输的视频数据采用编码压缩以便减少传输的数据量,目前采用以H.264编码标准进行压缩,用户通过解码设备解码压缩的数据流即可播放视频。实时流式传输是流媒体中的一种传输方式,主要是保证传输的流媒体数据与网络传输性能相匹配,使用户体验实时性能为主旨,更强调实时性。实时流式传输需要专用的流媒体服务器与传输协议,专用的流媒体服务器有QuickTimeStreamingServer、WindowsMediaServer等;专用的传输协议有RTSP(Real-timeStreamingProtocol)或MMS(MicrosoftMediaServer)等。流媒体在网络上以包传输方式进行断续传输,其中TCP协议是可保证包顺序的可靠传输,对于连续的流媒体视频数据流,简单采用TCP协议即可保证其顺序性。由于网络是动态变化的,而采集得到的视频流数据是连续的均速获取的,必须保证二者的速度匹配以达到实时预览效果。用户要控制视频采样设备时,需要实时反馈控制后的视频图像,因此也要求控制的实时性能。H.264编码标准是目前普遍应用于视频压缩领域的编码标准,是适合实时视频通信的编码规范,其以高压缩高质量和支持多种网络流媒体为主要特征。在H.264协议里定义了三种帧,完整编码的帧叫I帧,参考之前的I帧生成的只包含差异部分编码的帧叫P帧,还有一种参考前后帧编码的帧叫B帧。IDR帧是即时解码刷新帧,是I帧中的一种,为区分首个I帧和其他I帧,把第一个I帧定义为IDR帧。IDR帧的作用是立刻刷新,使错误不致传播,播放器收到IDR帧则立刻播放IDR帧,抛弃IDR帧之前所有的历史帧。本专利技术公开了一种基于环形缓冲区的实时流媒体多路转发控制方法,服务器端与客户端各自采用多线程并发及缓冲技术改进转发视频的实时性能,改进服务器端和客户端的接收和发送效率。主要包括:(1)在服务器端和客户端分别建立环形缓冲及多线程并发的框架结构;(2)当客户端的用户要求查看某路视频采样设备ID的视频时,客户端向服务器端发请求视频的消息;(3)服务器端接到请求视频消息后,向NVR请求视频,由主线程接收NVR发来的视频流,挂接到环形缓冲上,由视频流通道对应的子线程向客户端发送视频流;(4)客户端的主线程接收到视频流后,挂接到环形缓冲上,由视频流通道对应的子线程播放到对应的窗口上。通过改进算法,可优化系统,减少系统资源浪费,提高系统综合性能,改善用户的实时性体验。
技术实现思路
本专利技术的目的在于实现一种基于H.264编码的实时流媒体多路转发控制方法,客户端申请实时视频后以最小延时播放视频;客户端云控视频采样设备后,使客户端以最小延时代价播放云控后的视频画面,从而改善用户实时性体验。具体来说,本专利技术的方法包括下列内容:A.在服务器端和客户端分别建立基于环形缓冲区的多线程并发的框架结构,具体实现步骤如下:A1.服务器端为每个通道创建一个环形缓冲区和一个子线程,每个通道对应于一路视频采样设备;A1.1所述的环形缓冲区由一个环形数组和若干个视频数据缓冲区组成,数组的每个节点指向从NVR接收到的视频数据缓冲区(VideoDataBuffer,简称VDB);A1.2环形缓冲区包含但不限于以下成员:-视频流头指针head,指向要转发的一个视频数据缓冲区,初值为-1;-视频流尾指针tail,指向从视频采样设备上新获取的一个视频数据缓冲区,初值为-1;-未来IDR帧指针FutureIDR,指向未来要转发的关键帧的视频数据缓冲区,初值为-1;-已转发IDR帧指针LastIDR,指向已转发的关键帧的视频数据缓冲区,初值为-1;-当前正在转发的数据帧nCurP,指向当前正在转发的视频数据缓冲区,初值为-1;A1.3所述的视频数据缓冲区包含但不限于以下成员:-通道号nID,视频采样设备的编号;-关键帧标志nIDR,表示是否为关键帧,1为关键帧,0为非关键帧;A1.4服务器端的主线程负责将从NVR收到的VDB放到通道号对应的环形缓冲区上;每个通道对应子线程负责从环形缓冲区摘取视频数据缓冲区,并将视频数据缓冲区发送给客户端;A1.5每个通道有一个端口号数组,及对应的转发标志位SocFlag数组;端口号数组的每个单元里保存一个客户端的socket,转发标志位SocFlag数组的每个单元与端口号数组里的每个单元对应,表示该是否给该客户端转发视频;-1表示不转发,并删除客户端对应的socket;0表示转发;1表示暂停,用于轮巡;A2.与服务器端类似,客户端为每个通道创建一个环形缓冲区和一个子线程;A2.1环形缓冲区和视频数据缓冲区的结构与服务器端类似;A2.2客户端的主线程负责将从服务器端收到的VDB放到通道号对应的环形缓冲区上;每个通道对应的子线程负责从环形缓冲区摘取视频数据缓冲区,并进行播放;A2.3每个通道有一个窗口号数组,记录需要播放视频的窗口号nPort,用以支持在多个窗口播放同一路视频;B.当客户端的用户要求查看某路视频采样设备的视频时,客户端向服务器端发请求视频的消息,具体步骤如下:B1.当客户端的用户要求在某个窗口上查看某路视频采样设备的视频时,客户端查看本地是否有所要求的视频采样设备对应的通道及其环形缓冲区;B2.如果没有,则向服务器端发送请求视频流的消息;如果有,则不发送视频请求,而是将新窗口号加入该通道的窗口号数组;C.服务器端接到请求视频消息后,转发所要求的视频数据给该客户端;具体实现步骤如下:C1.服务器端接到请求视频消息后,检查本地是否有客户端所要求的通道及其环形缓冲区,-如果没有,则为该视频采样设备建立相应的通道并启动一个子线程;然后向NVR发送请求视频流的消息;-如果有,将客户端的socket加入到该通道的端口号数组里,并将SocFlag标志置为-1;C2.服务器的主线程接收到NVR发来的视频数据,将其挂接到环形缓冲区上,具体步骤如下:C2.1如果系统初次接收到视频数据,则将head和tail都置为0,并将视频数据缓冲区挂接到tail所指的数组单元上;C2.2否则,将tail加1,进行下述处理:C2.2.1如果环形缓冲区不满,则清除tail所指的视频数据缓冲,并将新接收的视频数据缓冲区挂接到tail所指的数组单元上;C2.2.2如果环形缓冲区满,则进行下述处理:-如果tail等于LastIDR,则将LastIDR置为-1;-如果tail等于head,并且FutureIDR不为-1,则将head置为FutureIDR;-清除tail所指的视频数据缓冲,将新接收的视频数据缓冲区挂接到tail所指的数组单元上;C2.3如果新加的数据帧为关键帧,将tail的值赋给FutureIDR;C3.服务器上该通道的子线程执行一个永真循环,从环形缓冲区上取视频数据缓冲区,发送给对应的客户端;具体实现步骤如下:C3.1子线程将head指针的值赋给nCurP;C3.2如果nCurP为-1或者等于tail(表示环形缓冲区上没有可以发送的视频数据缓冲区),则子线程睡眠100秒之后,重新开始循环;C3.3如果该通本文档来自技高网
...
一种<a href="http://www.xjishu.com/zhuanli/62/201611033866.html" title="一种基于环形缓冲的实时流媒体多路转发方法原文来自X技术">基于环形缓冲的实时流媒体多路转发方法</a>

【技术保护点】
一种基于环形缓冲的实时流媒体多路转发方法,其步骤包括:A.在服务器端和客户端分别建立基于环形缓冲区的多线程并发的框架结构,具体实现步骤如下:A1.服务器端为每个通道创建一个环形缓冲区和一个子线程,每个通道对应于一路视频采样设备;A1.1所述的环形缓冲区由一个环形数组和若干个视频数据缓冲区组成,数组的每个节点指向从NVR接收到的视频数据缓冲区;A1.2环形缓冲区包含但不限于以下成员:‑视频流头指针head,指向要转发的一个视频数据缓冲区,初值为‑1;‑视频流尾指针tail,指向从视频采样设备上新获取的一个视频数据缓冲区,初值为‑1;‑未来IDR帧指针FutureIDR,指向未来要转发的关键帧的视频数据缓冲区,初值为‑1;‑已转发IDR帧指针LastIDR,指向已转发的关键帧的视频数据缓冲区,初值为‑1;‑当前正在转发的数据帧nCurP,指向当前正在转发的视频数据缓冲区,初值为‑1;A1.3所述的视频数据缓冲区包含但不限于以下成员:‑通道号nID,视频采样设备的编号;‑关键帧标志nIDR,表示是否为关键帧,1为关键帧,0为非关键帧;A1.4服务器端的主线程负责将从NVR收到的VDB放到通道号对应的环形缓冲区上;每个通道对应子线程负责从环形缓冲区摘取视频数据缓冲区,并将视频数据缓冲区发送给客户端;A1.5每个通道有一个端口号数组,及对应的转发标志位SocFlag数组;端口号数组的每个单元里保存一个客户端的socket,转发标志位SocFlag数组的每个单元与端口号数组里的每个单元对应,表示该是否给该客户端转发视频;‑1表示不转发,并删除客户端对应的socket;0表示转发;1表示暂停,用于轮巡;A2.与服务器端类似,客户端为每个通道创建一个环形缓冲区和一个子线程;A2.1环形缓冲区和视频数据缓冲区的结构与服务器端类似;A2.2客户端的主线程负责将从服务器端收到的VDB放到通道号对应的环形缓冲区上;每个通道对应的子线程负责从环形缓冲区摘取视频数据缓冲区,并进行播放;A2.3每个通道有一个窗口号数组,记录需要播放视频的窗口号nPort,用以支持在多个窗口播放同一路视频;B.当客户端的用户要求查看某路视频采样设备的视频时,客户端向服务器端发请求视频的消息,具体步骤如下:B1.当客户端的用户要求在某个窗口上查看某路视频采样设备的视频时,客户端查看本地是否有所要求的视频采样设备对应的通道及其环形缓冲区;B2.如果没有,则向服务器端发送请求视频流的消息;如果有,则不发送视频请求,而是将新窗口号加入该通道的窗口号数组;C.服务器端接到请求视频消息后,转发所要求的视频数据给该客户端;具体实现步骤如下:C1.服务器端接到请求视频消息后,检查本地是否有客户端所要求的通道及其环形缓冲区,‑如果没有,则为该视频采样设备建立相应的通道并启动一个子线程;然后向NVR发送请求视频流的消息;‑如果有,将客户端的socket加入到该通道的端口号数组里,并将SocFlag标志置为‑1;C2.服务器的主线程接收到NVR发来的视频数据,将其挂接到环形缓冲区上,具体步骤如下:C2.1如果系统初次接收到视频数据,则将head和tail都置为0,并将视频数据缓冲区挂接到tail所指的数组单元上;C2.2否则,将tail加1,进行下述处理:C2.2.1如果环形缓冲区不满,则清除tail所指的视频数据缓冲,并将新接收的视频数据缓冲区挂接到tail所指的数组单元上;C2.2.2如果环形缓冲区满,则进行下述处理:‑如果tail等于LastIDR,则将LastIDR置为‑1;‑如果tail等于head,并且FutureIDR不为‑1,则将head置为FutureIDR;‑清除tail所指的视频数据缓冲,将新接收的视频数据缓冲区挂接到tail所指的数组单元上;C2.3如果新加的数据帧为关键帧,将tail的值赋给FutureIDR;C3.服务器上该通道的子线程执行一个永真循环,从环形缓冲区上取视频数据缓冲区,发送给对应的客户端;具体实现步骤如下:C3.1子线程将head指针的值赋给nCurP;C3.2如果nCurP为‑1或者等于tail(表示环形缓冲区上没有可以发送的视频数据缓冲区),则子线程睡眠100秒之后,重新开始循环;C3.3如果该通道有可发送的视频数据缓冲区,则子线程将nCurP所指的视频数据缓冲区发送给各个客户端,具体实施步骤如下:C3.3.1如果某个客户端的转发标志位SocFlag值为‑1,则不转发给该客户端,并断开与该客户端的网络连接;C3.3.2如果SocFlag值为0,则转发给对应的客户端;C3.4如果该转发的视频数据为关键帧,则将nCurP的值赋给LastIDR;如果nCurP与FutureIDR相等,则将FutureIDR置为‑1;C3.5如果head的值没有被主线程改...

【技术特征摘要】
1.一种基于环形缓冲的实时流媒体多路转发方法,其步骤包括:A.在服务器端和客户端分别建立基于环形缓冲区的多线程并发的框架结构,具体实现步骤如下:A1.服务器端为每个通道创建一个环形缓冲区和一个子线程,每个通道对应于一路视频采样设备;A1.1所述的环形缓冲区由一个环形数组和若干个视频数据缓冲区组成,数组的每个节点指向从NVR接收到的视频数据缓冲区;A1.2环形缓冲区包含但不限于以下成员:-视频流头指针head,指向要转发的一个视频数据缓冲区,初值为-1;-视频流尾指针tail,指向从视频采样设备上新获取的一个视频数据缓冲区,初值为-1;-未来IDR帧指针FutureIDR,指向未来要转发的关键帧的视频数据缓冲区,初值为-1;-已转发IDR帧指针LastIDR,指向已转发的关键帧的视频数据缓冲区,初值为-1;-当前正在转发的数据帧nCurP,指向当前正在转发的视频数据缓冲区,初值为-1;A1.3所述的视频数据缓冲区包含但不限于以下成员:-通道号nID,视频采样设备的编号;-关键帧标志nIDR,表示是否为关键帧,1为关键帧,0为非关键帧;A1.4服务器端的主线程负责将从NVR收到的VDB放到通道号对应的环形缓冲区上;每个通道对应子线程负责从环形缓冲区摘取视频数据缓冲区,并将视频数据缓冲区发送给客户端;A1.5每个通道有一个端口号数组,及对应的转发标志位SocFlag数组;端口号数组的每个单元里保存一个客户端的socket,转发标志位SocFlag数组的每个单元与端口号数组里的每个单元对应,表示该是否给该客户端转发视频;-1表示不转发,并删除客户端对应的socket;0表示转发;1表示暂停,用于轮巡;A2.与服务器端类似,客户端为每个通道创建一个环形缓冲区和一个子线程;A2.1环形缓冲区和视频数据缓冲区的结构与服务器端类似;A2.2客户端的主线程负责将从服务器端收到的VDB放到通道号对应的环形缓冲区上;每个通道对应的子线程负责从环形缓冲区摘取视频数据缓冲区,并进行播放;A2.3每个通道有一个窗口号数组,记录需要播放视频的窗口号nPort,用以支持在多个窗口播放同一路视频;B.当客户端的用户要求查看某路视频采样设备的视频时,客户端向服务器端发请求视频的消息,具体步骤如下:B1.当客户端的用户要求在某个窗口上查看某路视频采样设备的视频时,客户端查看本地是否有所要求的视频采样设备对应的通道及其环形缓冲区;B2.如果没有,则向服务器端发送请求视频流的消息;如果有,则不发送视频请求,而是将新窗口号加入该通道的窗口号数组;C.服务器端接到请求视频消息后,转发所要求的视频数据给该客户端;具体实现步骤如下:C1.服务器端接到请求视频消息后,检查本地是否有客户端所要求的通道及其环形缓冲区,-如果没有,则为该视频采样设备建立相应的通道并启...

【专利技术属性】
技术研发人员:赵霞崔迎宝刘迎管文华赵梦瑶赵松陈晨王宸禹王雪
申请(专利权)人:北京工商大学
类型:发明
国别省市:北京;11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1