一种实时视频流缓冲的控制方法
技术领域
本发明属于视频处理技术领域,尤其是一种实时视频流缓冲的控制方法。
背景技术
未来监控系统发展的总体方向是:数字化、智能化、自动化、网络化,其中的网络化是监控系统的大势所趋,它大大地简化并提高了信息传递的方式和速度。随着网络技术和计算机技术的不断发展以及市场应用环境的逐步成熟,基于视频交换技术的网络视频监控系统已经成为监控系统发展方向。
网络摄像机集成了普通摄像机和网络转换器,其将图像转换为基于TCP/IP网络标准的数据包,使摄像机所摄的画面通过RJ-45以太网接口或WIFI WLAN无线接口直接传送到网络上,通过网络即可远端监视画面。虽然网络摄像机在视频图像传输、安装调试和后期维护上优于传统的摄像机,但目前其仍受网络带宽的因素影响,如网络速度较慢时,视频图像数据的传输会产生延时,甚至会发生卡停,就不能得到较流畅的视频图像,给后端实时网络视频预览的客户带来视频不流畅的体验。因此,如何对视频流存储视频缓冲区的视频存储和播放进行有效控制以获得流畅的视频图像是目前迫切需要解决的问题。
发明内容
本发明的目的在于克服现有技术的不足,提供一种实时视频流缓冲的控制方法,通过在计算机终端上设置视频缓冲区及控制视频缓冲区的存储和播放,解决网络拥堵时的视频图像预览不流畅的问题。
本发明解决其技术问题是采取以下技术方案实现的:
一种实时视频流缓冲的控制方法,包括以下步骤:
步骤1、初始化视频缓冲池并清空;
步骤2、判断视频缓冲线程退出标志位,如果为真,则退出此线程,否则执行步骤3;
步骤3、更新视频缓冲区的状态,然后根据视频缓冲区的状态对视频缓冲区 中的数据分别进行处理;所述步骤3的处理过程为:
步骤301、分析当前视频缓冲区的大小和要设置的视频缓冲区大小的差距,将视频缓冲区的状态分别设置为零状态、增加状态、减少状态或同步状态;
步骤302、判断当前视频缓冲区的状态是否是零状态,是则执行步骤303,否则执行步骤304;
步骤303、零状态处理过程;
步骤304、判断当前视频缓冲区的状态是否为增加状态,是则执行步骤305,否则执行步骤306;
步骤305、增加状态处理过程;
步骤306、判断当前视频缓冲区的状态是否是减少状态,是则执行步骤307,否则执行步骤308;
步骤307、减少状态处理过程;
步骤308、判断当前视频缓冲区的状态是否是同步状态,是则执行步骤309,否则返回,执行步骤2;
步骤309、同步状态处理过程。
而且,所述步骤301的处理过程包括以下步骤:
步骤30101、判断要设置的视频缓冲区大小不为当前视频缓冲区大小并且判断当前的状态是否为同步状态,是则执行步骤30102,否则执行步骤302;
步骤30102、判断要设置的视频缓冲区大小是否小于1,是则执行步骤30103,否则执行步骤30104;
步骤30103、将当前视频缓冲区的大小设置为1;
步骤30104、判断当前视频缓冲区大小是否小于要设置的视频缓冲区大小,是则执行步骤30105,否则执行步骤30106;
步骤30105、设置当前视频缓冲区的状态为增加状态,执行步骤30107;
步骤30106、设置当前缓冲区的状态为减少状态;
步骤30107、将当前视频缓冲区大小设置为要设置的视频缓冲区大小。
而且,所述步骤303的处理过程包括以下步骤:
步骤30301、销毁视频播放相关资源;
步骤30302、等待数据到来并填充视频缓冲区,若等待超时则直接返回步骤2,否则执行步骤30303;
步骤30303、将当前视频缓冲区的状态设置为增加状态后返回步骤2。
而且,所述步骤305的处理过程包括以下步骤:
步骤30501、等待数据到来并填充视频缓冲区,若等待超时则直接返回步骤2;
步骤30502、判断当前视频缓冲区的容量大小是否超过或者等于了当前视频缓冲区大小,是则将当前视频缓冲区的状态设置为同步状态返回步骤2,否则直接返回步骤2。
而且,所述步骤307的处理过程包括以下步骤:
步骤30701、判断当前视频缓冲区的容量大小是否小于或者等于了当前视频缓冲区大小,是则执行将当前视频缓冲区的状态设置为同步状态后返回执行步骤2,否则执行步骤30703;
步骤30703、根据时间戳快速播放视频,直到当前视频缓冲区的容量大小小于或者等于了当前视频缓冲区大小;
步骤30704、将当前视频缓冲区的状态设置为同步状态,返回步骤2。
而且,所述步骤309的处理过程包括以下步骤:
步骤30901、判断当前视频缓冲区的大小是否为零,是则执行步骤30902,否则执行步骤30903;
步骤30902、设置当前视频缓冲区的状态为零状态,或者调用播放类的刷新界面函数使得播放画面不闪烁,返回步骤2;
步骤30903、取出FIFO中最初的数据;
步骤30904、若当前视频缓冲区大小为1,是则执行步骤30905,否则执行步骤30906;
步骤30905、直接播放本帧视频,并等待下一帧数据的到来,返回步骤2;否则执行步骤30907;
步骤30906、判断当前视频缓冲区大小比视频缓冲区的大小过大或者过小,是则执行步骤30907,否则执行步骤30908;
步骤30907、相应调整播放速率播放所取出的数据,返回步骤2;
步骤30908、按时间戳正常播放所取出的数据,返回步骤2。
而且,所述的视频缓冲区为所有形式的缓冲队列。
而且,所述的缓冲区队列为FIFO的缓冲队列。
而且,所述的视频缓冲池为Vector容器,或者为Deque容器。
本发明的优点和积极效果是:
本发明设计合理,其采用在计算机终端上先缓存一部分视频图像数据(当然是在用户的对延时容忍限度之内),这样在正常的情况下,视频图像流畅显示,当网络有比较短时间拥堵的时候,计算机终端亦可以继续播放缓存中的数据,用户观看的视频依然是流畅的,当网络不在拥堵时,计算机终端的缓冲就会再一次填充到先前的状态,这样周而复始的运行,就可以在网络拥堵时保证客户依然观看到流畅的视频图像,本方法科学合理的解决了解决网络拥堵时的视频图像预览不流畅的问题,大大提高了网络监控系统的性能和用户体验。
附图说明
图1为本发明的处理流程图;
图2为本发明的步骤3的处理流程图;
图3为本发明的步骤301的处理流程图;
图4为本发明的步骤303的处理流程图;
图5为本发明的步骤305的处理流程图;
图6为本发明的步骤307的处理流程图;
图7为本发明的步骤309的处理流程图。
具体实施方式
以下结合附图对本发明做进一步详述。
一种实时视频流缓冲的控制方法,如图1所示,包括以下步骤:
步骤1、初始化视频缓冲池并清空。
本发明采用的视频缓冲池可以是Vector容器,也可以是Deque容器,视频缓冲区为所有形式的缓冲队列,本实施例以先入先出(FIFO)的缓冲队列进行说明,视频缓冲区中保存在是每一帧的视频信息。
步骤2、判断视频缓冲线程退出标志位,如果为真,则退出此线程,否则执行步骤3。
步骤3、更新视频缓冲区的状态,然后根据视频缓冲区的状态对视频缓冲区中的数据分别进行处理。
在本步骤中设置视频缓冲区的状态的依据是:统计当前视频缓冲区的大小和要设置的视频缓冲区大小的差距,根据此差值设置当前视频缓冲区的状态。视频缓冲区的状态包括:零状态、增加状态、减少状态和同步状态,对视频缓冲区中的数据处理也是分四种状态分别进行处理。对视频缓冲区中的数据处理不仅仅是实现视频的快慢放,同时也需要同步机制去控制视频的接收和播放此同步机制亦可是消息同步机制,例如在Windows中有信号量,互斥锁等。
如图2所示,具体处理过程包括以下步骤:
步骤301、更新视频缓冲区(FIFO)的状态。
如图3所示,更新视频缓冲区状态的处理过程包括以下步骤:
步骤30101、判断要设置的视频缓冲区大小不为当前视频缓冲区大小并且判断当前的状态是否为同步状态,是则执行步骤30102,否则执行步骤302。
步骤30102、判断要设置的视频缓冲区大小是否小于1,是则执行步骤30103,否则执行步骤30104;
步骤30103、将当前视频缓冲区的大小设置为1;
步骤30104、判断当前视频缓冲区大小是否小于要设置的视频缓冲区大小,是则执行步骤30105,否则执行步骤30106;
步骤30105、设置当前视频缓冲区的状态为增加状态,执行步骤30107;
步骤30106、设置当前缓冲区的状态为减少状态;
步骤30107、将当前视频缓冲区大小设置为要设置的视频缓冲区大小。
步骤302、判断当前视频缓冲区(FIFO)的状态是否是零状态(当前视频缓冲区中没有数据),是则执行步骤303,否则执行步骤304。
步骤303、零状态处理过程。
如图4所示,零状态处理过程包括以下步骤:
步骤30301、销毁视频播放相关资源。因为当前视频缓冲区中没有数据,而 播放线程的数据是从视频缓冲区中取出的,同时复位通知播放线程取数据的事件(即告知播放线程不要取数据),将信号量当前计数置1,使得信号量处于触发状态(即告知接受线程可以往FIFO中发送数据)。此处的事件机制是FIFO的同步机制。
步骤30302、等待数据到来并填充视频缓冲区,若等待超时(1.5秒)则直接返回步骤2,否则执行步骤30303,此处的1.5秒是自定义的。
步骤30303、将当前视频缓冲区的状态设置为增加状态后返回步骤2。
步骤304、判断当前视频缓冲区的状态是否为增加状态,如果是执行步骤305,否则执行步骤306。
步骤305、增加状态处理过程。
如图5所示,增加状态处理过程包括以下步骤:
步骤30501、等待数据到来并填充视频缓冲区,若等待超时则直接返回步骤2。
步骤30502、判断当前视频缓冲区的容量大小是否超过或者等于了当前视频缓冲区大小,如果是,将当前视频缓冲区的状态设置为同步状态返回步骤2,否则直接返回步骤2,为了避免多个线程同时访问视频缓冲区(FIFO),在此之前需要等待互斥锁,获取FIFO的大小然后释放互斥锁,以便其他的线程可以访问FIFO,同时此处也需要FIFO自己的同步机制同步骤30301(事件和信号量)。
步骤306、判断当前视频缓冲区的状态是否是减少状态,是则执行步骤307,否则执行步骤308。
步骤307、减少状态处理过程。
如图6所示,减少状态处理过程包括以下步骤:
步骤30701、判断当前视频缓冲区的容量大小是否小于或者等于了当前视频缓冲区大小,如果是执行将当前视频缓冲区的状态设置为同步状态后返回执行步骤2,否则执行步骤30703。
步骤30703、根据时间戳快速播放视频(同步播放视频),直到当前视频缓冲区的容量大小小于或者等于了当前视频缓冲区大小。
步骤30704、将当前视频缓冲区的状态设置为同步状态,返回步骤2。
步骤308、判断当前视频缓冲区的状态是否是同步状态,是则执行步骤309,否则返回,执行步骤2。
步骤309、同步状态处理过程。
如图7所示,同步状态处理过程包括以下步骤:
步骤30901、判断当前视频缓冲区的大小是否为零,是则执行步骤30902,否则执行步骤30903。
步骤30902、设置当前视频缓冲区的状态为零状态,或者调用播放类的刷新界面函数使得播放画面不闪烁,返回步骤2。
步骤30903、取出FIFO中最初的数据(即取出FIFO中的起始数据)。
步骤30904、若当前视频缓冲区大小为1,是则执行步骤30905,否则执行步骤30906。
步骤30905、直接播放本帧视频,并等待下一帧数据的到来,返回步骤2;否则执行步骤30907。
步骤30906、判断当前视频缓冲区大小比视频缓冲区(FIFO)的大小过大或者过小(这是由于前端的时钟和PC的时钟有误差值不一样引起的),是则执行步骤30907,否则执行步骤30908。
步骤30907、相应调整播放速率(速率不可波动过大)播放所取出的数据,返回步骤2。
步骤30908、按时间戳正常播放所取出的数据,返回步骤2。
下面一个应用实例进行说明:视频缓冲区中主要存储一帧帧视频数据,该视频数据包含了每帧的时间戳信息。前端采用的是HISI3516芯片外扩FLASH,RAM以LINUX为内核,BUSYBOX为文件系统的架构,采集音视频数据。所采集的音视频数据会通过网络专递至计算机终端,并在计算机终端上完成视频预览。在视频预览的时候很有可能出现网络卡顿,或者码率比较大的时候视频比较卡的现象,这时我们就可以按照以上步骤对视频流进行合理的控制以达到流畅的效果。
需要强调的是,本发明所述的实施例是说明性的,而不是限定性的,因此本发明包括并不限于具体实施方式中所述的实施例,凡是由本领域技术人员根 据本发明的技术方案得出的其他实施方式,同样属于本发明保护的范围。