iOS端的低延迟视频渲染方法及装置与流程

文档序号:29318347发布日期:2022-03-19 22:16阅读:354来源:国知局
iOS端的低延迟视频渲染方法及装置与流程
ios端的低延迟视频渲染方法及装置
技术领域
1.本发明涉及数据处理领域,尤其涉及一种ios端的低延迟视频渲染方法、装置、电子设备及存储介质。


背景技术:

2.ios的视频播放或直播方案已经在业界存在多年的技术积累,现市面上关于视频播放渲染方案很多,但在云游戏场景下,要求低延迟性,即有操控反馈后需要尽快能看到反馈结果;但现有网络情况下在60fps场景下极易出现很明显的操作延迟表现(网络传输的不稳定性,视频包的到达时间不均匀),opengles渲染超60fps导致的延迟。


技术实现要素:

3.本发明的实施例提供了一种ios端的低延迟视频渲染方法及装置,可以在云游戏场景下现有网络传输不稳定或者网络抖动的情况下,优化操作延迟问题并使帧数不大于60fps,降低操作延迟表现。
4.第一方面,本发明的实施例提供了一种ios端的低延迟视频渲染方法,所述渲染方法包括:
5.使用videotoolbox对视频数据进行解码;
6.将所述解码后的视频数据存入预先自定义的缓存队列;
7.开启新的线程根据丢帧算法对解码后的视频数据进行渲染。
8.可选地,所述缓存队列采用多读单写的策略保证数据在多线程下的完整性和准确性。
9.可选地,所述开启新的线程根据丢帧算法对解码后的视频数据进行渲染包括:
10.循环读取所述缓存队列;
11.再根据丢帧算法来判断读取到的解码后的视频数据是渲染还是丢弃。
12.可选地,若没有读取到解码后的视频数据,继续循环读取所述解码后的视频数据。
13.可选地,在读取所述缓存队列中的解码后的视频数据时设置sleep,降低cpu占用。
14.可选地,所述丢帧算法包括:
15.设置丢帧阀值;
16.读取所述渲染方法中的自定义缓存队列的长度,若所述缓存队列的长度大于所述阀值,将所述解码后的视频数据丢弃并删除当前缓存数据,若所述缓存队列的长度小于所述阀值,用opengles渲染所述解码后的视频数据并以秒为单位计数。
17.可选地,针对低端机单独设置所述缓存队列阀值。
18.第二方面,本发明的实施例提供了一种ios端的低延迟视频渲染装置,所述渲染装置包括:
19.解码模块,使用videotoolbox对视频数据进行解码;
20.缓存模块,自定义一个缓存队列,将解码后的视频数据存入所述自定义缓存队列;
21.渲染模块,开启新的线程根据丢帧算法对所述解码后的视频数据进行渲染。
22.第三方面,本发明的实施例提供了一种电子设备,包括存储器和处理器,所述存储器上存储有计算机程序,所述处理器执行所述程序时实现如第一方面任一项所述的方法。
23.第四方面,本发明的实施例提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如第一方面任一项所述的方法。
24.有益效果
25.本发明实施例提供了一种ios端的低延迟视频渲染方法及装置,所述渲染方法通过使用videotoolbox对视频数据进行解码;自定义一个缓存队列,将所述解码后的视频数据存入所述自定义缓存队列;开启新的线程根据丢帧算法对所述解码后的视频数据进行渲染;可以在云游戏场景下现有网络传输不稳定或者网络抖动的情况下,优化操作延迟问题并使帧数不大于60fps,降低操作延迟表现。
26.应当理解,发明内容部分中所描述的内容并非旨在限定本发明的实施例的关键或重要特征,亦非用于限制本发明的范围。本发明的其它特征将通过以下的描述变得容易理解。
附图说明
27.为了更清楚地说明本说明书一个或多个实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
28.图1示出了本发明的实施例的一种ios端的低延迟视频渲染方法的流程图;
29.图2示出了本发明实施例的一种ios端的低延迟视频渲染装置的结构示意图;
30.图3示出了本发明的实施例的一种渲染线程的流程图;
31.图4示出了本发明的实施例的一种丢帧策略的示意图;
32.图5示出了本发明实施例的一种电子设备的结构图。
具体实施方式
33.为了使本技术领域的人员更好地理解本说明书一个或多个实施例中的技术方案,下面将结合本说明书一个或多个实施例中的附图,对本说明书一个或多个实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本说明书的一部分实施例,而不是全部的实施例。基于本说明书一个或多个实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本文件的保护范围。
34.相关技术中,相关技术中,videotoolbox,可直接访问硬件的编解码器。能够为视频提供压缩和解压缩的服务,同时也提供存储在corevideo像素缓冲区的图像进行格式的转换。
35.优点:利用gpu或者专用处理器对视频流进行编解码,不用大量占用cpu资源。性能高,很好的实时性。
36.缺点:低码率下通常质量低于软编。
37.videotoolbox数据包括:
38.cvpixelbuffer是存储在内存中的一个未压缩的光栅图像buffer,包括图像的宽度、高度等;
39.cmblockbuffer是一个任意的buffer,相当于buffer中的any.在管道中压缩视频的时候,会把它包装成cmblockbuffer。相当于cmblockbuffer代表着一个压缩的数据;
40.cmsamplebuffer可能是一个压缩的数据,也可能是一个未压缩的数据,取决于cmsamplebuffer里面是cmblockbuffer(压缩后)还是cvpixelbuffer(未压缩)。
41.对于videotoolbox,可以通过直接访问硬编解码器,将h.264文件或传输流转换为ios上的cmsamplebuffer并解码成cvpixelbuffer,或将未压缩的cvpixelbuffer编码成cmsamplebuffe(将未编码的cmsamplebuffer(cvpixelbuffer)与已编码cmsamplebuffer(cmblockbuffer)的相互转换)。
42.解码:把原始码流包装成cmsamplebuffer;
43.解码前的原始数据为h264码流,ios可以使用nsinputstream读取h264文件;
44.h264有两种封装格式,一种为mp4格式,一种是annexb格式。mp4格式是以nalu的长度分割;annexb格式是以0x00000001或0x0000000001分割;
45.videotoolbox解码使用的h264为mp4格式,因此需要替换nalu的header;
46.使用cmvideoformatdescriptioncreatefromh264parametersets将sps和pps封装成cmvideoformatdescription;
47.修改nalu的header;
48.nalu只要有两种格式:annexb和avcc。annexb格式以0x 00 00 01或0x 00 00 00 01开头,avcc格式以所在nalu的长度开头;
49.替换掉nalu的startcode;
50.使用cmblockbuffercreatewithmemoryblock接口将naluunit封装成cmblockbuffer;
51.通过cmsamplebuffercreate将cmblockbuffer+cmvideoformatdescription+cmtime创建成cmsamplebuffer。
52.解码流程:使用vtdecompressionsessioncreate创建解码会话;
53.使用vtsessionsetproperty设置会话设置;
54.使用vtdecompressionsessiondecodeframe编码视频帧,在之前设置的回调函数中获取编码后的结果;
55.回调函数返回数据;
56.使用vtcompressionsessioncompleteframes强制结束并完成编码;
57.编码完成后使用vtcompressionsessioninvalidate结束编码,并释放内存。
58.opengles:opengl是一个跨平台(不同的gpu类型,如电脑端nvidia,intel,amd的显卡,手机端powervr(苹果系列),adreno(高通,安卓系列)等等)、跨编程语言(各个编程语言java,c,oc,js等等都有opengl的接口)的图形图像处理接口,opengl本身只是一组api接口规范,具体的实现一般是由具体的显卡(gpu)设备生产商编码实现的,比如苹果手机是由apple实现的,linux系统则是由各个显卡生产商通过驱动程序导入的。
59.opengles是opengl的一个子集,是专门用来针对手机,平板电脑等嵌入式设备的图形图像处理接口,接口设计中不涉及上下文环境和窗口的管理,这由各个平台自行实现;
比如ios就是eagl,安卓就是egl。
60.opengles的工作流程:opengles接收api的输入,通过api设定顶点的信息(一般包括顶点坐标,纹理坐标,颜色,变换矩阵等等),一般由顶点着色器接收这些信息作为输入;
61.顶点着色器处理顶点坐标,前一阶段的输入将在vs中进行运算,以得到最终的顶点坐标;
62.图元装配,将顶点着色器计算出的最终顶点坐标进行图元装配,构建出最终想要渲染的图形。所有要渲染的图形都可以由三个基本的图元(点、线、三角形)组成,比如正方形或者长方形,就可以由两个三角形组成,圆形可以由无数个三角形组成,只是三角形的数量越多,圆形看上去越圆润;
63.光栅化,通过计算,将要渲染的图形上所有的像素点找到,并根据插值或者其他方式计算出其颜色等信息的过程;
64.片元着色器计算像素颜色,光栅化得到了要渲染图形的所有像素的信息,这些信息作为片元着色器的输入,那么在片元着色器中将计算像素颜色;
65.像素处理,片元着色器计算的像素颜色还不是最终要渲染的颜色,这一步骤还包括alphatest、depth/stenciltest、blend、dither等几个步骤,经过这几个步骤后得到的就是最终的渲染颜色。
66.下面以具体的实施例对本发明进行说明,需要说明的是,本技术实施例描述的仅仅是为了更加清楚的说明本技术实施例的技术方案,并不构成对本技术实施例提供的技术方案的限定。
67.图1示出了本发明的实施例的一种ios端的低延迟视频渲染方法的流程图。参见图1,所述渲染方法包括:
68.s20、使用videotoolbox对视频数据进行解码;
69.具体地,使用videotoolbox对视频数据进行解码时的总体思想是将ffmpegparse到的数据装到cmblockbuffer中,将extradata分离出的vps,sps,pps装到cmvideoformatdesc中,将计算好的时间戳装到cmtime中,最后拼成完成的cmsamplebuffer以用来提供给解码器。
70.解码的步骤包括:
71.创建formatcontext:avformat_alloc_context;
72.打开文件流:avformat_open_input;
73.寻找流信息:avformat_find_stream_info;
74.获取音视频流的索引值:
75.formatcontext-》streams[i]-》codecpar-》codec_type==(isvideostream?avmedia_type_video:avmedia_type_audio);
[0076]
获取音视频流:m_formatcontext-》streams[m_audiostreamindex];
[0077]
解析音视频数据帧:av_read_frame;
[0078]
获取extradata:av_bitstream_filter_filter;
[0079]
比较上一次的extradata,如果数据更新需要重新创建解码器;
[0080]
分离并保存ffmpegparse到的extradata中分离vps,sps,pps等关键信息(比较nalu头)通过cmvideoformatdescriptioncreatefromh264parametersets,cmvideoformat
descriptioncreatefromhevcparametersets装载vps,sps,pps等naluheader信息;
[0081]
指定解码器回调函数与解码后视频数据类型(yuv,rgb...);
[0082]
创建解码器vtdecompressionsessioncreate;
[0083]
生成cmblockbufferref装载解码前数据,再将其转为cmsamplebufferref以提供给解码器;
[0084]
开始解码vtdecompressionsessiondecodeframe;
[0085]
在回调函数中cvimagebufferref即为解码后的数据,转为cmsamplebufferref传出;
[0086]
s40、自定义一个缓存队列,将所述解码后的视频数据存入所述自定义缓存队列;
[0087]
具体地,自定义数据缓存队列,用来将解码完成的视频数据放到缓存队列中,缓存队列采用多读单写的策略以保证数据在多线程下的完整性和准确性;所述多读单写策略即在一个入口写入视频流数据,循环读取该队列数据。
[0088]
s60、开启新的线程根据丢帧算法对所述解码后的视频数据进行渲染;
[0089]
本发明实施例提供了一种ios端的低延迟视频渲染方法,所述渲染方法通过使用videotoolbox对视频数据进行解码;自定义一个缓存队列,将所述解码后的视频数据存入所述自定义缓存队列;开启新的线程根据丢帧算法对所述解码后的视频数据进行渲染;可以在云游戏场景下现有网络传输不稳定或者网络抖动的情况下,优化操作延迟问题并使帧数不大于60fps,降低操作延迟表现。
[0090]
图3示出了本发明的实施例的一种渲染线程的流程图;图4示出了本发明的实施例的一种丢帧策略的示意图;如图3-4所示,开启新的线程根据丢帧算法对所述解码后的视频数据进行渲染,循环读取所述缓存队列,若没有读取到解码后的视频数据,继续循环读取所述解码后的视频数据;若读取到解码后的视频数据,再根据丢帧算法来判断所述获取到的解码后的视频数据是进行渲染还是直接丢弃;在读取所述缓存队列中的解码后的视频数据时设置sleep,降低cpu占用;使用丢帧算法判断时,设置丢帧阀值,读取所述渲染方法中的自定义缓存队列的长度,若所述缓存队列的长度大于所述阀值,将所述解码后的视频数据丢弃并删除当前缓存数据,若所述缓存队列的长度小于所述阀值,用opengles渲染所述解码后的视频数据并以秒为单位计数;针对低端机单独设置所述缓存队列阀值。
[0091]
缓存队列采用多读单写的策略以保证数据在多线程下的完整性和准确性;在读取所述缓存队列中的解码后的视频数据时设置sleep,降低cpu占用;运用所述ios端的低延迟视频渲染方法可以在云游戏场景下现有网络传输不稳定或者网络抖动的情况下,优化操作延迟问题并使帧数不大于60fps,降低操作延迟表现。
[0092]
基于同一发明构思,本发明实施例还提供了一种ios端的低延迟视频渲染装置,可以用于实现上述实施例中所描述的一种ios端的低延迟视频渲染方法,如下面实施例所述:由于该ios端的低延迟视频渲染装置解决问题的原理与ios端的低延迟视频渲染方法相似,因此ios端的低延迟视频渲染装置的实施可以参见ios端的低延迟视频渲染方法的实施,重复之处不再赘述。以下所使用的,术语“单元”或者“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的系统较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
[0093]
图2示出了本发明的实施例的ios端的低延迟视频渲染装置的结构框图。如图2所
示,所述渲染装置包括:
[0094]
解码模块20,使用videotoolbox对视频数据进行解码;
[0095]
缓存模块40,自定义一个缓存队列,将解码后的视频数据存入所述自定义缓存队列;
[0096]
渲染模块60,开启新的线程根据丢帧算法对所述解码后的视频数据进行渲染。具体地,开启新的线程根据丢帧算法对所述解码后的视频数据进行渲染,循环读取所述缓存队列,若没有读取到解码后的视频数据,继续循环读取所述解码后的视频数据;若读取到解码后的视频数据,再根据丢帧算法来判断所述获取到的解码后的视频数据是进行渲染还是直接丢弃;在读取所述缓存队列中的解码后的视频数据时设置sleep,降低cpu占用;使用丢帧算法判断时,设置丢帧阀值,读取所述渲染方法中的自定义缓存队列的长度,若所述缓存队列的长度大于所述阀值,将所述解码后的视频数据丢弃并删除当前缓存数据,若所述缓存队列的长度小于所述阀值,用opengles渲染所述解码后的视频数据并以秒为单位计数;针对低端机单独设置所述缓存队列阀值。
[0097]
缓存队列采用多读单写的策略以保证数据在多线程下的完整性和准确性;在读取所述缓存队列中的解码后的视频数据时设置sleep,降低cpu占用;运用所述ios端的低延迟视频渲染方法可以在云游戏场景下现有网络传输不稳定或者网络抖动的情况下,优化操作延迟问题并使帧数不大于60fps,降低操作延迟表现。
[0098]
本发明实施例提供了一种ios端的低延迟视频渲染装置,所述渲染装置通过解码模块20,使用videotoolbox对视频数据进行解码;通过缓存模块40,自定义一个缓存队列,将解码后的视频数据存入所述自定义缓存队列;渲染模块60,开启新的线程根据丢帧算法对所述解码后的视频数据进行渲染。
[0099]
本发明实施例还提供了一种计算机电子设备,图5示出了可以应用本发明实施例的电子设备的结构示意图,如图5所示,该计算机电子设备包括,中央处理单元(cpu)501,其可以根据存储在只读存储器(rom)502中的程序或者从存储部分508加载到随机访问存储器(ram)503中的程序而执行各种适当的动作和处理。在ram 503中,还存储有系统操作所需的各种程序和数据。cpu 501、rom 502以及ram 503通过总线504彼此相连。输入/输出(i/o)接口505也连接至总线504。
[0100]
以下部件连接至i/o接口505:包括键盘、鼠标等的输入部分506;包括诸如阴极射线管(crt)、液晶显示器(lcd)等以及扬声器等的输出部分507;包括硬盘等的存储部分508;以及包括诸如lan卡、调制解调器等的网络接口卡的通信部分509。通信部分509经由诸如因特网的网络执行通信处理。驱动器510也根据需要连接至i/o接口505。可拆卸介质511,诸如磁盘、光盘、磁光盘、半导体存储器等,根据需要安装在驱动器510上,以便于从其上读出的计算机程序根据需要被安装入存储部分508。
[0101]
附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,所述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要
注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
[0102]
描述于本发明实施例中所涉及到的单元或模块可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的单元或模块也可以设置在处理器中,例如,可以描述为:一种处理器包括缓存模块,解码模块和渲染模块,其中,这些模块的名称在某种情况下并不构成对该模块本身的限定,例如,缓存模块还可以被描述为“存放服务端下发的视频流数据的缓存模块”。
[0103]
作为另一方面,本发明还提供了一种计算机可读存储介质,该计算机可读存储介质可以是上述实施例中所述一种ios端的低延迟视频渲染装置中所包含的计算机可读存储介质;也可以是单独存在,未装配入电子设备中的计算机可读存储介质。计算机可读存储介质存储有一个或者一个以上程序,所述程序被一个或者一个以上的处理器用来执行描述于本发明的一种ios端的低延迟视频渲染方法。
[0104]
以上描述仅为本发明的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本发明中所涉及的发明范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离所述发明构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本发明中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1