一种为直播视频流同步绘制识别对象的方法与设备与流程

专利2022-05-10  32



1.本技术涉及信息技术领域,尤其涉及一种为直播视频流同步绘制识别对象的技术。


背景技术:

2.在播放直播视频时,有时候需要为正在播放的直播视频动态叠加识别对象标记。具体地,直播视频流通常包含额外的扩展数据(如sei数据),在播放直播视频流时,需要根据该额外的扩展数据绘制出识别对象。如果识别对象的绘制时刻与视频画面的播放时刻存在50毫秒以上的误差,人的感官就能明显觉察到延迟,导致用户体验不佳。


技术实现要素:

3.本技术的一个目的是提供一种为直播视频流同步绘制识别对象的方法与设备。
4.根据本技术的一个方面,提供了一种为直播视频流同步绘制识别对象的方法,其中,所述方法包括:
5.获取直播视频流,其中,所述直播视频流包括视频数据和sei数据;
6.当所获取的所述直播视频流达到预定容量阈值,对所述直播视频流进行解析,根据时间信息将所述直播视频流中的所述sei数据存入sei队列中;
7.在播放所述直播视频流时,根据当前播放时间信息从所述sei队列中取得对应的sei数据;
8.根据所述当前播放时间信息对应的sei数据,在所述直播视频流的播放画面上绘制对应的识别对象。
9.根据本技术的另一个方面,还提供了一种为直播视频流同步绘制识别对象的设备,其中,所述设备包括:视频流获取模块、视频流解析模块、视频流合成模块、sei同步器模块、sei解析模块、播放模块和绘制模块;
10.所述视频流获取模块用于获取直播视频流;
11.当所述视频流获取模块所获取的所述直播视频流达到预定容量阈值,所述视频流解析模块用于对所述直播视频流进行解析,所述视频流合成模块用于根据时间信息将所述直播视频流中的所述sei数据存入sei队列中;
12.所述播放模块用于播放所述直播视频流,所述sei同步器模块用于根据所述直播视频流的当前播放时间信息从所述sei队列中取得对应的sei数据;
13.所述sei同步器模块用于将所述当前播放时间信息对应的sei数据传递至所述sei解析模块,所述sei解析模块用于对所述当前播放时间信息对应的sei数据进行解析,所述绘制模块用于在所述直播视频流的播放画面上绘制对应的识别对象。
14.根据本技术的又一个方面,还提供了一种计算设备,其中,该设备包括用于存储计算机程序指令的存储器和用于执行计算机程序指令的处理器,其中,当该计算机程序指令被该处理器执行时,触发所述设备执行所述的为直播视频流同步绘制识别对象的方法。
15.根据本技术的又一个方面,还提供了一种计算机可读介质,其上存储有计算机程序指令,所述计算机可读指令可被处理器执行以实现所述的为直播视频流同步绘制识别对象的方法。
16.本技术提供的方案中,先获取包含视频数据和sei数据的直播视频流;当所获取的所述直播视频流达到预定容量阈值,对所述直播视频流进行解析,根据时间信息将所述直播视频流中的所述sei数据存入sei队列中;在播放所述直播视频流时,根据当前播放时间信息从所述sei队列中取得对应的sei数据;然后根据所述当前播放时间信息对应的sei数据,在所述直播视频流的播放画面上绘制对应的识别对象。本技术在获取直播视频流的时候,同步获取视频数据和sei数据;在直播视频播放的同时,根据所述sei数据快速地绘制识别对象,控制识别对象的绘制时刻与视频画面的播放时刻保持精准同步,让用户的感官觉察不到延迟,有效地提升了用户体验。
附图说明
17.通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本技术的其他特征、目的和优点将会变得更明显:
18.图1是根据本技术实施例的一种为直播视频流同步绘制识别对象的方法流程图;
19.图2是根据本技术实施例的一种为直播视频流同步绘制识别对象的设备工作流程图;
20.图3是根据本技术实施例的一种为直播视频流同步绘制识别对象的效果示意图;
21.图4是根据本技术实施例的一种视频流获取模块的工作流程图;
22.图5是根据本技术实施例的一种视频流单元的数据结构示意图;
23.图6是根据本技术实施例的一种naluitem数据的结构示意图。
24.附图中相同或相似的附图标记代表相同或相似的部件。
具体实施方式
25.下面结合附图对本技术作进一步详细描述。
26.在本技术一个典型的配置中,终端、服务网络的设备和可信方均包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。
27.内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flash ram)。内存是计算机可读介质的示例。
28.计算机可读介质包括永久性和非永久性、可移动和非可移动媒体,可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的装置或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘(cd

rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。
29.本技术实施例提供了为直播视频流同步绘制识别对象的方法,在获取直播视频流
的时候,同步获取视频数据和sei数据;在直播视频播放的同时,根据所述sei数据快速地绘制识别对象,控制识别对象的绘制时刻与视频画面的播放时刻保持精准同步。
30.在实际场景中,实现该方法的设备可以是用户设备、网络设备或者用户设备与网络设备通过网络相集成所构成的设备。其中,所述用户设备包括但不限于智能手机、平板电脑、个人计算机(pc)等终端设备,所述网络设备包括但不限于网络主机、单个网络服务器、多个网络服务器集或基于云计算的计算机集合等实现。在此,云由基于云计算(cloud computing)的大量主机或网络服务器构成,其中,云计算是分布式计算的一种,由一群松散耦合的计算机集组成的一个虚拟计算机。
31.图1是根据本技术实施例的一种为直播视频流同步绘制识别对象的方法流程图,该方法包括步骤s101、步骤s102、步骤s103和步骤s104。
32.步骤s101,获取直播视频流,其中,所述直播视频流包括视频数据和sei数据;
33.步骤s102,当所获取的所述直播视频流达到预定容量阈值,对所述直播视频流进行解析,根据时间信息将所述直播视频流中的所述sei数据存入sei队列中;
34.步骤s103,在播放所述直播视频流时,根据当前播放时间信息从所述sei队列中取得对应的sei数据;
35.步骤s104,根据所述当前播放时间信息对应的sei数据,在所述直播视频流的播放画面上绘制对应的识别对象。
36.在此,所述直播视频流包括视频数据和sei(supplemental enhancement information,补充增强信息)数据;所述sei数据是额外的扩展数据,包含所述识别对象的相关信息。
37.例如,所述直播视频流可以采用h.264等格式,基于http flv等协议。可以在h5页面中播放所述直播视频流,h5页面中video元素支持mp4、webm、ogg等格式;可以将所述直播视频流转换为mp4、webm、ogg等h5页面支持的格式之后,再播放所述直播视频流。
38.在获取所述直播视频流之后,需要对所述直播视频流进行解析。而视频流是一种不稳定的结构,会受到各种因素的影响,有时候获取的比较多,有时候获取的比较少。在本技术实施例中,提供了一个用于存储直播视频流数据的空间(即缓存区)。在获取所述直播视频流之后,并不是立刻对所述直播视频流进行解析;当所获取的所述直播视频流达到预定容量阈值,再对所述直播视频流进行解析,分析出所述直播视频流中的视频数据和sei数据。
39.在对所述直播视频流进行解析的同时,还需要将所述直播视频流转换为mp4、webm、ogg等视频播放页面支持的格式。例如,可以根据mse(media source extensions,媒体源扩展)规则对所述直播视频流进行解析,所述直播视频流会带有时间戳(timestamp),在解析的过程中,所述sei数据也会携带时间信息。在所述步骤s102中,可以根据时间信息将所述直播视频流中的所述sei数据存入sei队列(如seiqueue)中。其中,所述sei队列是一个用于存放所述sei数据的队列,位于计算机的内存中。
40.在所述步骤s103中,在播放所述直播视频流时,可以获取到所述直播视频流的当前播放时间信息(如currenttime)。然后,可以根据所述当前播放时间信息(如currenttime),从所述sei队列(如seiqueue)中获取对应的sei数据。例如,currenttime对应的sei数据可以包括:时间信息小于或等于currenttime,并且与currenttime差距最小的
sei数据。在所述步骤s104中,可以将所述当前播放时间信息对应的sei数据交给h5页面中的canvas元素进行处理,在所述直播视频流的播放画面上同步绘制对应的识别对象。
41.例如,如图2所示,一种为直播视频流同步绘制识别对象的设备包括视频流获取模块(如io

controller)、视频流解析模块(如flv

demuxer)、视频流合成模块(如mp4

remuxer)、sei同步器模块(如seisynchronizer)、sei解析模块(如seiparse)、播放模块(如h5页面中的video元素)和绘制模块(如h5页面中的canvas元素)。
42.所述视频流获取模块(如io

controller)用于获取直播视频流;当所述视频流获取模块(如io

controller)所获取的所述直播视频流达到预定容量阈值,由所述视频流解析模块(如flv

demuxer)对所述直播视频流进行解析,所述视频流合成模块(如mp4

remuxer)处理所述视频流解析模块(如flv

demuxer)解析后的数据,合成h5页面中的video元素支持的格式(如mp4、webm、ogg等格式),同时根据时间信息将所述直播视频流中的sei数据存入sei队列中,交给所述sei同步器模块(如seisynchronizer)处理。所述sei同步器模块(如seisynchronizer)定时获取所述播放模块(如h5页面中的video元素)的当前播放时间信息(如currenttime),并根据所述当前播放时间信息匹配对应的(如时间信息在当前播放时间信息及之前,并且最为接近的)sei数据。再由所述sei解析模块(如seiparse)解析所述当前播放时间信息对应的sei数据,得到的解析数据(包括位置信息,如坐标信息等)由所述绘制模块(如h5页面中的canvas元素)处理。在播放直播视频的h5页面中,canvas元素覆盖在video元素上,如图3所示,canvas元素和video元素在页面中的位置是一样的,宽高寸尺也一致;人在视觉上的感受是,在直播视频画面上出现了所述识别对象。
43.在一些实施例中,所述步骤s101包括:获取直播视频流,检测所获取的所述直播视频流的数据大小,若所获取的所述直播视频流的数据大小未超过缓存区的容量大小,则将所获取的所述直播视频流存入所述缓存区,其中,所述缓存区的容量大小即为所述预定容量阈值。
44.例如,视频流是一种不稳定的结构,每次获取直播视频流的数据大小随网络波动,有时候获取的比较多,有时候获取的比较少。所述缓存区是用于存储直播视频流数据的空间,位于计算机的内存中。在此,可以对每次获取的直播视频流数据和所述缓存区(如stashbuffer)的数据大小进行阈值检测;若所获取的所述直播视频流的数据大小未超过所述预定容量阈值,则继续将所获取的所述直播视频流存入所述缓存区;若所获取的所述直播视频流的数据大小超过所述预定容量阈值,则触发所述视频流解析模块(如图2所示的flv

demuxer)进行数据解析。在此,可以避免频繁触发所述视频流解析模块进行数据解析,避免系统资源浪费。
45.如图4所示,所述视频流获取模块(如io

controller)获取直播视频流之后,进行计算处理,并将所获取的所述直播视频流存入所述缓存区(如stashbuffer)。同时,根据stashused chunk.bytelength<=stashsize是否成立来进行判断。
46.例如,如图4所示,若stashused chunk.bytelength<=stashsize成立,使用stashbuffer来保存一部分数据,这样可以避免每次获取直播视频流的chunk时都进行dispatchchunks。具体地,可以将chunk追加在stashbuffer中;stashused加上chunk.bytelength。
47.例如,如图4所示,若stashused chunk.bytelength<=stashsize不成立,则判断
stashused==0是否成立。若stashused==0成立,stashbuffer中没有剩余的数据,直接使用本次传过来的数据触dispatchchunks。具体地,(1)fivdemuxer进行嗅探解析chunk数据(chunk,bytestart);(2)flvdemuxer按照规则解析,返回解析后消费的chunk数量consumed;(3)如果consumed<chunk.bytelength则执行后续步骤((4)~(7)),否则不执行任何操作;(4)消费剩余的数据长度remain=chunk.bytelength

consumed,在remain的值大于stashbuffer的空间大小buffersize的时候,需要对stashbuffer进行空间扩展;(5)将剩余数据remainarray存储在stashbuffer中;(6)stashused的值等于stashused原来的值加上remainarray.bytelength;(7)stashbytestart=bytestart consumed,此外stashbytestart的值加上consumed也可以。
48.例如,如图4所示,若stashused chunk.bytelength<=stashsize不成立,并且stashused==0也不成立,stashbuffer中有剩余的数据,直接使用stashbuffer中剩余的数据buffer进行dispatchchunks。具体地,(1)flvdemuxer进行嗅探解析buffer数据(buffer,stashbytestart);(2)flvdemuxer按照规则解析,返回解析后消费的buffer数量consumed;(3)如果consumed小于buffer.bytelength且consumed>0,则执行后续步骤((4)~(6)及(10)~(12));(4)buffer数据中有剩余数据remainarray,将剩余数据remainarray存储在stashbuffer中;(5)设置stashused值,stashused=remainarray.bytelength;(6)stashbytestart追加上使用的数据量consumed,即stashbytestart=stashbytestart consumed;(7)如果consumed等于buffer.bytelength,则执行后续步骤((8)~(12));(8)buffer数据全部被消费,stashused=0;(9)stashbytestart追加上使用的数据量consumed,即stashbytestart=stashbytestart consumed;(10)当消费剩余的可用数据长度stashused的值加上chunk.bytelength大于stashbuffer的空间大小buffersize的时候,需要对stashbuffer进行空间扩展;(11)将chunk数据追加在stashbuffer中,从stashused位置追加保证数据的顺序;(12)stashused加上chunk.bytelength,即stashused=stashused chunk.bytelength。
49.在一些实施例中,所述步骤s102包括:当所获取的所述直播视频流达到所述预定容量阈值,对所述直播视频流进行解析,得到消费视频流数据的大小,将未消费的视频流数据重新存入所述缓存区。
50.例如,所述视频流解析模块(如flv

demuxer)对所述直播视频流进行解析之后,得到消费视频流数据的字节数consumed,并将未消费的视频流数据重新存入所述缓存区(如stashbuffer)。其中,消费视频流数据是指本次能合成视频所消费的数据,未消费的视频流数据是指本次未能合成视频的数据。
51.在一些实施例中,所述步骤s102包括:对所述直播视频流的数据块进行解析,得到若干个视频流单元;其中,所述视频流单元的结构包括tagtype、datasize、timestamp、steamid、data和prevtagsize,所述tagtype用于记录所述视频流单元的类型信息,所述datasize用于记录所述视频流单元中的真实数据的数据大小,所述timestamp用于记录时间戳信息,所述steamid用于记录所述视频流单元的标识信息,所述data用于记录所述视频流单元中的真实数据,所述prevtagsize用于记录所述视频流单元的前一个视频流单元的数据大小。
52.例如,所述视频流解析模块(如flv

demuxer)获取到所述直播视频流之后,需要对
所述直播视频流的数据块(chunks)进行解析,将所述直播视频流的数据块(chunks)解析为若干个视频流单元chunkitem(如flv协议的单元),分析出可用的chunkitem。此外,还可以把完成解析的数据字节长度返回至所述视频流获取模块(如io

controller),配合所述缓存区(如stashbuffer)存储使用。
53.例如,如图5所示,每个视频流单元chunkitem的结构包括tagtype、datasize、timestamp、steamid、data和prevtagsize。其中,tagtype表示chunkitem的类型,占据三个字节长度,比如音频(audio)的tagtype值为8,视频(video)为9,scriptdataobject对象为18。datasize表示真实数据部分的字节数量,占据3个字节长度。timestamp表示时间戳,占据4个字节长度。steamid表示chukitem的标识信息,占据3个字节长度。data表示的是chunkitem中的真实数据,占据datasize的值的字节长度。prevtagsize表示前一个chunkitem的长度。所以chunkitem的字节长度等于tagtype长度、datasize长度、timestamp长度、steamid长度、data长度以及prevtagsize长度的和,即chunkitemlength=1 3 4 3 datasize的值 4)。chunkitem的开始位置为offset,第一个chunkitem的offset为0;下一个chunkitem开始的位置,等于上一个chunkitem的offset加上chunkitemlength的值dataoffset。如此利用chunkitemlength的值去读取chunks得到每一个chunkitem数据,并且解析chunkitem。
54.在一些实施例中,所述步骤s102包括:建立videotrack对象,其中,所述videotrack对象的samples用于存放所述直播视频流的解析数据;对所述直播视频流的数据块进行解析,得到若干个所述视频流单元,依次读取并解析每个所述视频流单元。
55.例如,在读取并解析所述直播视频流的数据块(chunks)之前,需要建立用于存放解析数据的videotrack对象(视频数据存储空间对象),其中,videotrack对象的samples存放所述直播视频流的解析数据。
56.在一些实施例中,所述步骤s102包括:根据所述tagtype判断所述视频流单元是否为视频数据,若所述视频流单元为视频数据,解析所述真实数据的第一个字节,并将所述真实数据的第一个字节的解析值记为frametype;解析所述真实数据的第二个字节,并将所述真实数据的第二个字节的解析值记为packettype,其中,所述packettype的值为0表示所述真实数据是视频配置信息,所述packettype的值为1表示所述真实数据是视频样品;若所述packettype的值为0,解析视频配置信息得到nalulengthsize的长度;若所述packettype的值为1,解析naluitem,构建视频样品avcsample对象。
57.例如,在解析每个所述视频流单元chunkitem时:(1)chunkitem的字节第一位为tagtype,第二位到第四位为真实数据realdata的字节长度datasize,第五位到第八位代表时间戳timestamp,比如当tagtype为9的时候表示视频解析数据。(2)对真实数据realdata(从dataoffset的值开始的位置到datasize的值为真实数据realdata)的第一个字节进行解析,并且将其解析值记为frametype(关键帧标记位)。(3)对真实数据realdata进行解析,从第二个字节解析得到的值为packettype,其中,packettype值为0代表配置信息,为1则表示视频样品;真实数据realdata字节的第三位到第五位的值为cts。(4)当packettype的值等于0的时候,解析视频配置信息得到nalulengthsize的长度。(5)当packettype的值等于1的时候,解析naluitem,构建视频样品avcsample对象。(6)读取下一个chunkitem,然后继续执行步骤(1),重复这些步骤,直到读取完所有的chunks;读取完毕的时候,执行所述视频流
合成模块(如mp4

remuxer),同时返回给所述视频流获取模块(如io

controller)消费视频流数据的字节数consumed。
58.例如,如图6所示,从真实数据realdata字节的第六位开始解析,得到视频数据和额外的扩展数据(即nalus),生成视频样品avcsample对象。naluitem的开始位置为naluoffset,第一个nalitem的naluoffset为0;下一个naluitem开始的位置,等于前一个naluitem的naluoffset加上nalulengthsize以及naluitem前nalulengthsize位的值(即naluitem前三位或者前四位的值);如此反复地去读取nalus,得到每一个naluitem数据,并且解析naluitem。naluitem字节的第四位或者第五位为nalutype(主要取决于nalulengthsize占据的字节为3位或者4位),nalutype的值有很多(5或6或其他);当nalutype为5的时候再一次确认是关键帧。若真实数据realdata的第一个字节的解析值frametype为1,或者本次解析nalus中任何一个naluitem的nalutype为5时,都会得到keyframe为真,即确认是关键帧。解析naluitem时会生成每一个存储nalu对象的unit数据,比如,{type:5,data:数据}或者{type:6,data:数据,nalulengthsize:nalulengthsize}。type属性值为nalutype;以及数据data数据,保存的结果为naluitem在chucks的中的数据,本次解析的真实数据realdata的开始位置加上nalulengthsize和当前解析naluitem的前nalulengthsize位的值之间的数据,比如:realdata在chucks的开始位置为16字节处,nalulengthsize为3字节,naluitem的前三位的值为20,则data数据为chucks的16字节开始到39字节处的数据;当nalutype为6的时候,还需要构建额外的属性nalulengthsize,值为3或者4。对nalus解析完毕后,可以得到存储unit的units数组,此时可以构建avcsample对象。avcsample含有units属性值为units、iskeyframe属性值为keyframe、dts属性值为timestamp(时间信息),然后将avcsample存入videotrack的samples属性中。
59.在一些实施例中,所述步骤s102包括:获取所述直播视频流的解析数据,根据时间信息将所述直播视频流中的所述sei数据存入sei队列中。
60.例如,所述视频流合成模块(如mp4

remuxer)在接收到所述视频流解析模块(如flv

demuxer)传递的videotrack对象之后,对videotrack对象的samples中的每一项进行处理,在每个sampleitem(即avcsample对象)中找到units中有type为6的unit即sei数据,比如,{type:6,nalulengthsize,data:数据},nalulengthsize为3或者4。然后可以分析得到的sei数据,给sei数据增加上额外的payloadtype(sei的data数据的nalulengthsize后的第二位值,理论为5)、payloadsize(sei的data数据中可用的数据的长度,包含uuid的长度)、uuid(sei的data数据中可用的数据的前16位,描述的是sei数据的规则,比如厂商的唯一识别信息,决定了所述sei解析模块的解析规则)以及payloadbyteoffset(sei的data数据中可用的数据的真实自定义的偏移位置,所述识别对象的数据,不包含uuid的长度)。在所述步骤s102中,将sei数据交给所述sei同步器模块(如seisynchronizer),存入所述sei队列(如seiqueue)中。
61.在一些实施例中,所述步骤s103包括:在播放所述直播视频流时,每隔预定时间间隔,获取所述直播视频流的当前播放时间信息;根据所述当前播放时间信息从所述sei队列中取得对应的sei数据。
62.例如,所述sei同步器模块(如seisynchronizer)接收到所述视频流合成模块(如mp4

remuxer)传递的dts时间信息和sei数据,将其存入所述sei队列(如seiqueue)中。所述
sei同步器模块(如seisynchronizer)定时询问所述播放模块(如h5页面中的video元素)的当前播放时间信息(如currenttime),并从所述sei队列(如seiqueue)中取得所述当前播放时间信息对应的sei数据。在此,所述当前播放时间信息(如currenttime)对应的sei数据可以通过比较dts时间信息和currenttime来确定,时间信息在当前播放时间信息或其之前,并且时间信息与当前播放时间信息最为接近的sei数据。然后,将所述当前播放时间信息对应的sei数据传递至所述sei解析模块(如seiparse)。在此过程中,所述sei队列(如seiqueue)清除了在所述当前播放时间信息(如currenttime)之前的数据,确保了所述sei队列不至于过大。
63.在一些实施例中,所述步骤s104包括:解析所述当前播放时间信息对应的sei数据,得到所述识别对象的位置信息和/或内容信息;在所述直播视频流的播放画面上绘制所述识别对象。
64.例如,所述sei解析模块(如seiparse)接收到所述sei同步器模块(如seisynchronizer)传递的所述当前播放时间信息对应的sei数据,按照约定的解析规则进行效验和解析,返回对应的位置信息或者内容信息等。在此,所述sei解析模块可以根据uuid选择不同的解析规则)。然后,所述sei解析模块(如seiparse)将sei数据的解析信息传递至所述绘制模块(如h5页面中的canvas元素)。在播放直播视频的h5页面中,如图3所示,canvas元素和video元素在页面中的位置是一样的,宽高寸尺也保持一致;所述绘制模块通过定位的方式,根据sei数据的解析信息进行绘制,将canvas元素覆盖在video元素上,背景设置为透明色。此外,所述绘制模块每次绘制数据前还会清理上一次绘制的数据。
65.在一些实施例中,如图2所示,所述步骤s101包括:通过视频流获取模块(如io

controller)获取所述直播视频流;所述步骤s102包括:当所述视频流获取模块(如io

controller)所获取的所述直播视频流达到预定容量阈值,通过视频流解析模块(如flv

demuxer)对所述直播视频流进行解析,利用视频流合成模块(如mp4

remuxer)根据时间信息将所述直播视频流中的所述sei数据存入sei队列中;所述步骤s103包括:在通过播放模块(如h5页面中的video元素)播放所述直播视频流时,利用sei同步器模块(如seisynchronizer)根据当前播放时间信息从所述sei队列中取得对应的sei数据;所述步骤s104包括:通过所述sei同步器模块(如seisynchronizer)将所述当前播放时间信息对应的sei数据传递至sei解析模块(如seiparse),利用所述sei解析模块(如seiparse)对所述当前播放时间信息对应的sei数据进行解析,再利用绘制模块(如h5页面中的canvas元素)在所述直播视频流的播放画面上绘制对应的识别对象。
66.根据本技术实施例,还提供了一种为直播视频流同步绘制识别对象的设备,其中,所述设备包括:视频流获取模块、视频流解析模块、视频流合成模块、sei同步器模块、sei解析模块、播放模块和绘制模块。
67.如图2所示,所述视频流获取模块(如io

controller)用于获取直播视频流;当所述视频流获取模块(如io

controller)所获取的所述直播视频流达到预定容量阈值,所述视频流解析模块(如flv

demuxer)用于对所述直播视频流进行解析,所述视频流合成模块(如mp4

remuxer)用于根据时间信息将所述直播视频流中的所述sei数据存入sei队列中;所述播放模块(如h5页面中的video元素)用于播放所述直播视频流,所述sei同步器模块(如seisynchronizer)用于根据所述直播视频流的当前播放时间信息从所述sei队列中取
得对应的sei数据;所述sei同步器模块(如seisynchronizer)用于将所述当前播放时间信息对应的sei数据传递至所述sei解析模块(如seiparse),所述sei解析模块(如seiparse)用于对所述当前播放时间信息对应的sei数据进行解析,所述绘制模块(如h5页面中的canvas元素)用于在所述直播视频流的播放画面上绘制对应的识别对象。
68.综上所述,本技术实施例在获取直播视频流的时候,同步获取视频数据和sei数据;在直播视频播放的同时,根据所述sei数据快速地绘制识别对象,控制识别对象的绘制时刻与视频画面的播放时刻保持精准同步,让用户的感官觉察不到延迟,有效地提升了用户体验。
69.另外,本技术的一部分可被应用为计算机程序产品,例如计算机程序指令,当其被计算机执行时,通过该计算机的操作,可以调用或提供根据本技术的方法和/或技术方案。而调用本技术的方法的程序指令,可能被存储在固定的或可移动的记录介质中,和/或通过广播或其他信号承载媒体中的数据流而被传输,和/或被存储在根据程序指令运行的计算机设备的工作存储器中。在此,本技术的一些实施例提供了一种计算设备,该设备包括用于存储计算机程序指令的存储器和用于执行计算机程序指令的处理器,其中,当该计算机程序指令被该处理器执行时,触发所述设备执行前述本技术的多个实施例的方法和/或技术方案。
70.此外,本技术的一些实施例还提供了一种计算机可读介质,其上存储有计算机程序指令,所述计算机可读指令可被处理器执行以实现前述本技术的多个实施例的方法和/或技术方案。
71.需要注意的是,本技术可在软件和/或软件与硬件的组合体中被实施,例如,可采用专用集成电路(asic)、通用目的计算机或任何其他类似硬件设备来实现。在一些实施例中,本技术的软件程序可以通过处理器执行以实现上文所述步骤或功能。同样地,本技术的软件程序(包括相关的数据结构)可以被存储到计算机可读记录介质中,例如,ram存储器,磁或光驱动器或软磁盘及类似设备。另外,本技术的一些步骤或功能可采用硬件来实现,例如,作为与处理器配合从而执行各个步骤或功能的电路。
72.对于本领域技术人员而言,显然本技术不限于上述示范性实施例的细节,而且在不背离本技术的精神或基本特征的情况下,能够以其他的具体形式实现本技术。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本技术的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本技术内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。装置权利要求中陈述的多个单元或装置也可以由一个单元或装置通过软件或者硬件来实现。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。
转载请注明原文地址:https://doc.8miu.com/read-1550380.html

最新回复(0)