CN102595192B - 一种视频流媒体无互斥缓冲方法 - Google Patents
一种视频流媒体无互斥缓冲方法 Download PDFInfo
- Publication number
- CN102595192B CN102595192B CN201210057730.6A CN201210057730A CN102595192B CN 102595192 B CN102595192 B CN 102595192B CN 201210057730 A CN201210057730 A CN 201210057730A CN 102595192 B CN102595192 B CN 102595192B
- Authority
- CN
- China
- Prior art keywords
- video
- write
- buffering area
- content
- read
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Two-Way Televisions, Distribution Of Moving Picture Or The Like (AREA)
Abstract
本发明涉及一种视频流媒体无互斥缓冲方法,其使用两个环形缓冲区进行视频信息的读写,在流媒体中,一路视频的读写都在一个固定大小的内存区中进行,读写操作的同步通过读写指针变量来确定,根据获取缓冲区的内容,并设定读写指针来确定变化量,采用环形缓冲区的时候,当读写指针到达缓冲区尾部的时候,自动将读写指针移动至环形缓冲区首地址的位置,如此循环往复。
Description
技术领域
本发明涉及一种服务类型的内存数据无斥缓冲技术,特别涉及一种流媒体码流的缓冲方法。
背景技术
众所周知,在一个服务类型的应用程序中,内存管理以及缓冲室都相当重要,因为系统会因为内存的管理不善引发效率低下甚至系统错误的问题,而且内存错误的查找不易发觉和定位,为规避这种情况出现,有效地内存管理更显重要。
目前的服务类型的应用程序都具备简单的内存管理功能,普遍采用的方法就是数组或者容器的方法,即把一些结构或内容放入字符数组或者容器中,再对其进行管理,即每次操作可能都会产生生成结构,赋值结构,删除结构的过程。
在现在的PC系统中,内存的分配以及大小是一个瓶颈,而频繁的内存操作会耗去很大部分的CPU资源.特别是在视频监控系统的软件系统当中,由于是流媒体级别应用,可能会同时并发处理上百个呼叫,系统正常运行时会有多大几百个线程,这就意味着同时可能有几百个内存处理的操作发生,每进行一次内存处理就是分配内存,使用内存,释放内存的过程.而且还有对数组或容器互斥操作的处理。这对系统的核心资源占用很大,也很浪费。占用CPU的资源很庞大且不稳定,这样虽然处理相对简单,但是对于系统的稳定性(短时间大量内存处理),进而严重影响应用程序的性能,且实际操作时(尤其是大小不定的内容,内容量地情况),很难分配大小颗粒度,而此是为传统技术的主要缺点。
发明内容
本发明提供一种视频流媒体无互斥缓冲方法其采取一次分配,再次通过实际大小分配(在已经分配好的情况下),规避了内存的多次分配释放,且处理更快速,而此是为本发明的主要目的。
本发明所采用的技术方案为:一种视频流媒体无互斥缓冲方法,使用两个环形缓冲区进行视频信息的读写,在流媒体中,一路视频的读写都在一个固定大小的内存区中进行,读写操作的同步通过读写指针变量来确定,根据获取缓冲区的内容,并设定读写指针来确定变化量,采用环形缓冲区的时候,当读写指针到达缓冲区尾部的时候,自动将读写指针移动至环形缓冲区首地址的位置,如此循环往复。
两个该环形缓冲区中一个该环形缓冲区为视频流媒体内容的缓冲区,另外一个该环形缓冲区为容器缓冲区。
该容器缓冲区为容器std::List缓冲,其包含内容起始位置信息以及内容大小的信息,该容器缓冲区的操作是原子操作,在具体实施的时候尽量减少迭代器的使用冲突,在该容器缓冲区的进行插入尾部操作以及取除头部操作,其中,插入尾部通过命令push_back完成,取除头部通过命令pop_front完成。
所谓原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行倒结束,中间不会有任何 context switch (切换到另一个线程)。
由于该视频流媒体内容的缓冲区以及该容器缓冲区为环形缓冲区,所以该视频流媒体内容的缓冲区以及该容器缓冲区都避开使用锁的保护,关于使用锁的保护在具体实施的时候如何正确有效的保护共享数据是编写程序必须面临的一个难题,通常的手段就是同步,分为阻塞式和非阻塞式,在本发明中为了实现无互斥运行,需要进行非阻塞的同步,也就是通过上述环形缓冲区的特点避开使用锁的保护。
在使用两个环形缓冲区进行视频信息读写的时候包括如下步骤,
第一步、一次性分配该视频流媒体内容的缓冲区以及该容器缓冲区的内存大小,将视频内容写入该视频流媒体内容的缓冲区以及该容器缓冲区中,该视频流媒体内容的缓冲区中写入具体视频内容,该容器缓冲区中写入具体视频内容的起始位置、视频内容大小的信息,该容器缓冲区中写入的具体视频内容的起始位置、视频内容大小的信息与该视频流媒体内容的缓冲区中写入的具体视频内容一一对应,在具体实施的时候将视频内容写入该视频流媒体内容的缓冲区以及该容器缓冲区中的过程中还需要记录以及修改必要的参数。
在完成第一步的过程中按照如下步骤进行:
步骤一、一次性分配该视频流媒体内容的缓冲区以及该容器缓冲区的内存大小。
步骤二、在该视频流媒体内容的缓冲区中写入具体视频内容,在该容器缓冲区中记录具体视频内容的结构信息,将结构信息写入结构容器LS中。
容器为std::List<S>。
结构信息包括写入具体视频内容的起始位置、视频内容大小的信息。
步骤三、记录移动工作参数信息。
第二步、通过该容器缓冲区一次性获取所有写入该视频流媒体内容的缓冲区中的视频内容。
具体按照如下步骤进行:
步骤一、获取第一步中该结构容器LS,通过该结构容器LS进而获取该视频流媒体内容的缓冲区中的视频内容。
步骤二、记录移动工作参数。
步骤三、对该结构容器LS进行取头操作,即根据已取好的个数,进行pop_front操作。
第一步、第二步循环进行完成利用两个环形缓冲区进行视频信息读写的操作。
在具体实施的时候,在进行第一步、第二步的过程中其调用接口的流程为:首先,进行初始化大小: CVideoBuffers(int size);而后,将视频内容写入该视频流媒体内容的缓冲区以及该容器缓冲区中:PushData(void *pdata,int size);最后,每隔一段时间从该视频流媒体内容的缓冲区以及该容器缓冲区中读数据,具体使用GetData(void *pArr,int num),其中pArr是DataBagStruct结构数组,num为DataBagStruct结构数组的大小,如果较长时间只写入则少读取,会覆盖较长时间前的数据,写入新数据。
本发明的有益效果为:本发明提供一种应用程序内存管理的方法,该方法能极大的降低内存分配释放操作,无需对内存加锁,即提高了效率又降低了对CPU资源的占用率。本发明利用环形缓冲及无锁编程将原来的内存分配释放操作大大降低,即能达到内存缓冲的目的,又能保持较低的资源占用率,为服务类型的应用程序(特别是流媒体程序)提高了一个完善的内存管理解决方案,实际运行过程中,流媒体因为内存处理对CPU的占用较低,且稳定,解决了该应用程序对内存管理导致CPU占用较高的问题,有效提高了系统的可维护性及稳定性。
附图说明
图1为加锁层次的原理说明图。
图2为环形存储示例原理说明图。
图3为本发明基本实现示例原理说明图。
具体实施方式
如图1至3所示,一种视频流媒体无互斥缓冲方法,使用两个环形缓冲区进行视频信息的读写。
在流媒体中,一路视频的读写都在一个固定大小的内存区中进行,读写操作的同步通过读写指针变量来确定。
根据获取缓冲区的内容,并设定读写指针来确定变化量,采用环形缓冲区的时候,当读写指针到达缓冲区尾部的时候,自动将读写指针移动至环形缓冲区首地址的位置,如此循环往复。
两个该环形缓冲区中一个该环形缓冲区为视频流媒体内容的缓冲区,另外一个该环形缓冲区为容器缓冲区。
该容器缓冲区为容器std::List缓冲,其包含内容起始位置信息以及内容大小的信息。
该容器缓冲区的操作是原子操作,在具体实施的时候尽量减少迭代器的使用冲突,在该容器缓冲区的进行插入尾部操作以及取除头部操作。
其中,插入尾部通过命令push_back完成,取除头部通过命令pop_front完成。
所谓原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行倒结束,中间不会有任何 context switch (切换到另一个线程)。
由于该视频流媒体内容的缓冲区以及该容器缓冲区为环形缓冲区,所以该视频流媒体内容的缓冲区以及该容器缓冲区都避开使用锁的保护。
关于使用锁的保护在具体实施的时候如何正确有效的保护共享数据是编写程序必须面临的一个难题,通常的手段就是同步,分为阻塞式和非阻塞式。
在本发明中为了实现无互斥运行,需要进行非阻塞的同步,也就是通过上述环形缓冲区的特点避开使用锁的保护。
在使用两个环形缓冲区进行视频信息读写的时候包括如下步骤,
第一步、一次性分配该视频流媒体内容的缓冲区以及该容器缓冲区的内存大小,将视频内容写入该视频流媒体内容的缓冲区以及该容器缓冲区中。
该视频流媒体内容的缓冲区中写入具体视频内容,该容器缓冲区中写入具体视频内容的起始位置、视频内容大小的信息。
该容器缓冲区中写入的具体视频内容的起始位置、视频内容大小的信息与该视频流媒体内容的缓冲区中写入的具体视频内容一一对应。
在具体实施的时候将视频内容写入该视频流媒体内容的缓冲区以及该容器缓冲区中的过程中还需要记录以及修改必要的参数。
在完成第一步的过程中按照如下步骤进行:
步骤一、一次性分配该视频流媒体内容的缓冲区以及该容器缓冲区的内存大小。
步骤二、在该视频流媒体内容的缓冲区中写入具体视频内容,在该容器缓冲区中记录具体视频内容的结构信息,将结构信息写入结构容器LS中。
容器为std::List<S>。
结构信息包括写入具体视频内容的起始位置、视频内容大小的信息。
步骤三、记录移动工作参数信息。
第二步、通过该容器缓冲区一次性获取所有写入该视频流媒体内容的缓冲区中的视频内容。
具体按照如下步骤进行:
步骤一、获取第一步中该结构容器LS,通过该结构容器LS进而获取该视频流媒体内容的缓冲区中的视频内容。
步骤二、记录移动工作参数。
步骤三、对该结构容器LS进行取头操作,即根据已取好的个数,进行pop_front操作。
第一步、第二步循环进行完成利用两个环形缓冲区进行视频信息读写的操作。
在具体实施的时候,在进行第一步、第二步的过程中其调用接口的流程为:
首先,进行初始化大小: CVideoBuffers(int size);
而后,将视频内容写入该视频流媒体内容的缓冲区以及该容器缓冲区中:PushData(void *pdata,int size);
最后,每隔一段时间从该视频流媒体内容的缓冲区以及该容器缓冲区中读数据,具体使用GetData(void *pArr,int num),其中pArr是DataBagStruct结构数组,num为DataBagStruct结构数组的大小,如果较长时间只写入则少读取,会覆盖较长时间前的数据,写入新数据。
Claims (4)
1.一种视频流媒体无互斥缓冲方法,其特征在于:使用两个环形缓冲区进行视频信息的读写,在流媒体中,一路视频的读写都在一个固定大小的内存区中进行,读写操作的同步通过读写指针变量来确定,根据获取缓冲区的内容,并设定读写指针来确定变化量,采用环形缓冲区的时候,当读写指针到达缓冲区尾部的时候,自动将读写指针移动至环形缓冲区首地址的位置,如此循环往复,
两个该环形缓冲区中一个该环形缓冲区为视频流媒体内容的缓冲区,另外一个该环形缓冲区为容器缓冲区,由于该视频流媒体内容的缓冲区以及该容器缓冲区为环形缓冲区,所以该视频流媒体内容的缓冲区以及该容器缓冲区都避开使用锁的保护,
在使用两个环形缓冲区进行视频信息读写的时候包括如下步骤,
第一步、一次性分配该视频流媒体内容的缓冲区以及该容器缓冲区的内存大小,将视频内容写入该视频流媒体内容的缓冲区以及该容器缓冲区中,
该视频流媒体内容的缓冲区中写入具体视频内容,该容器缓冲区中写入具体视频内容的起始位置、视频内容大小的信息,
该容器缓冲区中写入的具体视频内容的起始位置、视频内容大小的信息与该视频流媒体内容的缓冲区中写入的具体视频内容一一对应,
在完成第一步的过程中按照如下步骤进行:
步骤一、一次性分配该视频流媒体内容的缓冲区以及该容器缓冲区的内存大小,
步骤二、在该视频流媒体内容的缓冲区中写入具体视频内容,在该容器缓冲区中记录具体视频内容的结构信息,将结构信息写入结构容器LS中,
结构信息包括写入具体视频内容的起始位置、视频内容大小的信息,
步骤三、记录移动工作参数信息,
第二步、通过该容器缓冲区一次性获取所有写入该视频流媒体内容的缓冲区中的视频内容,
具体按照如下步骤进行:
步骤一、获取第一步中该结构容器LS,通过该结构容器LS进而获取该视频流媒体内容的缓冲区中的视频内容,
步骤二、记录移动工作参数,
步骤三、对该结构容器LS进行取头操作,即根据已取好的个数,进行pop_front操作,
第一步、第二步循环进行完成利用两个环形缓冲区进行视频信息读写的操作,其采取一次分配,再次通过实际大小分配,规避了内存的多次分配释放。
2.如权利要求1所述的一种视频流媒体无互斥缓冲方法,其特征在于:该容器缓冲区为容器std::List缓冲,该容器缓冲区的操作是原子操作。
3.如权利要求2所述的一种视频流媒体无互斥缓冲方法,其特征在于:在该容器缓冲区中进行插入尾部操作以及取除头部操作,其中,插入尾部通过命令push_back完成,取除头部通过命令pop_front完成。
4.如权利要求1所述的一种视频流媒体无互斥缓冲方法,其特征在于:在进行第一步、第二步的过程中其调用接口的流程为:
首先,进行初始化大小,而后,将视频内容写入该视频流媒体内容的缓冲区以及该容器缓冲区中,最后,每隔一段时间从该视频流媒体内容的缓冲区以及该容器缓冲区中读数据,如果较长时间只写入则少读取,会覆盖较长时间前的数据,写入新数据。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210057730.6A CN102595192B (zh) | 2012-03-07 | 2012-03-07 | 一种视频流媒体无互斥缓冲方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210057730.6A CN102595192B (zh) | 2012-03-07 | 2012-03-07 | 一种视频流媒体无互斥缓冲方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102595192A CN102595192A (zh) | 2012-07-18 |
CN102595192B true CN102595192B (zh) | 2014-12-17 |
Family
ID=46483333
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210057730.6A Active CN102595192B (zh) | 2012-03-07 | 2012-03-07 | 一种视频流媒体无互斥缓冲方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102595192B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105245912B (zh) * | 2015-10-21 | 2019-05-31 | 东方网力科技股份有限公司 | 一种缓存视频数据及读取视频数据的方法及装置 |
CN107979570A (zh) * | 2016-10-25 | 2018-05-01 | 北京优朋普乐科技有限公司 | 网络电台资源数据处理方法和装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1451234A (zh) * | 1999-09-20 | 2003-10-22 | 提维股份有限公司 | 闭式字幕添加标签的系统 |
CN101199011A (zh) * | 2004-12-02 | 2008-06-11 | 索尼株式会社 | 多路分离装置及多路分离方法 |
CN101267541A (zh) * | 2008-04-02 | 2008-09-17 | 武汉大学 | 一种适合在线点播或直播的流媒体分发服务器 |
-
2012
- 2012-03-07 CN CN201210057730.6A patent/CN102595192B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1451234A (zh) * | 1999-09-20 | 2003-10-22 | 提维股份有限公司 | 闭式字幕添加标签的系统 |
CN101199011A (zh) * | 2004-12-02 | 2008-06-11 | 索尼株式会社 | 多路分离装置及多路分离方法 |
CN101267541A (zh) * | 2008-04-02 | 2008-09-17 | 武汉大学 | 一种适合在线点播或直播的流媒体分发服务器 |
Also Published As
Publication number | Publication date |
---|---|
CN102595192A (zh) | 2012-07-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106844041B (zh) | 内存管理的方法及内存管理系统 | |
CN110018914B (zh) | 基于共享内存的消息采集方法及装置 | |
US9934077B2 (en) | Reader-writer lock | |
CN103150149A (zh) | 处理数据库重做数据的方法和装置 | |
CN103885726A (zh) | 一种高效的多线程日志写入方法 | |
CN111324427B (zh) | 一种基于dsp的任务调度方法及装置 | |
CN110134503B (zh) | 一种集群环境下的定时任务处理方法、装置及存储介质 | |
CN103218176A (zh) | 数据处理方法及装置 | |
CN107562685B (zh) | 一种基于延时补偿的多核处理器核心间数据交互的方法 | |
US11003367B2 (en) | Data storage, reading, and cleansing method and device, and cloud storage system | |
CN113138945B (zh) | 一种数据缓存方法、装置、设备及介质 | |
US20140351550A1 (en) | Memory management apparatus and method for threads of data distribution service middleware | |
CN102595192B (zh) | 一种视频流媒体无互斥缓冲方法 | |
Martin et al. | Notifying memories: A case-study on data-flow applications with NoC interfaces implementation | |
CN103514140B (zh) | 用于实现可重构系统中配置信息多发射的重构控制器 | |
CN109375868B (zh) | 一种数据存储方法、调度装置、系统、设备及存储介质 | |
US8543722B2 (en) | Message passing with queues and channels | |
CN114327642A (zh) | 一种数据读写的控制方法及电子设备 | |
CN113495889A (zh) | 一种分布式对象存储方法、装置、电子设备及存储介质 | |
CN110069533B (zh) | 一种基于区块链的事件订阅方法及装置 | |
CN104156316A (zh) | 一种Hadoop集群批处理作业的方法及系统 | |
CN105488047B (zh) | 元数据读写方法和装置 | |
CN112346879B (zh) | 进程管理方法、装置、计算机设备及存储介质 | |
CN101021846A (zh) | 一种不定帧长结构数据流的存储方法 | |
CN106445790A (zh) | 一种分布式实时计算系统中计数对账的方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CP01 | Change in the name or title of a patent holder | ||
CP01 | Change in the name or title of a patent holder |
Address after: 518000 4th floor, modern building, South 4th Road, Gaoxin, Nanshan District, Shenzhen City, Guangdong Province Patentee after: Shenzhen Radio & TV Xinyi Technology Co.,Ltd. Address before: 518000 4th floor, modern building, South 4th Road, Gaoxin, Nanshan District, Shenzhen City, Guangdong Province Patentee before: SHENZHEN XINYI TECHNOLOGY Co.,Ltd. |