CN110312156B - 一种视频缓存方法、装置及可读存储介质 - Google Patents
一种视频缓存方法、装置及可读存储介质 Download PDFInfo
- Publication number
- CN110312156B CN110312156B CN201810260499.8A CN201810260499A CN110312156B CN 110312156 B CN110312156 B CN 110312156B CN 201810260499 A CN201810260499 A CN 201810260499A CN 110312156 B CN110312156 B CN 110312156B
- Authority
- CN
- China
- Prior art keywords
- frame
- memory
- data
- data frames
- buffer queue
- 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
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04N—PICTORIAL COMMUNICATION, e.g. TELEVISION
- H04N21/00—Selective content distribution, e.g. interactive television or video on demand [VOD]
- H04N21/20—Servers specifically adapted for the distribution of content, e.g. VOD servers; Operations thereof
- H04N21/23—Processing of content or additional data; Elementary server operations; Server middleware
- H04N21/231—Content storage operation, e.g. caching movies for short term storage, replicating data over plural servers, prioritizing data for deletion
- H04N21/23106—Content storage operation, e.g. caching movies for short term storage, replicating data over plural servers, prioritizing data for deletion involving caching operations
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04N—PICTORIAL COMMUNICATION, e.g. TELEVISION
- H04N21/00—Selective content distribution, e.g. interactive television or video on demand [VOD]
- H04N21/40—Client devices specifically adapted for the reception of or interaction with content, e.g. set-top-box [STB]; Operations thereof
- H04N21/43—Processing of content or additional data, e.g. demultiplexing additional data from a digital video stream; Elementary client operations, e.g. monitoring of home network or synchronising decoder's clock; Client middleware
- H04N21/433—Content storage operation, e.g. storage operation in response to a pause request, caching operations
- H04N21/4331—Caching operations, e.g. of an advertisement for later insertion during playback
Landscapes
- Engineering & Computer Science (AREA)
- Multimedia (AREA)
- Signal Processing (AREA)
- Compression Or Coding Systems Of Tv Signals (AREA)
- Two-Way Televisions, Distribution Of Moving Picture Or The Like (AREA)
Abstract
本发明公开了一种视频缓存方法、装置及可读存储介质,属于数据处理技术领域。本发明公开的视频缓存方法中,在获得待缓存的目标视频流时,可从空闲内存缓冲队列中获取目标空闲内存来将该目标视频流按照I帧和非I帧的分离缓存,由于空闲内存缓冲队列中的内存是已缓存视频数据被释放后得到的空闲内存,所以通过空闲内存缓冲队列中的空闲内存来缓冲目标视频流可以实现内存的复用,从而减少频繁的内存操作,降低内存碎片化程度并提高视频缓存效率,同时对目标视频流实现了I帧、B帧P帧的分离存储,便于后续进行数据帧的定位,提高数据帧的定位效率。
Description
技术领域
本发明涉及数据处理技术领域,尤其涉及一种视频缓存方法、装置及可读存储介质。
背景技术
目前在缓存视频流时,一般是将视频流中的所有数据帧集中存储在一起,当需要定位到其中的某一目标帧时,则需要遍历当前帧与该目标帧之间所有的数据帧后才能定位到该目标帧,若当前帧与目标帧之间的数据帧较多的话,则需要花费较长的时间才能实现目标帧的定位,换句话说,对于通过目前的视频缓存方案缓存的视频流,要实现数据帧的定位需要较长的时间,数据帧的定位效率较低。
并且,在缓存每帧数据帧时,都是先申请内存,再分配内存,最后再基于分配的内存来进行存储,也就是说,对于每一帧来说,都需要单独申请、分配内存来进行缓存,然而频繁的内存分配可能使得一些较小的内存片得不到利用,从而增大内存的碎片化程度,导致内存资源的利用率下降,另外,频繁的申请、访问、分配等一系列内存操作会花费较长的时间,缓存效率较低。
可见,对于目前的视频缓存方案而言,内存的碎片化程度较高且缓存效率较低,并且需要定位数据帧时耗时较长,数据帧的定位效率较低。
发明内容
本发明实施例提供一种视频缓存方法、装置及可读存储介质,用于减少内存碎片化程度、提高视频缓存效率以及提高数据帧的定位效率。
第一方面,提供一种视频缓存方法,所述方法包括:
获得目标视频流,所述目标视频流包括I帧数据帧和非I帧数据帧,所述非I帧数据帧包括B帧数据帧和P帧数据帧;
根据所述目标视频流,从空闲内存缓冲队列中获取目标空闲内存;其中,所述空闲内存缓冲队列中的内存是已缓存视频数据被释放后的空闲内存;
利用获取的目标空闲内存,将所述I帧数据帧和所述非I帧数据帧缓存于不同的数据缓冲队列中。
在上述方案中,由于是利用从空闲内存缓冲队列中获取的目标空闲内存实现对目标视频流的缓存,即通过内存复用的方式对目标视频流进行缓存,这样就可以减少如现有技术中的申请内存、分配内存等一系列的内存操作,从而可以在一定程度上降低内存的内存碎片化程度,进而提高内存的利用率,同时还可以缩短缓存时间,提高视频缓存效率。同时,在将I帧数据帧和非I帧数据帧分离缓存在不同数据缓冲队列中后,可以缩短数据帧定位的时间,提高数据帧的定位效率。
在一种可能的设计中,所述空闲内存缓冲队列包括大缓冲队列和小缓冲队列,所述大缓冲队列中的每个空闲内存的内存量均大于所述小缓冲队列中的空闲内存的内存量;根据所述目标视频流,从空闲内存缓冲队列中获取目标空闲内存,包括:
根据所述I帧数据帧的数据帧数量从所述大缓冲队列中确定相等数量的空闲内存,以及,根据所述非I帧数据帧的数据帧数量从所述小缓冲队列中确定相等数量的空闲内存。
在上述方案中,将空闲内存缓冲队列设置为包括大存储容量的空闲内存的大缓冲队列以及包括小存储容量的空闲内存的小缓冲队列,进而可以直接利用大缓冲队列中的空闲内存缓存I帧,以及利用小缓冲队列中的空闲内存缓冲B帧和P帧,由于I帧的数据量大于B帧和P帧,所以通过这种方式可以提高空闲内存与待缓存的数据帧之间的数据量匹配程度,尽量减小两者之间的数据量差异,提高待缓存数据帧与对应的空闲内存的适配性,进而提高缓存效率。
在一种可能的设计中,所述大缓冲队列用于缓存已缓存的I帧被释放后得到的空闲内存,所述小缓存队列用于缓存已缓存的B帧和P帧被释放后得到的空闲内存。
通过上述技术方案,可以让之前缓存I帧的空闲内存直接复用来缓存I帧,以及让之前缓存B帧和P帧的空闲内存直接复用来缓存非I帧,以最大程度减少待缓存数据帧与对应的缓存内存之间的差距,最大化的提高适配性和缓存效率。并且,还可以实现内存的二次甚至多次复用,提高内存的复用率。
在一种可能的设计中,利用获取的目标空闲内存,将所述I帧数据帧和所述非I帧数据帧缓存于不同的数据缓冲队列中,包括:
根据所述目标视频流中的数据帧的获得顺序,依次为每个数据帧设置缓存顺序标记;其中,所述缓存顺序标记用于指示数据帧的解码顺序;
按照设置的缓存顺序标记,利用获取的目标空闲内存分别将所述I帧数据帧和所述非I帧数据帧缓存于不同的数据缓冲队列中。
通过上述技术方案,可以为缓存的每帧数据帧按照数据帧的获得顺序设置缓存顺序标记,由于该缓存顺序标记是用于指示解码顺序的,所以在后续解码时则可以直接利用该缓存顺序标记的指示确定每帧数据帧的解码顺序,这样即使数据帧的时间戳值被标记错误,也可以避免如现有技术中那样按照时间戳进行解码而导致的解码出错,进而可以提高解码的准确性。
在一种可能的设计中,根据所述目标视频流中的数据帧的获得顺序,依次为每个数据帧设置缓存顺序标记,包括:
根据所述目标视频流中的I帧数据帧的获得顺序,为每个I帧设置一级顺序标记,以及针对以每个I帧作为基准编码I帧的B帧和P帧设置两级顺序标记,所述两级顺序标记的第一级顺序标记为其对应的基准编码I帧的顺序标记,第二级顺序标记根据B帧和P帧的获得顺序设置。
在上述技术方案中,由于B帧或P帧的两级顺序标记中的第一级顺序标记与其对应的基准编码I帧的一级顺序标记一致,增强了非I帧与对应的基准编码I帧之间的关联性,这样在定位某B帧(或P帧)的基准编码I帧时可以直接通过该B帧(或P帧)的第一级顺序标记确定对应的基准编码I帧的一级顺序标记,从而可以快速地定位出该基准编码I帧,进而提高数据帧的定位效率。并且,某基准编码I帧下的所有B帧和P帧的第二级顺序标记是根据每帧的获得顺序设置,这样通过每帧的第二级顺序标记即可直接确定出在视频流中的时序,进而可以确保数据帧能够准确地按序存储。
在一种可能的设计中,根据所述目标视频流,从空闲内存缓冲队列中获取目标空闲内存,包括:
在所述空闲内存缓冲队列不为空时,则根据所述I帧数据帧和所述非I帧数据帧分别包括的数据帧数量,从所述空闲内存缓冲队列中获取所述目标空闲内存;
在所述空闲内存缓冲队列为空且满足预定等待条件时,则等待所述空闲内存缓冲队列中置入空闲内存,并从置入的空闲内存中获取所述目标空闲内存。
在一种可能的设计中,所述方法还包括:
在所述空闲内存缓冲队列为空但不满足所述预定等待条件时,则根据所述I帧数据帧和所述非I帧数据帧分别包括的数据帧的数据量申请内存;
利用申请的内存分别将所述I帧数据帧和所述非I帧数据帧缓存于不同的数据缓冲队列中。
在上述技术方案中,针对空闲内存缓冲队列当前是否为空两种情形提供了对应的获得目标空闲内存的方式,通过预定等待条件的判断可以采用两种不同的方式实现待缓存数据的缓存,针对不同的应用场景能够针对性地进行处理,从而扩大了方案的适用性,以确保视频数据能够及时有效地进行缓存,在不影响视频缓存的前提下提供多种应用场景的缓存方式,适用性更强。
在一种可能的设计中,所述方法还包括:
根据用户选择的视频播放场景或上一视频播放周期的视频缓存信息及网络状态,确定目标缓存量;
在利用获取的目标空闲内存缓存的数据帧的数量达到所述目标缓存量时,对已缓存的数据帧进行解码播放。
通过上述技术方案可以实现目标换存量的动态调整,使得在视频播放的过程中目标缓存量可动态地进行调整,可以尽量满足多种情况下的缓存与播放之间的平衡,以满足不同播放场景以及不同网络情况下的高效流畅播放,从而增强用户的使用体验。
第二方面,提供一种视频缓存装置,所述装置包括:
数据获得模块,用于获得目标视频流,所述目标视频流包括I帧数据帧和非I帧数据帧,所述非I帧数据帧包括B帧数据帧和P帧数据帧;
内存获得模块,用于根据所述目标视频流,从空闲内存缓冲队列中获取目标空闲内存;其中,所述空闲内存缓冲队列中的内存是已缓存视频数据被释放后的空闲内存;
缓存模块,用于利用获取的目标空闲内存,将所述I帧数据帧和所述非I帧数据帧缓存于不同的数据缓冲队列中。
在一种可能的设计中,所述空闲内存缓冲队列包括大缓冲队列和小缓冲队列,所述大缓冲队列中的每个空闲内存的内存量均大于所述小缓冲队列中的空闲内存的内存量;所述内存获得模块具体用于:
根据所述I帧数据帧的数据帧数量从所述大缓冲队列中确定相等数量的空闲内存,以及,根据所述非I帧数据帧的数据帧数量从所述小缓冲队列中确定相等数量的空闲内存。
在一种可能的设计中,所述大缓冲队列用于缓存已缓存的I帧被释放后得到的空闲内存,所述小缓存队列用于缓存已缓存的B帧和P帧被释放后得到的空闲内存。
在一种可能的设计中,所述缓存模块具体用于:
根据所述目标视频流中的数据帧的获得顺序,依次为每个数据帧设置缓存顺序标记;其中,所述缓存顺序标记用于指示数据帧的解码顺序;
按照设置的缓存顺序标记,利用获取的目标空闲内存分别将所述I帧数据帧和所述非I帧数据帧缓存于不同的数据缓冲队列中。
在一种可能的设计中,所述缓存模块具体用于:
根据所述目标视频流中的I帧数据帧的获得顺序,为每个I帧设置一级顺序标记,以及针对以每个I帧作为基准编码I帧的B帧和P帧设置两级顺序标记,所述两级顺序标记的第一级顺序标记为其对应的基准编码I帧的顺序标记,第二级顺序标记根据B帧和P帧的获得顺序设置。
在一种可能的设计中,所述内存获得模块具体用于:
在所述空闲内存缓冲队列不为空时,则根据所述I帧数据帧和所述非I帧数据帧分别包括的数据帧数量,从所述空闲内存缓冲队列中获取所述目标空闲内存;
在所述空闲内存缓冲队列为空且满足预定等待条件时,则等待所述空闲内存缓冲队列中置入空闲内存,并从置入的空闲内存中获取所述目标空闲内存。
在一种可能的设计中,所述装置还包括内存申请模块,所述内存申请模块用于在所述空闲内存缓冲队列为空但不满足所述预定等待条件时,则根据所述I帧数据帧和所述非I帧数据帧分别包括的数据帧的数据量申请内存;
所述缓存模块还用于利用所述内存申请模块申请的内存,分别将所述I帧数据帧和所述非I帧数据帧缓存于不同的数据缓冲队列中。
在一种可能的设计中,所述装置还包括:
确定模块,用于根据用户选择的视频播放场景或上一视频播放周期的视频缓存信息及网络状态,确定目标缓存量;
播放模块,用于在利用获取的目标空闲内存缓存的数据帧的数量达到所述目标缓存量时,对已缓存的数据帧进行解码播放。
第三方面,提供一种视频缓存装置,该装置包括:
存储器,用于存储程序指令;
处理器,用于调用所述存储器中存储的程序指令,按照获得的程序指令执行第一方面中任一方法包括的步骤。
第四方面,提供一种可读存储介质,所述可读存储介质存储有计算机可执行指令,所述计算机可执行指令用于使计算机执行第一方面中任一方法包括的步骤。
本发明实施例中,通过内存复用的方式对目标视频流进行缓存,通过减少内存操作的方式提高了内存的利用率和缓存效率,同时,通过将I帧数据帧和非I帧数据进行分离缓存的方式,便于数据帧的快速定位,提高了数据帧的定位效率。并且,通过大缓冲队列中的空闲内存缓冲I帧以及通过小缓冲队列中的空闲内存缓冲非I帧的方式,提高了缓存内存与待缓存数据帧之间的适配性,进一步地提高了缓存效率。另外,还为缓存的所有数据帧设置用于指示解码顺序的缓存顺序标记,可以提高解码的准确性,进一步地,针对非I帧和I帧分别进行顺序标记,并且非I帧的第一级顺序标记与对应的基准编码I帧的标记相同,增强了非I帧与对应的基准编码I帧之间的关联性,同时非I帧的第二级顺序标记是按照其获得顺序设置,这样可以确保其在缓存的时序准确,提高缓存后视频流的时序准确性。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1A为现有技术中的一段视频流包括的数据帧的示意图;
图1B为现有技术中对视频流包括的数据帧进行缓存后的示意图;
图2A-2B为现有技术中的视频流缓存示意图;
图3为本发明实施例中的视频缓存方法的应用场景示意图;
图4为本发明实施例中的视频缓存方法的流程图;
图5为本发明实施例中的目标视频流的缓存示意图;
图6为本发明实施例中的视频缓存方法的另一流程图;
图7为本发明实施例中的视频缓存方法的另一流程图;
图8为本发明实施例中的空闲内存缓冲队列包括两个缓冲队列的示意图;
图9为本发明实施例中的对数据帧进行标记的示意图;
图10为本发明实施例中的对数据帧进行标记的另一示意图;
图11为本发明实施例中的一种视频缓存装置的结构示意图;
图12为本发明实施例中的一种视频缓存装置的另一结构示意图;
图13为本发明实施例中的另一种视频缓存装置的结构示意图;
图14为本发明实施例中的另一种视频缓存装置的另一结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚明白,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互任意组合。并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
本发明的说明书和权利要求书及上述附图中的术语“第一”和“第二”是用于区别不同对象,而非用于描述特定顺序。此外,术语“包括”以及它们任何变形,意图在于覆盖不排他的保护。例如包含了一系列步骤或单元的过程、方法、***、产品或设备没有限定于已列出的步骤或单元,而是可选地还包括没有列出的步骤或单元,或可选地还包括对于这些过程、方法、产品或设备固有的其它步骤或单元。
另外,本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,在不做特别说明的情况下,一般表示前后关联对象是一种“或”的关系。
以下对本文中涉及的部分用语进行说明,以便于本领域技术人员理解。
1、视频的数据帧,包括I帧(I frame)、B帧(B frame)和P帧(P frame)。其中,I帧,又称作关键帧或帧内编码帧,I帧是基于帧内压缩算法编码生成的;B帧和P帧是基于帧间压缩算法编码生成的,B帧又称作双向预测内插编码帧或双向参考帧,P帧又称作前向预测编码帧或单向参考帧。B帧是本帧与前后帧的差别数据记录,P帧是本帧与之前帧的差别数据记录,而I帧是一帧画面的完整数据记录,通过I帧自身可以利用视频解码算法解码成一张单独的完整的图片,所以I帧的数据量要远大于B帧、P帧的数据量。
对于一段视频流来说,其包括的I帧的数量一般要少于B帧和P帧的数量,例如请参见图1A所示的一段视频流所包括的数据帧的示意图,可见该视频流中示出的数据帧中只包括4帧I帧,而B帧和P帧的总数是12帧,其中B帧和P帧分别有6帧。
2、缓冲队列,是一种先入先出(First Input First Output,FIFO)的线性表,其可以包括多个队列元素,在某些场景下,队列元素又称作队列对象。缓冲队列可以用于缓存数据,例如视频数据、音频数据、图像数据等等,或者也可以用于缓存指令或其它。以缓存数据来说,此时缓冲队列中的队列元素可以是内存指针,每个内存指针指向特定的内存,即内存指针指向内存地址,内存地址指向具体的内存空间,通过缓冲队列缓存数据实质上就是通过调用其中的内存指针以将数据存储于该内存指针指向的内存中。
不同的缓冲队列可以具有不同的容量,容量的不同表示该缓冲队列中能够容置的队列元素的个数不同,例如某一缓冲队列的容量大小为100,即表示该缓冲队列最多只能容置100个队列元素。
3、内存释放,是指将内存中存储的数据释放,即将内存中缓存的数据清空。例如,内存m中一共存储了10M数据,将内存m进行内存释放后,原本存储于内存m中的10M数据就被删除了,而删除了这10M数据的内存m中就不再缓存有任何数据,此时内存m处于空闲状态,本文中将处于空闲状态的内存称作空闲内存。
4、线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。在一个应用程序的运行过程中,可以由多个线程执行不同的操作,例如在视频播放器的运行过程中,可以通过读包线程从服务器分发的视频流中读取数据,通过解复用线程对读取的数据进行解复用以分别得到视频数据和音频数据,通过解码线程对解复用后的数据进行解码,通过渲染模块对解码后的数据渲染输出,等等。
如前所述,目前在缓存视频流时,是将视频流中的所有数据帧集中地存储在一起,换句话说,就是将所有数据帧缓存在一个缓冲队列中,例如,对于图1A所示的视频流来说,当将其进行缓存之后如图1B所示,可见图1B中与该视频流中原始的数据帧排列顺序(即图1A所示)是一样的,此时若需要定位到其中的某一目标帧时,则需要遍历当前帧与该目标帧之间的所有数据帧后才能定位到该目标帧,若当前帧与目标帧之间包括的了较多的数据帧的话,则需要花费较长的时间才能遍历找到该目标帧,即对于数据帧的定位效率较低。例如,在观看视频的过程中,根据观看需求用户可能会拖动播放进度条,本技术领域将拖动播放进度条称作seek,而拖动播放进度条后对应的播放位置则称作seek位置,在拖动播放进度条之后需要继续播放,即需要先对seek位置处的数据帧进行解码,如果seek位置处对应的恰好是I帧,由于I帧是关键帧则可以直接进行解码后播放,若seek位置处对应的是如图1B中所示的P帧(在其它情形中或者也可能是B帧),因为P帧是基于某基准编码I帧进行编码的,所以在解码的时候则需要先找到该P帧的基准编码I帧后再基于该基准编码I帧进行解码后才能播放,图1B中所示的seek位置处对应的P帧即可以理解为前述的当前帧,图1B中所示的基准编码I帧即可以理解为前述的需要定位的目标帧。如图1B所示,该P帧的基准编码I帧与该P帧之间间隔了3个数据帧,所以则需要遍历这3个数据帧之后才能定位到该基准编码I帧,并且图1B只是示意性地说明,在实际中,I帧与I帧之间间隔的B帧和P帧的数量一般还要多得多,所以如果要定位到该P帧的基准编码I帧的话,由于需要遍历大量的B帧和P帧所以需要花费较长的时间,从而导致定位效率较低。
并且,目前在缓存视频时是逐帧缓存的,例如请参见图2A所示的现有技术中的视频缓存示意图,首先读包线程从服务器发送的视频流中读取数据帧,再将读取获得的数据帧缓存在先入先出的缓冲队列中,越先缓存的数据帧越靠近缓冲队列的头部,如图2A所示,缓冲队列从头至尾依次缓存的是第1帧数据帧、第2帧数据帧、……、第N-1帧数据帧、第N帧数据帧,可见,当缓存了N帧数据帧时缓冲队列就被填满,说明该缓冲队列的容量为N,在缓存这N帧数据帧的过程中,每缓存一帧数据帧都需要重新申请并分配内存来进行缓存,例如为第1帧分配的缓存内存是内存1,为第2帧分配的缓存内存是内存2,等等。并且,在缓冲队列被填满后,如果此时再读取一帧(例如图2A中所示的a帧)需要缓存,就还需要再为a帧申请内存a,那么则需要等待解码线程对第1帧进行解码处理,待解码线程对第1帧进行解码处理以获得可供播放的数据之后则对之前用于缓存第1帧的内存1从缓冲队列中移除,以腾出一个位置用来容置为a帧新分配的内存a,进而再通过内存a来缓存a帧,将a帧进行缓存后如图2B所示。
通过图2A和图2B所示的视频缓存方案,由于每帧数据帧都需要经过申请内存和分配内存的操作,而频繁的内存分配则可能使得一些数据量小于或远小于视频的单个数据帧的数据量的内存块得不到利用,所以频繁的内存分配会加大内存的碎片化程度,进而导致内存资源的利用率降低,不利于内存的有效使用和管理,并且由于缓存每帧数据帧都需要申请内存、访问内存、分配内存的内存操作,耗时较长,这样则导致视频缓存的效率也较低。另外,随着视频的清晰度越来越高,每帧的数据量也就越来越大,那么在为每帧数据分配内存时都是以更大块的内存进行分配,而对于一些零散较小的内存的使用概率就更低,这会进一步地导致内存碎片化加大,从而导致视频缓存占用的整体内存越来越大,进而使得空闲内存资源越来越少,这样可能会影响其他程序的正常使用,并且会造成终端设备运行缓慢甚至卡顿等情况发生,影响用户的使用体验。
鉴于以上所述,本发明实施例提供另一种视频缓存方案,具体来说,在获得需要缓存的目标视频流时,可以根据目标视频流从空闲内存缓存队列中获取目标空闲内存,再利用获取的目标空闲内存将目标视频流包括的I帧数据帧和非I帧数据帧分别缓存在不同的数据缓冲队列中,由于空闲内存缓冲队列中的内存是已缓存视频数据被释放后得到的空闲内存,即可以利用先前缓存视频数据在内存被释放后得到的空闲内存直接缓存当前再需要缓存的数据帧,而无需再为当前需要缓存的数据帧申请内存和分配内存,通过内存的直接复用减少了内存操作,从而可以在一定程度上降低内存的碎片化程度,加大内存的有效利用,提高内存的利用率。同时,由于减少了一系列的内存操作,可以在一定程度上缩短缓存的时间,进而提高缓存效率。并且,通过内存的直接复用,即使每帧数据帧的数据量增大,也可以尽量在预先分配的内存(即直接用来复用的内存)基础上缓存视频,通过减少内存碎片化的方式实现内存的充分利用,以便于为其它应用程序分配更多的内存资源,确保终端设备能够多任务运行,减少终端设备的卡顿现象,增强用户的使用体验。
并且,由于是利用获得的目标空闲内存将I帧数据帧和非I帧数据帧缓存在不同的缓冲队列中,即实现了I帧、B帧P帧的分离存储,对于分离存储后的两个缓冲队列分别包括的数据帧数量而言,相对于集中存储的一个缓冲队列来说要少一些,那么在进行数据帧的定位时则可以直接从其中的一个缓冲队列中进行快速定位,继续前述图1B所示的seek的例子,当需要定位到seek位置处的P帧的基准编码I帧时,可以直接从分离存储的I帧的数据缓冲队列中快速地定位到该P帧的基准编码I帧,而无需像现有技术中那样遍历P帧与该基准编码I帧之间的所有数据帧,进而可以缩短定位数据帧的时间,提高数据帧的定位效率。
本发明实施例中的视频缓存方法可以应用于如图3所示的应用场景,当用户想要观看目标视频时(在本文中将用户希望观看的视频称作目标视频),可以通过终端设备向服务器发送视频播放请求,服务器接收到该视频播放请求后,可以向终端设备发送该目标视频的视频流资源,视频流资源包括该目标视频的所有数据帧。终端设备则可以实时接收数据帧并进行缓存,再经过解码渲染等处理后进行播放,以展现给用户观看,而在实际中,一般是利用终端设备中安装的视频播放器来对目标视频进行播放。在该应用场景中包括终端设备和服务器。其中,终端设备可以是智能手机、平板电脑、掌上电脑(Personal DigitalAssistant,PDA),笔记本电脑、车载设备、智能穿戴式设备等等能够进行视频播放的设备,服务器是能够向不同终端设备提供视频资源的设备。在实际中,终端设备中安装有视频播放程序以支持视频播放,当用户希望观看视频时可以操作该终端设备以启动视频播放程序,再操作视频播放程序以向服务器发送视频播放请求,当服务器接收到该视频播放请求之后可以对该视频播放请求进行鉴权,当鉴权通过之后则可以将对应的视频资源发送给该终端设备,终端设备再将获取到的视频资源进行缓存、解复用、解码、渲染等处理后进行播放,以最终呈现给用户。
请参见图4,图4为本发明实施例提供的视频缓存方法的流程图,该方法可以应用于能够进行视频播放的终端设备,例如图3中的终端设备。该方法的流程描述如下。
步骤41、获得目标视频流,该目标视频流包括I帧数据帧和非I帧数据帧,该非I帧数据帧包括B帧数据帧和P帧数据帧。
其中,目标视频流是与目标视频对应的视频流,目标视频可以是影视视频、游戏视频、体育视频、广告视频、新闻视频、娱乐视频等等,该目标视频的播放方式可以是点播、直播或者其它方式。
如图1A所示的视频流中的数据帧包括I帧、B帧和P帧三种类型的数据帧,在本发明实施例中,将视频流中的所有I帧称作I帧数据帧,将视频流中的所有B帧和P帧称作非I帧数据帧,可以这样理解,I帧数据帧是数据流中的所有I帧的集合,非I帧数据帧是数据流中的所有B帧和P帧的集合。由于在视频流中I帧的帧数较少且数据量较大,以及B帧和P帧的帧数总和较多且数据量较小,并且B帧和P帧均是基于相应的I帧进行编码的,基于此本发明实施例将视频流包括的数据帧划分为I帧数据帧和非I帧数据帧这两类数据帧。
步骤42、根据目标视频流,从空闲内存缓冲队列中获取目标空闲内存;其中,该空闲内存缓冲队列中的内存是已缓存视频数据被释放后的空闲内存。
本发明实施例中的空闲内存缓冲队列是专用于容置空闲内存的,即空闲内存缓冲队列中的所有队列元素均表示空闲内存,并且该空闲内存缓冲队列中的空闲内存是将已缓存视频数据的内存进行内存释放后而得到的空闲内存,也就是说,该空闲内存缓冲队列中的空闲内存之前是已经缓存过视频数据的,例如缓存过其它视频包括的数据帧,或者也可以是缓存过该目标视频的其它部分视频流的数据帧。总之来说,通过空闲内存缓冲队列可以实现对之前缓存过视频数据而又进行内存释放后得到的空闲内存进行集中管理,即,通过空闲缓冲队列可以实现内存从已占用状态变化为空闲状态后的集中管理。继续以图2A为例来说,当对其中的第1帧数据帧进行解码等处理之后则可以对第1帧数据帧的内存1进行内存释放以得到空闲状态的内存1,进而再将空闲状态的内存1置于空闲内存缓冲队列中。
基于前述的空闲内存缓冲队列,在获得了需要缓存的目标视频流后,则可以根据目标视频流从空闲内存缓冲队列获取用于缓存该目标视频流的目标空闲内存,具体来说,可以根据目标视频流的I帧数据帧和非I帧数据帧分别包括的数据帧数量从空闲内存缓冲队列中获得对应数量的空闲内存,在一种可能的实施方式中,可以利用从空闲内存缓冲队列中获得的一个空闲内存来缓存目标视频流中的一个数据帧。例如请参见图5所示的目标视频流的缓存示意图,可见目标视频流包括16帧数据帧,其中I帧数据帧包括4帧I帧,非I帧数据帧包括12帧B帧和P帧,那么则可以从空闲缓冲队列中获得16个空闲内存,获得的这16个空闲内存即可以理解为是本发明实施例中的目标空闲内存,进而再利用获取的这16个空闲内存分别缓存目标视频流,具体来说,是利用其中的4个空闲内存缓存前述的I帧数据帧,以及利用其余的12个空闲内存缓存前述的非I帧数据帧,通过空闲内存与数据帧的一对一的缓存方式,可以直接利用空闲内存实现对待缓存视频的快速缓存。
在实际中,如果要对已缓存的数据帧进行播放,还需要进行解码、渲染等处理,具体来说,先进行解码处理以得到解码后的数据,再由渲染线程复制解码后的数据并进行渲染处理以得到渲染后的数据,最后再由播放线程对渲染后的数据进行输出以实现播放,换句话说,在视频的数据帧缓存后且在播放之前,首先还需要进行解码处理,并且,在对数据帧解码后何时再进行内存释放呢,例如可以在解码线程进行解码以获得解码后的数据后,或者可以在渲染模块复制解码后的数据后,或者可以在播放线程输出播放之后,等等,只要不影响对数据帧的使用,对于内存释放的时机不作限制。
需要说明的是,图5中所示的空闲内存缓冲队列只是示意性地示出了a1、a2、a3、a4这4个空闲内存,在实际中当然还可以包括更多的空闲内存。另外,在具体过程中,a1、a2、a3、a4可以是指内存的内存标识,而内存标识例如是内存地址,或者是内存地址对应的内存指针,无论是哪种表示形式,通过a1、a2、a3、a4这些内存标识即可以访问到对应的内存空间。
步骤43、利用获取的目标空闲内存,将I帧数据帧和非I帧数据帧缓存于不同的数据缓冲队列中。
进一步地,在从空闲内存缓冲队列中获取到了目标空闲内存之后,则可以利用获取到的目标空闲内存将目标视频流包括的I帧数据帧和非I帧数据帧分离缓存于不同的数据缓冲队列中。
在具体实施过程中,可以按照逐帧缓存的方式,即,在获得一帧数据帧之后,即判断该帧的数据帧类型,若确定是I帧,则利用获得的一个空闲内存将其缓存在I帧数据帧对应的数据缓冲队列中,若确定是B帧或P帧,则利用获得的一个空闲内存将其缓存在非I帧数据帧对应的数据缓冲队列中。或者,还可以采用批量缓存的方式,即在接收到视频流的多帧数据帧之后,先确定多帧数据帧的数量,再根据该数量从空闲内存缓冲队列中获取相等数量的空闲内存,最后再根据每帧的数据帧类型以一对一的缓存方式实现I帧数据帧和非I帧数据帧的分离缓存。
继续参见图5所示,可见将图5中的目标视频流中的4帧I帧缓存于一个缓冲队列,并且将目标视频流中的12帧B帧和P帧缓存于另一个缓冲队列中,从而实现I帧数据帧和非I帧数据帧的分离存储,那么在如此缓存之后,由于I帧的数据量较少,所以当需要定位某I帧时则可以从I帧数据帧的缓冲队列中快速地定位到目标I帧,继续以图1B中的seek后需要定位P帧的基准编码I帧为例,当采用了本发明实施例中的缓存方案对目标视频流进行缓存之后,就无需再像图1B中那样遍历P帧和其基准编码I帧之间的所有B帧和P帧,而是可以直接从图5中所示的包括较少数据帧的I帧数据帧的缓冲队列中直接定位到基准编码I帧,例如可以基于P帧的时间戳(Time Stamp,TS)从I帧数据帧的缓冲队列中快速定位到基准编码I帧,以实现数据帧的快速定位,提高数据帧的定位效率。
并且,由于是通过空闲内存缓冲队列提供的空闲内存来缓存I帧数据帧和非I帧数据帧,针对每一数据帧是直接通过内存复用的方式进行缓存的,而无需再如现有技术中那样频繁地为待缓存的每帧数据帧申请内存和分配内存,通过内存的直接复用减少了内存操作,由于对内存的申请和分配的次数减少,从而可以在一定程度上降低内存的碎片化程度,加大内存的有效利用,提高了内存资源的利用率。同时,由于减少一系列的内存操作,可以在一定程度上缩短数据缓存的时间,进而提高视频缓存效率。并且,通过内存的直接复用,即使每帧数据的数据量增大,也可以尽量在预先分配的内存基础上缓存视频,通过减少内存碎片化的方式实现内存的充分利用,以便于为其它应用程序分配更多的内存资源,确保终端设备能够多任务的流畅运行,减少终端设备的卡顿现象,增强用户的使用体验。
在具体实施过程中,当从空闲内存缓冲队列中获取目标空闲内存时,若空闲内存缓冲队列中存在有空闲内存,由于缓冲队列是遵从先入先出的逻辑,所以可以直接从空闲内存缓冲队列的头部开始依次获取对应数量的空闲内存来实现对目标视频流的缓存,然而,在实际中还可能出现空闲内存缓冲队列中当前没有能够进行复用的空闲内存即空闲内存缓冲队列当前为空的情形,针对这些可能的情形,为了便于本领域技术人员理解,以下结合图6进行介绍说明。
步骤61、确定目标视频流包括的数据帧数。也就是说,在获得了待缓存的目标视频流之后,即可以确定目标视频流中包括的总的数据帧的数量,进一步地,还可以确定出目标视频流所包括的I帧数据帧(所有的I帧)和非I帧数据帧(所有的B帧和P帧)。
步骤62、判断空闲内存缓冲队列是否为空。
当空闲内存缓冲队列中没有任何队列元素存在,也就表明空闲内存缓冲队列中当前没有可复用的空闲内存,即空闲内存缓冲队列当前为空,反之,当空闲内存缓冲队列中存在有队列元素的话,即表明空闲内存缓冲队列不为空。
步骤63、当确定空闲内存缓冲队列当前不为空时,则可以进一步判断目标视频流所包括的数据帧数是否小于等于空闲内存缓冲队列中的空闲内存数量,根据目标视频流包括的数据帧数与空闲内存缓冲队列中当前现有的空闲内存数量的多少进行比较,可以确定空闲内存缓冲队列中的空闲内存是否能够完全地缓存目标视频流所包括的所有数据帧。
继续以图5为例,目标视频流包括的数据帧的数量是16,假设空闲内存缓冲队列中当前的队列元素个数是18,即表明空闲内存缓冲队列中的空闲内存能够满足目标视频流的全部数据帧的缓存需要,此时则可以执行步骤64,即从空闲内存缓冲队列中获得与目标视频流包括的数据帧数量相等的空闲内存,即获得16个空闲内存,进一步地再执行步骤65以利用获得的16个空闲内存按照一对一缓存的方式分别将目标视频流包括的I帧数据帧和非I帧数据帧缓存于不同的数据缓冲队列中。
又假设空闲内存缓冲队列中当前的队列元素个数是13,即目标视频流包括的数据帧的数量多于空闲内存缓冲队列中当前现有的空闲内存数量,按照一个空闲内存缓存一帧数据帧的对应缓存方式,可见空闲内存缓冲队列中的空闲内存不够完全缓存目标视频流,此时则可以执行步骤66,即先从空闲内存缓冲队列中获得现有的空闲内存,再利用获得的空闲内存缓存目标视频流中的部分数据帧。继续前述例子,即可以先从空闲内存缓冲队列中获得13个空闲内存,再利用获得的这13个空闲内存按照目标视频流中的数据帧的获得顺序依次将前13帧数据帧按照I帧、B帧P帧的分离缓存方式将其中的部分数据帧缓存于不同的数据缓冲队列中。
步骤67、判断是否满足预定等待条件。在从空闲内存缓冲队列中将现有的13个空闲内存取走以缓存目标视频流中的部分数据帧后,空闲内存缓冲队列即变成了空队列,此时进一步地,可以判断是否满足预定等待条件,并根据最终的判断结果来执行相应的缓存策略。
其中,预定等待条件可以是指在不影响视频数据缓存的前提下,通过一定时间的等待后空闲内存缓冲队列中便有可以复用的空闲内存,通过预定等待条件的判断可以确定是否稍加等待就可以得到可以复用的空闲内存,所以在满足预定等待条件时,即使空闲内存缓冲队列当前为空,只要稍加等待就可以再从其中获得可复用的空闲内存。
步骤68、若满足预定等待条件,则可以等待空闲内存缓冲队列中置入空闲内存,并从置入的空闲内存中获取空闲内存,再利用获得的空闲内存继续缓存目标视频流中还未缓存的数据帧。在此过程中,空闲内存缓冲队列中可能在短时间置入多个空闲内存以足够用于缓存目标视频流中的还未缓存的数据帧,或者,空闲内存缓冲队列中置入空闲内存的时间间隔可能较长,此时可以依次以预定等待条件进行判断,一旦确定不满足预定等待条件时即可以执行步骤69。
步骤69、若不满足预定等待条件,为了实现视频数据的及时缓存,此时则可以根据目标视频流中的各个数据帧的数据量分别申请对应的内存,例如对于目标视频流中的某帧数据帧来说,其数据量为1M,则可以申请1M或略大于1M的内存用来缓存该数据帧。
步骤610、进一步地,再利用申请的内存分别将I帧数据帧和非I帧数据帧缓存于不同的数据缓冲队列中。
另外,在空闲内存缓冲队列当前为空时,也可以按照步骤67-步骤610的方法流程进行实施,具体实施可以参见前述步骤67-步骤610的描述,此处就不再重复说明了。
本发明实施例中,对于空闲内存缓冲队列为空和不为空两种情形提供了对应不同的处理方式,通过预定等待条件的判断可以采用两种不同的方式实现待缓存数据的缓存,针对不同的应用场景能够针对性地进行处理,从而扩大了方案的适用性,以确保视频数据能够及时有效地进行缓存,在不影响视频缓存的前提下提供多种应用场景的缓存方式,适用性更强。
在具体实施过程中,可能有以下原因导致空闲内存缓冲队列当前为空。
原因一:解码线程还没有开始对已缓存视频数据进行解码处理,或者在解码后还未进行内存释放,所以自然也就没有可以复用的内存故空闲内存缓冲队列当前即为空队列。
原因二:读包线程的读包速率远大于解码线程的解码速率,所以导致解码且释放的内存跟不上读包线程的使用,那么在某些时候也就可能没有可以复用的内存。
原因三:在刚开始对已缓存视频数据进行解码时,如若在内存释放之前获得了需要缓存的数据帧,由于还未完成内存释放,例如正在进行解码或者正在进行内存释放操作,所以也就没有可以复用的内存。
原因四:根据缓存设置条件,已缓存视频数据中释放的空闲内存不再进行复用,或者释放的空闲内存用于其它途径的复用所以不会再放到空闲内存缓冲队列中,在这些条件下空闲缓冲队列中自然也可能暂时没有空闲内存。
原因五:在实际中可以预先设置总缓存量,例如只有在已缓存视频数据的总缓存量达到预定数量时才会进行解码释放,例如设置为50帧或者300帧,所以在未达到该预定数量时就不会进行解码和释放处理,那么自然也就没有可以复用的内存。在达到该预定数量的缓存数据后再进行解码播放并释放内存,可以尽量确保视频一旦开始播放就能够流畅连续的播放,不会因为网络短暂的不稳定或断网而影响视频的播放,减少视频播放过程中出现的卡顿现象,增强用户的观看体验。
以上列举了几种导致空闲内存缓冲队列为空队列的可能情形,当然在具体实施过程中,还可以根据不同的缓存设置条件存在其它可能的情形,此处就不再一一举例说明了。在这些可能的情形下,有的可以进行适当等待,例如原因一和原因五,有的如果等待的话则会影响视频的及时缓存,例如原因四,所以本发明实施例中,可以根据预定等待条件来判断是否会影响对视频数据的及时缓存,进而确定是否可以进行适当等待,在确保视频数据及时缓存的基础上尽量提高内存的复用率。
在一种可能的实施方式中,如前所述的,空闲内存缓冲队列包括的所有空闲内存集中存放在一起,当需要缓冲目标视频流的I帧数据帧和非I帧数据帧时,则可以按照先入先出的顺序从空闲内存缓冲队列中直接获得对应数量的空闲内存来缓存前述的I帧数据帧和非I帧数据帧,然而在实际中,当按照前述的一个空闲内存缓存一帧数据帧的方式进行一对一缓存时,由于空闲内存的内存空间与数据帧的数据量之间一般是不匹配的,为了实现内存资源的合理有效分配以及使用,以下结合图7进行相应说明,具体地,以从空闲内存缓冲队列中获取到的第一目标空闲内存来缓存目标视频流中的某一数据帧(称作待缓存数据帧)进行举例说明。
步骤71、从空闲内存缓冲队列中获得第一目标空闲内存。
步骤72、判断待缓存数据帧的数据量是否大于第一目标空闲内存的存储空间,即通过两者之间的比较以判断第一目标空闲内存是否能够完整地将待缓存数据帧进行缓存。
步骤73、若待缓存数据帧的数据量大于第一目标空闲内存的存储容量,即表明仅通过第一目标空闲内存无法将该待缓存数据帧的数据完全缓存,所以此时可以根据待缓存数据帧的数据量重新确定内存,再利用重新确定的内存来缓存待缓存数据帧。
在实际中,根据***的规定不同,第一目标空闲内存后连续的内存存在可用和不可用两种情况,例如第一目标空闲内存是100M,根据***的不同设置,与这100M连续的内存存在可用和不可用两种可能,并且对于可用这种情况来说,可用的内存大小也不一定,例如可用的有50M,或者可用的仅仅为2M,等等。所以对于不同的情形,本发明实施例分别采用不同的方式来重新确定用于缓存待缓存数据帧的内存。
步骤74、若第一目标空闲内存后连续的内存可用且大于等于待缓存数据帧与第一目标空闲内存之间的差值,则根据该差值直接对第一目标空闲内存进行扩展。
步骤75、在步骤74的基础上,再利用扩展后的第一目标空闲内存来缓存待缓存数据帧。
举例来说,需要缓存的待缓存数据帧为1.2M,假设从空闲内存缓冲队列中获取的第一目标空闲内存的内存指针为指针a,指针a指向的内存地址是0x110,并且指向的内存是1M。若指针a指向的内存1M后面连续的内存是可用的并且可用内存大于等于0.2M,那么则可以直接将指针a指向的内存扩展成1.2M,但是此时指针a的地址还是0x110,但是它的内存容量已由先前的1M扩展成了1.2M,那么扩展之后的1.2M就可以完全存储待缓存数据帧了。当然,在另一种可能的实施方式中,在进行内存扩展时还可以将其容量扩展成略大于待缓存数据帧的数据量,例如扩展成为1.3M,等等,另外,在具体实施过程中,例如可以通过调用realloc等方法来实现内存的扩展。
也就是说,在不改变内存地址的前提下,通过直接进行内存扩展的方式可以解决待缓存数据帧的数据量大于从空闲内存缓冲队列中直接获得的空闲内存的存储容量的问题,进而提高内存复用的灵活性,以尽量提高内存复用的有效性。
步骤76、若第一目标空闲内存后连续的内存不可用或小于待缓存数据帧与第一目标空闲内存之间的差值,则根据待缓存数据帧的数据量重新申请内存。
步骤77、在步骤76的基础上,再利用重新申请的内存来缓存待缓存数据帧。
继续前述例子,当0x110地址指向的内存1M后面的内存是不可利用的,或者可以利用的内存太小,此时则可以另外申请1.2M的内存,例如重新申请到的1.2M的内存地址是0x220,那么此时指针a的地址就由之前的0x110变为0x220,内存容量也变更为1.2M,在这种情况下指针a的内存地址是发生变化了的。另外,对于之前内存地址0x110指向的1M内存可以留给后来的数据量稍小的数据帧进行缓存,通过尽可能多的内存复用来提高内存利用率。
也就是说,在不具备内存复用的情况下,本发明实施例也提供了一种视频缓存的备用方式,这样可以尽量确保视频缓存的有效和及时。
无论是采用扩展后的内存还是重新申请的内存对待缓存数据帧进行缓存之后,均可以将已缓存了待缓存数据帧的内存的指针置入已缓冲视频数据缓冲队列中,所不同的是,若是通过内存扩展的方式,置入的内存指针指向的内存地址并未发生变化,而通过重新申请的方式所置入的内存指针指向的内存地址是发生了变化的,相同点则是其所指向的内存的存储容量相较于缓存待缓存数据帧之前均发生了变化。
另外,通过将已缓存数据帧的内存的指针置入已缓冲视频数据缓冲队列中,可以在后续已缓冲视频数据缓冲队列中的数据帧进行内存释放以得到空闲内存之后,再将得到的空闲内存置入空闲内存缓冲队列中,以实现内存的二次甚至多次复用,提高内存的复用率。
步骤78、若待缓存数据帧的数据量小于等于第一目标空闲内存的存储空间,即表明第一目标空闲内存能够完整地缓存待缓存数据帧的数据,所以此时则可以直接将待缓存数据帧存储于第一目标空闲内存中。
在将待缓存数据帧存储于第一目标空闲内存之后,第一目标空闲内存还可以有些剩余,所以本发明实施例中进一步地提出了根据剩余内存的大小来确定对该剩余内存进行处理的具体策略。
步骤79、根据第一目标空闲内存的剩余内存与预定值的大小关系,以对应的处理策略对剩余内存进行处理。也就是说,在将待缓存数据帧直接存储于第一目标空闲内存之后,还可以对第一目标空闲内存的剩余内存进行合理化处理,以进一步地提高资源利用率。
步骤79a、在一种可能的实施方式中,若剩余内存小于预定值,即表明剩余内存很小,例如只有8KB,其利用价值不大,所以可以令其继续保持空闲,即不进行任何处理。
步骤79b、在另一种可能的实施方式中,若剩余内存大于等于预定值,即表明剩余内存还可以进行一定程度的利用,此时则可以利用剩余内存来缓存待缓存数据帧后相邻的下一数据帧,也就是说,利用第一目标空闲内存同时缓存了待缓存数据帧和待缓存数据帧后相邻的下一数据帧。
在具体实施过程中,由于通过第一目标空闲内存同时缓存了两帧数据帧,为了确保两帧数据帧数据的有效和完整,可以采用一定的防干扰和完整性机制,具体可以采用现有的一些方案进行处理,这里就不展开说明了。
步骤710、最后,再将对剩余内存进行处理后的第一目标空闲内存的内存指针置入已缓存视频数据缓冲队列中,以便于后续实现内存的二次甚至多次复用,提高内存的复用率。
另外,在具体实施过程中,还可以将剩余内存分别与不同取值的预定值分别进行比较,例如若剩余内存小于等于第一预定值的时候如何进行处理,若剩余内存大于等于第二预定值的时候如何进行处理,若剩余内存在第一预定值和第二预定值之间又如何处理,具体的处理策略可以根据实际情形和不同的缓存机制进行实施,本文就不再详细说明了。
前述以图7说明了当从空闲内存缓冲队列中获取的空闲内存的存储容量与需要缓存的待缓存数据帧的数据量之间不匹配的情形,例如从空闲内存缓冲队列中获取的空闲内存是之前用于缓存I帧后释放得到的空闲内存,而当前需要缓存的待缓存数据帧是B帧,由于之前是用于缓存I帧的,所以获得的空闲内存的存储容量要远大于待缓存数据帧的数据量,所以在缓存B帧时就会存在一定的资源浪费,又例如当从空闲内存缓冲队列中获取的空闲内存是之前用于缓存P帧后释放得到的空闲内存,而当前需要缓存的待缓存数据帧是I帧,所以在缓存I帧时又会存在资源不足所以会再采用如图7所示的步骤74-步骤77的缓存策略,这样可能会在一定程度上降低缓存的效率。
鉴于以上所述,在另一种可能的实施方式中,可以将空闲内存缓冲队列拆分为大缓冲队列和小缓冲队列这两个队列,其中大缓冲队列中的每个空闲内存的内存量均大于小缓冲队列中的空闲内存的内存量,那么在缓存目标数据流时,请参见图8所示,针对待缓存的I帧数据帧,则可以直接从大缓冲队列中获取复用的空闲内存,针对待缓存的非I帧数据帧,则可以直接从小缓冲队列中获取复用的空闲内存,因为大缓冲队列和小缓冲队列中均是之前用于缓冲视频数据的空闲内存,所以在内存大小上一般都是接近I帧、或接近B帧(或P帧)这两类大小,所以进一步地可以用大缓冲队列单独缓存I帧,而由于B帧和P帧的数据量相差不是很大,所以可以用小缓冲队列来来缓冲B帧和P帧,进而实现对大数据量和小数据量的数据帧进行针对性地分离缓存,以使得复用的内存在每次复用时能够与当前缓存的数据帧的数据量之间的差值减小,提高内存的适配性和利用率,因为I帧的数据量大于B帧和P帧的数据量,所以通过将空闲内存缓冲队列划分为针对I帧数据帧和非I帧数据帧的大、小两个缓冲队列,可以在一定程度上提高复用的空闲内存和待缓存数据帧之间的数据量的匹配,以尽量提高缓存效率。
本发明实施例中,大缓冲队列用于缓存已缓存的视频数据中的I帧被释放后得到的空闲内存,而小缓冲队列用于缓存已缓存的视频数据中的B帧和P帧被释放后得到的空闲内存,这样当用大缓冲队列专门针对性地仅缓存I帧数据帧时,以及当用小缓冲队列专门针对性地仅缓存B帧或P帧时,可以在最大程度上提高内存的适配性,提高内存利用率的基础上还可以提高缓存效率。
在具体实施时,大缓冲队列和小缓冲队列中的空闲内存可以是其它首次缓存视频数据被释放后而第一次进行复用的内存,或者也可以是二次或多次复用的内存,例如图8中所示,当通过大缓冲队列将I帧数据帧缓存之后,以及通过小缓冲队列将非I帧数据帧缓存之后,I帧数据帧和非I帧数据帧在被解码播放之后可以进行内存释放以得到相应的空闲内存,进一步地可以将得到的这些空闲内存对应地再置入大缓冲队列和小缓冲队列中,以实现内存的二次甚至多次复用,提高内存的复用率。
目标视频流中的数据帧是通过特定的编码算法进行编码后得到的数据,在进行视频编码时有个很重要的操作就是为每帧数据帧添加TS值,即按照编码的顺序依次为每帧数据帧打上TS值,在进行解码时为了确保视频的时序准确,目前一般是按照TS值确定数据帧的解码顺序,然而在实际操作过程中,在为数据帧添加TS值得时候可能会出错,即出现TS值打错的情形,但是终端设备在从服务器发送的数据流中读取各数据帧的顺序却是对的,由于后续解码是按照TS值确定解码顺序,由于TS值打错则可能导致解码时某些数据帧的时序弄错,导致解码出现误差。鉴于此,本发明实施例在缓存目标视频流的数据帧时,可以根据视频流中的每帧数据帧的获得顺序,依次为每个数据帧设置缓存顺序标记,而设置的这些缓存顺序标记是用于指示后续数据帧在进行解码时的解码顺序。例如图9所示,例如按照目标视频流中的每帧数据帧的获得顺序,依次顺序地为每帧数据帧设置1-16的缓存顺序标记,最后再按照设置的缓存顺序标记,利用获取的目标空闲内存分别将I帧数据帧和非I帧数据帧缓存于不同的数据缓冲队列中,也就是说,通过为每帧数据帧设置了对应的缓存顺序标记之后,在解码时就可以按照数据帧的获得顺序解码,而无需再利用时间戳进行解码,这样可以避免TS值在编码时被打错的情形而导致的解码误差,以提高解码的准确性,并且对于缓存而言,可以实现视频流的准确有序缓存。
进一步地,在设置缓存顺序标记时,还可以针对I帧数据帧和非I帧数据帧分别设置不同类型的缓存顺序标记,在一种可能的实施方式中,可以根据目标视频流中的I帧数据帧的获得顺序,为每个I帧设置一级顺序标记,以及针对以每个I帧作为基准编码I帧的B帧和P帧设置两级顺序标记,而该两级顺序标记的第一级顺序标记为其对应的基准编码I帧的顺序标记,以及该两级顺序标记的第二级顺序标记则根据B帧和P帧的获得顺序设置。请参见图10所示,目标视频流按照I帧的获得顺序依次为4个I帧设置了1、2、3、4的一级顺序标记,即图10中所示的I1、I2、I3、I4,而以I1作为基准编码I帧的所有B帧和P帧的两级顺序标记分别是1-1、1-2、1-3、1-4,即图10中所示的B1-1、P1-2、B1-3、P1-4,对于其中的B1-1来说,其两级顺序标记“1-1”中的第一个“1”即为其对应的基准编码I帧(即I1)的顺序标记,第二个“1”即表示其在以I1作为基准编码I帧的所有B帧和P帧中的获得顺序(即第1个获得),再以P3-2来说,其两级顺序标记“3-2”中的“3”即为其对应的基准编码I帧(即I3)的顺序标记,“3-2”中的“2”即表示其在以I3作为基准编码I帧的所有B帧和P帧中的获得顺序(即第2个获得)。
通过前述的为I帧设置一级顺序标记以及为非I帧设置二级顺序标记的方式,可以使得B帧和P帧和与其对应的基准编码I帧之间具有部分相同的标记,这样可以直接根据数据帧的顺序标记即可确定哪些B帧和P帧是基于哪个I帧进行基准编码的,增强了B帧和P帧与对应的基准编码I帧之间的关联性,那么在定位B帧或P帧的基准编码I帧时则可以根据一级顺序标记实现快速定位,例如在seek后确定基准编码I帧时,若seek位置处的数据帧是B3-4,那么则可以从I帧数据帧的数据缓冲队列中直接定位找到B3-4的基准编码I帧是I3,从而实现数据帧的快速定位,提高定位效率。
当然,图9、图10只是示意性地对目标视频流中的数据帧的顺序标记进行说明,在具体实施过程中,当然还可以有其它的标记方式,凡是基于上述思想对数据帧进行标记的实施方式均在本发明实施例的保护范围之内。
在实际中,缓存视频一般是为了视频的播放,换句话说,视频缓存一般是伴随着视频播放同步进行的,并且为了确保视频能够流畅地进行播放,一般会先缓存一定数量的数据帧之后再进行播放,也就是说,虽然视频缓存和视频播放是并行进行的,但是当前播放的视频数据是之前已经缓存的视频数据,而当前正在缓存的视频数据可以用于当前时刻的下一时刻进行播放。在现有技术中是采用先缓存一定数量的数据帧之后再进行解码播放,这里的一定数量是预先由***或者由用户设置好的,在整个视频播放过程中一般不再改变,然而在实际中,可能由于网络状态的动态变化或者视频片源的不同,如果采用固定缓存数量的缓存机制则可能导致出现缓冲等待、卡顿等情形的发生,从而影响用户的流畅观看。
鉴于以上所述,为了提高用户的观看体验,本发明实施例提供了一种可动态调整目标缓存量(即前述的需要先缓存一定数量的数据帧)的缓存机制,使得在视频播放的过程中目标缓存量可动态地进行调整,以尽量满足多种情况下的缓存与播放之间的平衡。具体来说,可以根据用户选择的视频播放场景来设置目标缓存量,或者也可以根据上一视频播放周期的视频缓存信息和/或网络状态自适应设置目标缓存量,进而再在利用从空闲内存缓冲队列中获取到的目标空闲内存缓存的数据帧的数量达到动态设置的目标缓存量时,就对已缓存的数据帧进行解码播放。由于在整个播放过程中,用户选择的视频播放场景、上一视频播放周期的视频缓存信息和/或网络状态是动态变化的,通过前述的设置方式即可实现目标缓存量的动态调整。
例如,对于用户选择的观看直播视频的低时延场景,可以将目标缓存量设置的较小,因为直播的时延较小,通过设置较小的目标缓存量可以有效地降低视频的启播时间,而具体的值可以根据实际时延要求而定,例如可以设置在100-220左右,即在缓存了100-220帧数据帧之后即可进行解码播放。
又例如,对于用户选择的观看热点短视频的短视频场景,可以将目标缓存量设置的较大,这样可以预先缓存尽量多的数据,以避免网络不稳定等问题导致短视频出现较久缓冲等情形,例如可以设置为250-400左右,即在缓存了250-400帧数据帧之后再进行解码播放,以确保播放过程不会受到网络不稳定的影响而能够流畅播放。
又例如,对于用户拖动进度条观看视频的拖动场景,也可以设置比较小的目标缓存量,这样可以缩短用户等待的时间,例如可以设置拖动后缓冲的数据帧达到30-80时即进行播放。
再例如,还可以根据用户选择的目标视频的片源清晰度动态调整目标缓存量,例如对于超清、蓝光等清晰度较高的视频来说,由于其每帧数据帧的数据量相对于清晰度为流畅的来说要大一些,所以在缓存视频时同等数量的数据帧需要花费更多的时间,所以为了确保缓存的数据帧能够跟上播放的速度,对于清晰度较高的视频可以设置较大的目标缓存量,而对于清晰度较低则可以设置相对于较小的目标缓存量。
对于网络自适应的设置方式来说,可以统计上一播放周期中缓存的数据帧的总量以及缓存速率,或者可以直接获得上一播放周期中的网络状态,进而可以判断上一播放周期中网络的情况,由于一般来说,在短时间内网络突变的概率较低,所以可以根据上一播放周期的网络的情况来动态配置当前播放周期中缓存的总数据帧数。例如,如果网络条件比较差,则可以将目标缓存量设置的较大,避免用户在观看过程中出现长时间缓冲,如果网络条件较好,则可以将目标缓存量设置的较小,这样可以快速地启动播放,并且由于网络较好在后续的观看过程中可以快速缓冲,避免卡顿的情况发生。
也就是说,通过本发明实施例中的对目标缓存量进行动态调整的方案,既可以在播放开始的时候根据视频片源的特性对目标缓存量进行调整,也可以在播放的过程中根据用户进行拖动等操作对目标缓存量进行调整,还可以根据网络情况自适应地对目标缓存量进行调整,以满足不同场景不同网络情况下的高效流畅播放,从而增强用户的使用体验。
基于同一发明构思,请参见图11所示,图11为本发明实施例提供的一种视频缓存装置的结构示意图,该视频缓存装置可以是终端设备,能够实现前述的视频缓存方法中终端设备的功能;或者,该视频缓存装置也可以是能够支持终端设备实现前述的视频缓存方法中终端设备的功能的装置。该视频缓存装置可以是硬件结构、软件模块、或硬件结构加软件模块。该视频缓存装置可以由芯片***实现,芯片***可以由芯片构成,也可以包含芯片和其他分立器件。
本发明实施例中的视频缓存装置可以包括数据获得模块111、内存获得模块112和缓存模块113。其中:
数据获得模块111,用于获得目标视频流,该目标视频流包括I帧数据帧和非I帧数据帧,该非I帧数据帧包括B帧数据帧和P帧数据帧;
内存获得模块112,用于根据目标视频流,从空闲内存缓冲队列中获取目标空闲内存;其中,该空闲内存缓冲队列中的内存是已缓存视频数据被释放后的空闲内存;
缓存模块113,用于利用获取的目标空闲内存,将I帧数据帧和非I帧数据帧缓存于不同的数据缓冲队列中。
在一种可能的实施方式中,空闲内存缓冲队列包括大缓冲队列和小缓冲队列,大缓冲队列中的每个空闲内存的内存量均大于小缓冲队列中的空闲内存的内存量;内存获得模块112具体可以用于根据I帧数据帧的数据帧数量从大缓冲队列中确定相等数量的空闲内存,以及,根据非I帧数据帧的数据帧数量从小缓冲队列中确定相等数量的空闲内存。
在一种可能的实施方式中,大缓冲队列用于缓存已缓存的I帧被释放后得到的空闲内存,小缓存队列用于缓存已缓存的B帧和P帧被释放后得到的空闲内存。
在一种可能的实施方式中,缓存模块113具体可以用于根据目标视频流中的数据帧的获得顺序依次为每个数据帧设置缓存顺序标记,再按照设置的缓存顺序标记,利用获取的目标空闲内存分别将I帧数据帧和非I帧数据帧缓存于不同的数据缓冲队列中。其中,缓存顺序标记用于指示数据帧的解码顺序。
在一种可能的实施方式中,缓存模块113具体可以用于根据目标视频流中的I帧数据帧的获得顺序,为每个I帧设置一级顺序标记以及针对以每个I帧作为基准编码I帧的B帧和P帧设置两级顺序标记,其中,两级顺序标记的第一级顺序标记为其对应的基准编码I帧的顺序标记,第二级顺序标记根据B帧和P帧的获得顺序设置。
在一种可能的实施方式中,内存获得模块112具体可以用于在空闲内存缓冲队列不为空时,则根据I帧数据帧和非I帧数据帧分别包括的数据帧数量,从空闲内存缓冲队列中获取目标空闲内存;以及,在空闲内存缓冲队列为空且满足预定等待条件时,则等待空闲内存缓冲队列中置入空闲内存,并从置入的空闲内存中获取目标空闲内存。
在一种可能的实施方式中,请参见图12所示,该视频缓存装置还可以包括内存申请模块121,该内存申请模块121可以用于在空闲内存缓冲队列为空但不满足预定等待条件时,则根据I帧数据帧和非I帧数据帧分别包括的数据帧的数据量申请内存。
在一种可能的实施方式中,缓存模块113还可以利用内存申请模块121申请的内存,分别将I帧数据帧和非I帧数据帧缓存于不同的数据缓冲队列中。
在一种可能的实施方式中,继续参见图12,该视频缓存装置还可以包括确定122和播放123。其中:
确定模块122,用于根据用户选择的视频播放场景或上一视频播放周期的视频缓存信息及网络状态,确定目标缓存量;
播放模块123,用于在利用获取的目标空闲内存缓存的数据帧的数量达到目标缓存量时,对已缓存的数据帧进行解码播放。
其中,前述视频缓存方法实施例涉及的各步骤的所有相关内容均可以援引到本发明实施例中的对应功能模块的功能描述,在此不再赘述。
本发明实施例中对模块的划分是示意性的,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,另外,在本发明各个实施例中的各功能模块可以集成在一个处理器中,也可以是单独物理存在,也可以两个或两个以上模块集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。
基于同一发明构思,本发明实施例还提供另一种视频缓存装置,该视频缓存装置可以是终端设备,例如智能手机、平板电脑、PDA,笔记本电脑、车载设备、智能穿戴式设备等等,能够实现前述的视频缓存方法中终端设备的功能;或者,该视频缓存装置也可以是能够支持终端设备实现前述的视频缓存方法中终端设备的功能的装置。该视频缓存装置可以是硬件结构、软件模块、或硬件结构加软件模块。该视频缓存装置可以由芯片***实现,芯片***可以由芯片构成,也可以包含芯片和其他分立器件。
如图13所示,本发明实施例中的视频缓存设备包括至少一个处理器131,以及与至少一个处理器连接的存储器132,本发明实施例中不限定处理器131与存储器132之间的具体连接介质,图13中是以处理器131和存储器132之间通过总线130连接为例,总线130在图13中以粗线表示,其它部件之间的连接方式,仅是进行示意性说明,并不引以为限。总线130可以分为地址总线、数据总线、控制总线等,为便于表示,图13中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
在本发明实施例中,存储器132存储有可被至少一个处理器131执行的指令,至少一个处理器131通过执行存储器132存储的指令,可以执行前述的视频缓存方法中所包括的步骤。
其中,处理器131是视频缓存装置的控制中心,可以利用各种接口和线路连接整个视频缓存装置的各个部分,通过运行或执行存储在存储器132内的指令以及调用存储在存储器132内的数据,视频缓存装置的各种功能和处理数据,从而对视频缓存装置进行整体监控。可选的,处理器131可包括一个或多个处理单元,处理器131可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作***、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器131中。在一些实施例中,处理器131和存储器132可以在同一芯片上实现,在一些实施例中,它们也可以在独立的芯片上分别实现。
处理器131可以是通用处理器,例如中央处理器(CPU)、数字信号处理器、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件,可以实现或者执行本发明实施例中公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者任何常规的处理器等。结合本发明实施例所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。
存储器132作为一种非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块。存储器132可以包括至少一种类型的存储介质,例如可以包括闪存、硬盘、多媒体卡、卡型存储器、随机访问存储器(Random AccessMemory,RAM)、静态随机访问存储器(Static Random Access Memory,SRAM)、可编程只读存储器(Programmable Read Only Memory,PROM)、只读存储器(Read Only Memory,ROM)、带电可擦除可编程只读存储器(Electrically Erasable Programmable Read-Only Memory,EEPROM)、磁性存储器、磁盘、光盘等等。存储器132是能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其他介质,但不限于此。本发明实施例中的存储器132还可以是电路或者其它任意能够实现存储功能的装置,用于存储程序指令和/或数据。
请参见图14所示的视频缓存装置的另一结构示意图,该视频缓存装置还可以包括输入单元143、显示单元144、射频单元145、音频电路146、扬声器147、麦克风148、无线保真(Wireless Fidelity,WiFi)模块149、蓝牙模块1410、电源1411、外部接口1412、耳机插孔1413等部件。本领域技术人员可以理解的是,图14仅仅是视频缓存装置的举例,并不构成对视频缓存装置的限定,视频缓存装置可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件。
输入单元143可用于接收输入的数字或字符信息,以及产生与视频缓存装置的用户设置以及功能控制有关的键信号输入。例如,输入单元143可包括触摸屏1431以及其它输入设备1432。触摸屏1431可收集用户在其上或附近的触摸操作(比如用户使用手指、关节、触笔等任何适合的物体在触摸屏1431上或在触摸屏1431附近的操作),即触摸屏1431可用于检测触摸压力以及触摸输入位置和触摸输入面积,并根据预先设定的程序驱动相应的连接装置。触摸屏1431可以检测用户对触摸屏1431的触控操作,将触控操作转换为触控信号发送给处理器131,或者理解为可将触控操作的触控信息发送给处理器131,并能接收处理器131发来的命令并加以执行。触控信息至少可以包括压力大小信息和压力持续时长信息中的至少一种。触摸屏1431可以提供视频缓存装置和用户之间的输入界面和输出界面。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现触摸屏1431。除了触摸屏1431,输入单元143还可以包括其它输入设备1432。比如,其它输入设备1432可以包括但不限于物理键盘、功能键(比如音量控制按键、开关按键等)、轨迹球、鼠标、操作杆等中的一种或多种。
显示单元144可用于显示由用户输入的信息或提供给用户的信息以及视频缓存装置的各种菜单。进一步的,触摸屏1431可覆盖显示单元144,当触摸屏1431检测到在其上或附近的触控操作后,传送给处理器131以确定的触控操作的压力信息。在本发明实施例中,触摸屏1431与显示单元144可以集成为一个部件而实现视频缓存装置的输入、输出、显示功能。为便于描述,本发明实施例以触摸屏1431代表触摸屏1431和显示单元144的功能集合为例进行示意性说明,当然在某些实施例中,触摸屏1431与显示单元144也可以作为两个独立的部件。
当显示单元144和触摸板以层的形式彼此叠加以形成触摸屏1431时,显示单元144可以用作输入装置和输出装置,在作为输出装置时,可以用于显示图像,例如实现对各种视频的播放。显示单元144可以包括液晶显示器(Liquid Crystal Display,LCD)、薄膜晶体管液晶显示器(Thin Film Transistor Liquid Crystal Display,TFT-LCD)、有机发光二极管(Organic Light Emitting Diode,OLED)显示器、有源矩阵有机发光二极体(ActiveMatrix Organic Light Emitting Diode,AMOLED)显示器、平面转换(In-PlaneSwitching,IPS)显示器、柔性显示器、3D显示器等等中的至少一种。这些显示器中的一些可以被构造为透明状以允许用户从外部观看,这可以称为透明显示器,根据特定想要的实施方式,视频缓存装置可以包括两个或更多显示单元(或其它显示装置),例如,视频缓存装置可以包括外部显示单元(图14未示出)和内部显示单元(图14未示出)。
射频单元145可用于收发信息或通话过程中信号的接收和发送。通常,射频电路包括但不限于天线、至少一个放大器、收发信机、耦合器、低噪声放大器(Low NoiseAmplifier,LNA)、双工器等。此外,射频单元145还可以通过无线通信与网络设备和其它设备通信。无线通信可以使用任一通信标准或协议,包括但不限于全球移动通讯***(GlobalSystem of Mobile communication,GSM)、通用分组无线服务(General Packet RadioService,GPRS)、码分多址(Code Division Multiple Access,CDMA)、宽带码分多址(Wideband Code Division Multiple Access,WCDMA)、长期演进(Long Term Evolution,LTE)、电子邮件、短消息服务(Short Messaging Service,SMS)等。
音频电路146、扬声器147、麦克风148可提供用户与视频缓存装置之间的音频接口。音频电路146可将接收到的音频数据转换后的电信号,传输到扬声器147,由扬声器147转换为声音信号输出。另一方面,麦克风148将收集的声音信号转换为电信号,由音频电路146接收后转换为音频数据,再将音频数据输出处理器131处理后,经射频单元145以发送给比如另一电子设备,或者将音频数据输出至存储器132以便进一步处理,音频电路也可以包括耳机插孔1413,用于提供音频电路和耳机之间的连接接口。
WiFi属于短距离无线传输技术,视频缓存装置通过WiFi模块149可以帮助用户收发电子邮件、浏览网页和访问流式媒体等,它为用户提供了无线的宽带互联网访问。虽然图14示出了WiFi模块149,但是可以理解的是,其并不属于视频缓存装置的必须构成,完全可以根据需要在不改变发明的本质的范围内而省略。
蓝牙是一种短距离无线通讯技术。利用蓝牙技术,能够有效地简化掌上电脑、笔记本电脑和手机等移动通信终端设备之间的通信,也能够成功地简化以上这些设备与因特网(Internet)之间的通信,视频缓存装置通过蓝牙模块1410使视频缓存装置与因特网之间的数据传输变得更加迅速高效,为无线通信拓宽道路。蓝牙技术是能够实现语音和数据无线传输的开放性方案。虽然图14示出了WiFi模块149,但是可以理解的是,其并不属于视频缓存装置的必须构成,完全可以根据需要在不改变发明的本质的范围内而省略。
视频缓存装置还可以包括电源1411(比如电池),其用于接收外部电力或为视频缓存装置内的各个部件供电。优选的,电源1411可以通过电源管理***与处理器131逻辑相连,从而通过电源管理***实现管理充电、放电、以及功耗管理等功能。
视频缓存装置还可以包括外部接口1412,该外部接口1412可以包括标准的MicroUSB接口,也可以包括多针连接器,可以用于连接视频缓存装置与其它设备进行通信,也可以用于连接充电器为视频缓存装置充电。
尽管未示出,视频缓存装置还可以包括摄像头、闪光灯等其它可能的功能模块,在此不再赘述。
基于同一发明构思,本发明实施例还提供一种计算机可读存储介质,该可读存储介质存储有计算机指令,当该计算机指令在计算机上运行时,使得计算机执行如前述的视频缓存方法的步骤。
在一些可能的实施方式中,本发明提供的视频缓存方法的各个方面还可以实现为一种程序产品的形式,其包括程序代码,当所述程序产品在终端设备上运行时,所述程序代码用于使所述终端设备执行本说明书上述描述的根据本发明各种示例性实施方式的视频缓存方法中的步骤。
应当注意,尽管在上文详细描述中提及了装置的若干单元或子单元,但是这种划分仅仅是示例性的并非强制性的。实际上,根据本发明的实施方式,上文描述的两个或更多单元的特征和功能可以在一个单元中具体化。反之,上文描述的一个单元的特征和功能可以进一步划分为由多个单元来具体化。
此外,尽管在附图中以特定顺序描述了本发明方法的操作,但是,这并非要求或者暗示必须按照该特定顺序来执行这些操作,或是必须执行全部所示的操作才能实现期望的结果。附加地或备选地,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。
本领域内的技术人员应明白,本发明的实施例可提供为方法、***、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(***)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
Claims (10)
1.一种视频缓存方法,其特征在于,所述方法包括:
基于对视频播放程序的操作向服务器发送针对目标视频的视频播放请求,并接收所述服务器响应于所述视频播放请求发送的目标视频流,所述目标视频流包括I帧数据帧和非I帧数据帧,所述非I帧数据帧包括B帧数据帧和P帧数据帧;
将已缓存的I帧被释放后得到的空闲内存置于空闲内存缓冲队列包括的大缓冲队列中;以及,
将已缓存的B帧和P帧被释放后得到的空闲内存置于所述空闲内存缓冲队列包括的小缓冲队列中;其中,所述大缓冲队列中的每个空闲内存的内存量均大于所述小缓冲队列中的空闲内存的内存量;
根据所述I帧数据帧的数据帧数量从所述大缓冲队列中确定相等数量的空闲内存;
以及,根据所述非I帧数据帧的数据帧数量从所述小缓冲队列中确定相等数量的空闲内存;
利用获取的空闲内存,将所述I帧数据帧缓存于I帧数据帧对应的数据缓冲队列中;以及,
利用获取的空闲内存,将所述非I帧数据帧缓存于非I帧数据帧对应的数据缓冲队列中;
根据用户选择的视频播放场景或者上一视频播放周期的视频缓存信息及网络状态,确定目标缓存量;其中,所述视频播放场景用于指示视频片源的特性;
在利用获取的目标空闲内存缓存的数据帧的数量达到所述目标缓存量时,对已缓存的数据帧进行解码播放所述目标视频。
2.如权利要求1所述的方法,其特征在于,利用获取的目标空闲内存,将所述I帧数据帧和所述非I帧数据帧缓存于不同的数据缓冲队列中,包括:
根据所述目标视频流中的数据帧的获得顺序,依次为每个数据帧设置缓存顺序标记;其中,所述缓存顺序标记用于指示数据帧的解码顺序;
按照设置的缓存顺序标记,利用获取的目标空闲内存分别将所述I帧数据帧和所述非I帧数据帧缓存于不同的数据缓冲队列中。
3.如权利要求2所述的方法,其特征在于,根据所述目标视频流中的数据帧的获得顺序,依次为每个数据帧设置缓存顺序标记,包括:
根据所述目标视频流中的I帧数据帧的获得顺序,为每个I帧设置一级顺序标记,以及针对以每个I帧作为基准编码I帧的B帧和P帧设置两级顺序标记,所述两级顺序标记的第一级顺序标记为其对应的基准编码I帧的顺序标记,第二级顺序标记根据B帧和P帧的获得顺序设置。
4.如权利要求1所述的方法,其特征在于,根据所述目标视频流,从空闲内存缓冲队列中获取目标空闲内存,包括:
在所述空闲内存缓冲队列不为空时,则根据所述I帧数据帧和所述非I帧数据帧分别包括的数据帧数量,从所述空闲内存缓冲队列中获取所述目标空闲内存;
在所述空闲内存缓冲队列为空且满足预定等待条件时,则等待所述空闲内存缓冲队列中置入空闲内存,并从置入的空闲内存中获取所述目标空闲内存。
5.如权利要求4所述的方法,其特征在于,还包括:
在所述空闲内存缓冲队列为空但不满足所述预定等待条件时,则根据所述I帧数据帧和所述非I帧数据帧分别包括的数据帧的数据量申请内存;
利用申请的内存分别将所述I帧数据帧和所述非I帧数据帧缓存于不同的数据缓冲队列中。
6.一种视频缓存装置,其特征在于,所述装置包括:
数据获得模块,用于基于对视频播放程序的操作向服务器发送针对目标视频的视频播放请求,并接收所述服务器响应于所述视频播放请求发送的目标视频流,所述目标视频流包括I帧数据帧和非I帧数据帧,所述非I帧数据帧包括B帧数据帧和P帧数据帧;
内存获得模块,用于将已缓存的I帧被释放后得到的空闲内存置于空闲内存缓冲队列包括的大缓冲队列中;以及,将已缓存的B帧和P帧被释放后得到的空闲内存置于所述空闲内存缓冲队列包括的小缓冲队列中;其中,所述大缓冲队列中的每个空闲内存的内存量均大于所述小缓冲队列中的空闲内存的内存量;根据所述I帧数据帧的数据帧数量从所述大缓冲队列中确定相等数量的空闲内存,以及,根据所述非I帧数据帧的数据帧数量从所述小缓冲队列中确定相等数量的空闲内存;
缓存模块,用于利用获取的目标空闲内存,将所述I帧数据帧缓存于I帧数据帧对应的数据缓冲队列中;以及,利用获取的空闲内存,将所述非I帧数据帧缓存于非I帧数据帧对应的数据缓冲队列中;
确定模块,用于根据用户选择的视频播放场景或者上一视频播放周期的视频缓存信息及网络状态,确定目标缓存量;其中,所述视频播放场景用于指示视频片源的特性;
播放模块,用于在利用获取的目标空闲内存缓存的数据帧的数量达到所述目标缓存量时,对已缓存的数据帧进行解码播放所述目标视频。
7.如权利要求6所述的装置,其特征在于,所述缓存模块具体用于:
根据所述目标视频流中的数据帧的获得顺序,依次为每个数据帧设置缓存顺序标记;其中,所述缓存顺序标记用于指示数据帧的解码顺序;
按照设置的缓存顺序标记,利用获取的目标空闲内存分别将所述I帧数据帧和所述非I帧数据帧缓存于不同的数据缓冲队列中。
8.如权利要求7所述的装置,其特征在于,所述缓存模块具体用于:
根据所述目标视频流中的I帧数据帧的获得顺序,为每个I帧设置一级顺序标记,以及针对以每个I帧作为基准编码I帧的B帧和P帧设置两级顺序标记,所述两级顺序标记的第一级顺序标记为其对应的基准编码I帧的顺序标记,第二级顺序标记根据B帧和P帧的获得顺序设置。
9.一种视频缓存装置,其特征在于,所述装置包括:
存储器,用于存储程序指令;
处理器,用于调用所述存储器中存储的程序指令,按照获得的程序指令执行权利要求1-5中任一项所述的方法的步骤。
10.一种可读存储介质,其特征在于,所述可读存储介质存储有计算机可执行指令,所述计算机可执行指令用于使计算机执行权利要求1-5中任一项所述的方法包括的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810260499.8A CN110312156B (zh) | 2018-03-27 | 2018-03-27 | 一种视频缓存方法、装置及可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810260499.8A CN110312156B (zh) | 2018-03-27 | 2018-03-27 | 一种视频缓存方法、装置及可读存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110312156A CN110312156A (zh) | 2019-10-08 |
CN110312156B true CN110312156B (zh) | 2022-04-22 |
Family
ID=68073734
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810260499.8A Active CN110312156B (zh) | 2018-03-27 | 2018-03-27 | 一种视频缓存方法、装置及可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110312156B (zh) |
Families Citing this family (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110730364B (zh) * | 2019-10-14 | 2021-08-31 | 广州微算互联信息技术有限公司 | 一种云手机数据传输方法、装置及存储介质 |
CN110807106B (zh) * | 2019-10-31 | 2024-04-26 | 广州市网星信息技术有限公司 | 一种多媒体数据的处理方法、装置、计算机设备和存储介质 |
CN111104350A (zh) * | 2019-12-19 | 2020-05-05 | 珠海亿智电子科技有限公司 | 一种在线低延时调控方法、终端设备及存储介质 |
CN111182309B (zh) * | 2019-12-31 | 2022-09-20 | 深圳市瑞讯云技术有限公司 | 一种视频解码处理方法及装置 |
CN111757144B (zh) * | 2020-04-13 | 2022-03-08 | 湖南化工职业技术学院(湖南工业高级技工学校) | 一种网络计算机多媒体视频播放方法和*** |
CN111953990A (zh) * | 2020-07-07 | 2020-11-17 | 西安万像电子科技有限公司 | 编码方法及装置 |
CN114071224B (zh) * | 2020-07-31 | 2023-08-25 | 腾讯科技(深圳)有限公司 | 视频数据处理方法、装置、计算机设备及存储介质 |
CN112068771A (zh) * | 2020-08-17 | 2020-12-11 | Oppo广东移动通信有限公司 | 视频处理方法、视频处理装置、终端设备及存储介质 |
CN111935497B (zh) * | 2020-09-18 | 2021-01-12 | 武汉中科通达高新技术股份有限公司 | 一种用于交警***的视频流管理方法和数据服务器 |
CN112217739B (zh) * | 2020-09-30 | 2023-05-12 | 北京淳中科技股份有限公司 | 码流发送设备、码流发送方法及码流发送*** |
CN112822494A (zh) * | 2020-12-30 | 2021-05-18 | 稿定(厦门)科技有限公司 | 双缓冲编码***及其控制方法 |
CN112882682A (zh) * | 2021-02-25 | 2021-06-01 | 广州趣丸网络科技有限公司 | 一种音频录制设备中的内存复用方法、装置、设备及介质 |
CN114253683B (zh) | 2021-11-26 | 2022-11-01 | 北京百度网讯科技有限公司 | 任务处理方法、装置、电子设备及存储介质 |
CN114245180A (zh) * | 2022-01-04 | 2022-03-25 | 海信视像科技股份有限公司 | 显示设备、视频数据传输方法及存储介质 |
CN117915146B (zh) * | 2024-03-18 | 2024-06-04 | 上海朗力半导体有限公司 | 一种视频流传输方法和装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1120978A1 (en) * | 1998-08-04 | 2001-08-01 | Matsushita Electric Industrial Co., Ltd. | Apparatus capable of encoding audio/video data with decreased buffer capacity |
CN105451067A (zh) * | 2015-12-04 | 2016-03-30 | 珠海全志科技股份有限公司 | 音视频数据传输方法及其装置 |
CN105611307A (zh) * | 2015-12-17 | 2016-05-25 | 浪潮(北京)电子信息产业有限公司 | 一种基于无锁缓存队列的多路h264视频数据缓存方法及*** |
CN105657311A (zh) * | 2016-03-11 | 2016-06-08 | 深圳市极酷威视科技有限公司 | 一种视频录制方法及装置 |
-
2018
- 2018-03-27 CN CN201810260499.8A patent/CN110312156B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1120978A1 (en) * | 1998-08-04 | 2001-08-01 | Matsushita Electric Industrial Co., Ltd. | Apparatus capable of encoding audio/video data with decreased buffer capacity |
CN105451067A (zh) * | 2015-12-04 | 2016-03-30 | 珠海全志科技股份有限公司 | 音视频数据传输方法及其装置 |
CN105611307A (zh) * | 2015-12-17 | 2016-05-25 | 浪潮(北京)电子信息产业有限公司 | 一种基于无锁缓存队列的多路h264视频数据缓存方法及*** |
CN105657311A (zh) * | 2016-03-11 | 2016-06-08 | 深圳市极酷威视科技有限公司 | 一种视频录制方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN110312156A (zh) | 2019-10-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110312156B (zh) | 一种视频缓存方法、装置及可读存储介质 | |
US10895987B2 (en) | Memory compression method of electronic device and apparatus thereof | |
CN110300328B (zh) | 一种视频播放控制方法、装置及可读存储介质 | |
CN103853620B (zh) | 一种众核处理器进程间相互通信的方法、装置及*** | |
US20140086446A1 (en) | Method and apparatus for image data processing, and electronic device including the apparatus | |
US20140204103A1 (en) | Data processing system and method for task scheduling in a data processing system | |
CN109710396B (zh) | 一种信息采集及内存释放的方法及装置 | |
CN105430478B (zh) | 一种网络视频缓冲播放方法、装置及电视机 | |
US20170083262A1 (en) | System and method for controlling memory frequency using feed-forward compression statistics | |
US9335946B2 (en) | Method and apparatus for managing memory | |
CN109996104A (zh) | 一种视频播放方法、装置及电子设备 | |
CN103907095A (zh) | 移动存储器高速缓存读取优化 | |
WO2021057623A1 (zh) | 内存回收方法、装置、电子设备及存储介质 | |
CN113037929A (zh) | 一种信息接力输出方法、装置、电子设备及存储介质 | |
CN103874987B (zh) | 嵌入式多媒体卡分区存储空间调整方法和终端 | |
CN115145735B (zh) | 一种内存分配方法、装置和可读存储介质 | |
RU2656727C1 (ru) | Поверхности управления сжатием, поддерживаемые виртуальной памятью | |
CN110225399B (zh) | 流媒体处理方法、装置、计算机设备及存储介质 | |
CN108093258B (zh) | 码流数据的解码方法、计算机装置及计算机可读存储介质 | |
WO2023083064A1 (zh) | 视频处理方法、装置、电子设备及可读存储介质 | |
US20090144490A1 (en) | Method, apparatus and computer program product for providing improved memory usage | |
CN112911390B (zh) | 一种视频数据的播放方法及终端设备 | |
RU2635255C2 (ru) | Системный когерентный кэш с возможностью фрагментации/дефрагментации | |
CN115495020A (zh) | 文件处理方法、装置、电子设备和可读存储介质 | |
CN114253737A (zh) | 电子设备及其内存回收方法、介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |