视频特效渲染方法、装置及终端与流程

文档序号:11779022阅读:290来源:国知局
视频特效渲染方法、装置及终端与流程

本发明涉及视频技术领域,尤其涉及一种视频特效渲染方法、装置及终端。



背景技术:

在这个微拍时代,人们希望能够通过手机、平板电脑等移动终端中的具有视频编辑功能的软件,将自己和家人朋友的零散的照片和影像转化为有趣的动态视频,与家人朋友一同分享。在这个转化过程中,对视频帧进行渲染是一个重要的环节。

传统移动端的视频编辑软件都是通过使用一定的特效算法在cpu中对视频图像数据通过遍历计算进行特效处理,cpu的计算单元有限其并行计算功能并不是很强大,占用了大量的计算时间和计算内存,用cpu进行视频特效渲染效率低下,且占用大量的内存,在计算过程中容易出现画面卡顿,处理效率都低,且在计算过程中,终端发热严重。



技术实现要素:

本发明的目的旨在提供一种视频特效渲染方法、装置及终端,可部分或者全部解决上述问题,提高了视频渲染的效率,cpu占用内存下,计算时间缩短,在计算的过程中,终端有轻微发热。

为了实现上述目的,本发明提供以下技术方案:

一种视频特效渲染方法,包括:

响应于用户指令,对获取的视频源进行解码,以得到特定格式的第一视频帧数据;

将所述第一视频帧数据及预设的特效参数向gpu发送,以使得gpu完成对该第一视频帧数据的渲染;

从gpu获取第二视频帧数据进行编码以得到目标特效视频,其中该第二视频帧数据为gpu对所述第一视频帧数据进行渲染得到。

进一步地,所述将所述第一视频帧数据及预设的特效参数向gpu发送,以使得gpu完成对该第一视频帧数据的渲染的步骤中,具体包括:

初始化视频特效的渲染环境,向gpu发送渲染指令,以使得gpu响应于该渲染指令完成对该第一视频帧数据的渲染。

进一步地,所述初始化视频特效的渲染环境,并向gpu发送渲染指令,以使得gpu响应于该渲染指令完成对该第一视频帧数据的渲染的步骤中,具体包括:

获取对所述目标视频进行特效渲染的第一平台的上下文环境及用于将所述第二视频帧显示在设备上的对象,其中,所述第一平台的上下文环境通过eglgetcurrentcontext函数获得,所述第二视频帧显示在设备上的对象通过eglgetcurrentcontext函数获得;

创建用于处理所述第一视频帧数据的对象;

加载用于执行渲染操作的shader程序,对所述shader程序进行编译。

进一步地,所述创建用于处理所述第一视频帧数据的对象的步骤中,具体包括:

创建缓存所述渲染画面数据的缓冲区对象。

进一步地,所述缓冲区对象包括渲染缓存区对象和/或读取缓存区对象。

进一步地,所述创建用于处理所述第一视频帧数据的对象的步骤中,具体包括:

创建用于绘制所述第一视频帧数据经渲染后的视频帧数据的帧缓存对象。

进一步地,所述创建用于处理所述第一视频帧数据的对象的步骤中,具体包括:

创建视频图像画面纹理对象;

填充所述第一视频帧数据到所述纹理对象中。

进一步地,所述从gpu获取第二视频帧数据进行编码以得到目标特效视频,其中该第二视频帧数据为gpu对所述第一视频帧数据进行渲染得到的步骤之后,具体包括:

显示所述目标特效视频。

进一步地,所述响应于用户指令,对获取的视频源进行解码,以得到特定格式的第一视频帧数据的步骤中,具体包括:

转换解码后的所述视频源的格式以得到特定格式的第一视频帧数据。

进一步地,解码后的所述视频源的格式为4:2:0的yuv平面格式数据序列,所述第一视频帧数据的特定格式为4:4:4的yuv平面格式数据序列。

进一步地,所述将所述第一视频帧数据及预设的特效参数向gpu发送,以使得gpu完成对该第一视频帧数据的渲染的步骤中,具体包括:

将所述第一视频帧数据进行初始化,保存所述第一平台的初始环境状态;

将所述渲染程序与所述第一平台中的函数进行绑定,开启所述渲染程序的属性,并向所述渲染程序中传入所述特效参数,对所述第一视频帧进行渲染操作;

恢复所述第一平台的环境状态至初始环境状态。

进一步地,所述将所述第一视频帧数据进行初始化,保存所述第一平台的初始环境状态的步骤中,具体包括:

加载用于获取所述第一视频帧顶点数据的shader程序,对所述shader程序进行编译;

通过函数创建用于渲染的程序。

进一步地,所述将所述第一视频帧数据进行初始化,保存所述第一平台的初始环境状态的的步骤中,具体包括:

创建用于执行保存所述第一平台的初始环境状态的对象。

进一步地,所述将所述第一视频帧数据进行初始化,保存所述第一平台的初始环境状态的步骤中,具体包括:

绑定帧缓存对象和与所述帧缓对象挂接的纹理对象到所述第一平台实现渲染的上下文中;

将所述特效参数传入所述渲染程序;

调用所述第一平台中的绘图函数对所述第一视频帧进行特效渲染。

优选地,所述特效参数包括所述特效的顶点数据和纹理数据。

进一步地,所述调用所述第一平台中的绘图函数对所述第一视频帧进行特效渲染的步骤中,具体包括:

初始化所述纹理对象以及所述第一平台实现纹理渲染的环境,并为所述纹理对象创建用于纹理渲染的属性,其中纹理渲染的环境通过eglgetcurrentcontext函数实现;

依据所述纹理渲染的属性,将所述纹理数据映射到所述属性中,设置所述纹理对象参数;

创建渲染对象,对所述第一视频帧进行特效渲染。

优选地,所述纹理对象参数包括任意一个或多个以下参数,包括:顶点坐标、纹理坐标、背景颜色、旋转角度。

进一步地,所述恢复所述第一平台的环境状态至初始环境状态的步骤中,具体包括:

从所述第一平台中解绑所述渲染程序。

一种视频特效渲染装置,包括响应单元、渲染单元、编码单元,

所述响应单元,用于响应于用户指令,对获取的视频源进行解码,以得到特定格式的第一视频帧数据;

所述渲染单元,用于将所述第一视频帧数据及预设的特效参数向gpu发送,以使得gpu完成对该第一视频帧数据的渲染;

所述编码单元,用于从gpu获取第二视频帧数据进行编码以得到目标特效视频,其中该第二视频帧数据为gpu对所述第一视频帧数据进行渲染得到。

一种视频特效渲染终端,包括:存储器、处理器,所述存储器存储有计算机程序,其特征在于,所述计算机程序被所述处理器执行时实现上述方法的步骤。

相比现有技术,本发明的方案具有以下优点:

本发明的视频特效渲染方法、装置及终端,响应于用户指令,对获取的视频源进行解码,以得到特定格式的第一视频帧数据;将所述第一视频帧数据及预设的特效参数向gpu发送,以使得gpu完成对该第一视频帧数据的渲染;gpu作为图形处理器,专为执行复杂的数学和几何计算而设计的,这些计算是图形渲染所必需的,同时gpu还具有多线程并行计算的能力,从而可实现对多线程图形进行并行处理,节约了渲染的时间,从gpu获取第二视频帧数据进行编码以得到目标特效视频,其中该第二视频帧数据为gpu对所述第一视频帧数据进行渲染得到,第二视频帧可再次编码压缩为其他格式的视频,以便于渲染上特效的视频能被其他工具显示或者使用,且此步骤不在gpu上进行,降低了gpu的载荷,提高了gpu对在视频上渲染特效的能力。

进一步地,通过本发明的优选实施例方式,可实现具有如下优点:

1、本发明的视频特效渲染方法、装置及终端,其在gpu上主要对视频帧进行渲染操作,有效的利用了gpu的处理图形的能力,使渲染过程更为流畅,且预览的帧率高,预览画面流畅,降低了处理图像过程中对cpu的占有率,缩短了视频的渲染时长,由于gpu自身的属性,在渲染过程中还可实现多线程并行运行对视频帧进行特效的渲染。

2、本发明的视频特效渲染方法、装置及终端,cpu在对视频帧渲染过程中,其主要作用在于解码视频源数据及转换视频源数据的格式,使得视频源数据能顺利的被gpu接收并进行特效渲染,同时cpu还对第二视频数据进行编码压缩,使得第二视频帧数据能够被其他的工具使用或者显示,有效的利用了cpu的计算能力,cpu和gpu结合对视频帧进行特效渲染,释放了大量的渲染过程中占用的cpu的内存,缩短了视频渲染的时长,提高了移动端的整体性能,同时还降低了在视频渲染过程中移动端的温度。

本发明附加的方面和优点将在下面的描述中部分给出,这些将从下面的描述中变得明显,或通过本发明的实践了解到。

附图说明

本发明上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中:

图1为本发明的一种视频特效渲染方法流程图;

图2为本发明的一种视频特效渲染装置结构示意图。

具体实施方式

下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能解释为对本发明的限制。

本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本发明的说明书中使用的措辞“包括”是指存在所述特征、整数、步骤、操作、元件和/或组件,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作、元件、组件和/或它们的组。应该理解,当我们称元件被“连接”或“耦接”到另一元件时,它可以直接连接或耦接到其他元件,或者也可以存在中间元件。此外,这里使用的“连接”或“耦接”可以包括无线连接或无线耦接。这里使用的措辞“和/或”包括一个或更多个相关联的列出项的全部或任一单元和全部组合。

本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语(包括技术术语和科学术语),具有与本发明所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语,应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样被特定定义,否则不会用理想化或过于正式的含义来解释。

视频特效渲染是通过视频渲染器将选定的图片或者图画等与视频帧进行合成,使视频看起来更加生动,而特效渲染的软件有多种,本发明优选的实施例以opengl接口并结合gpu和cpu共同实现视频的特效渲染,gpu(图形处理单元)采用了数量众多的计算单元和超长的流水线,但只有非常简单的控制逻辑并省去了cache(高速缓冲存储器),gpu擅长的是大规模的并发计算;opengl(opengraphicslibrary)是定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口,它用于三维图象(二维的亦可),是一个功能强大、调用方便的底层图形库。opengles(openglforembeddedsystems)是opengl三维图形api的子集,针对手机、pda和游戏主机等嵌入式设备而设计;shader语言是一种专门用于进行图形编程的高级语言,是继承自c语言发展而来,除了具备c语言的一般特征外,同时还具有其他着色语言的一些优良的特征。相对传统的通用编程语言,shader语言提供了更加丰富的原生类型,如向量、矩阵等,简化了开发的流程,shader着色语言加入的新特性的使其在3d图形处理方面更加简洁、高效。

一种视频特效渲染方法,如图1所示,包括步骤s100-s300。

s100:响应于用户指令,对获取的视频源进行解码,以得到特定格式的第一视频帧数据。

用户确定了需要进行特效渲染的视频后,将其发送给客户端,且用户还向客户端发送渲染指令,客户端接收到用户的指令后,开始对确定的视频源进行解码,将视频源的帧数据格式解码为特定的便于客户端被识别的图像数据格式,以便于对视频帧进行特效渲染,本步骤的执行主体可以是一种具备视频帧渲染功能的客户端软件,也可以是一种仅具有单一视频帧渲染功能的客户端软件,本步骤数据运算过程在cpu中运行计算,由于本发明实施例需要通过gpu对yuv数据进行处理,而cpu将视频解码得到yuv数据后,将yuv数据存储到内存中,而gpu无法读取到内存中的数据,基于此,本发明实施例的cpu将需要播放的当前视频帧进行解码得到yuv数据,并将所述yuv数据置于gpu能够访问的数据组中,这样能够方便gpu进行读取。具体的,本发明实施例在移动终端中设置了能够让gpu访问的数据组,cpu将yuv数据存储到数据组中,并触发gpu进行读取;本发明实施例gpu在读取数据组的数据之前,先根据脚本程序绑定数据组,然后就可以读取绑定的数据组的数据;在实施中,可以在处理整个视频文件之前绑定一次,后续就可以对每帧视频进行处理,也可以对视频帧的每一帧数据在处理前分别进行绑定。

s200:将所述第一视频帧数据及预设的特效参数向gpu发送,以使得gpu完成对该第一视频帧数据的渲染。

如前所述,cpu将解码后的视频源的帧数据以组的方式存储在数据组中,得到第一视频帧数据,cpu向gpu发送数据处理完成的指令,使得gpu可以从cpu中获取所述第一视频帧数据,从而解放数据组在cpu中所占用的内存,gpu获取到第一视频帧数据后,gpu对所述第一视频帧数据进行处理,以得到进行过特效渲染的视频的帧数据,在发明中,用于执行渲染的是opengl,gpu获取到所述第一视频帧数据后,需要调用opengl中执行渲染操作的函数,以便于gpu能根据opengl中的函数对第一视频帧数据进行处理,其具体运算实现方法在后文进行详述。

s300:从gpu获取第二视频帧数据进行编码以得到目标特效视频,其中该第二视频帧数据为gpu对所述第一视频帧数据进行渲染得到。

cpu从gpu中获取已经渲染好的视频帧数据,即第二视频帧数据,cpu对所述第二视频帧数据进行编码压缩为其他的数据格式或者通用数据格式,如4:2:2的yuv数据格式,其编码压缩第二视频帧数据主要是便于其他的工具能够利用第二视频帧数据得到有效的目标特效视频,和/或其通过显示装置显示出带有特效的目标特效视频,第二视频帧数据由第一视频帧数据得到,并且是在gpu上实现的该过程,即gpu对所述第一视频帧数据进行处理得到第二视频帧数据,具体处理过程后文详述。

进一步地,将所述第一视频帧数据及预设的特效参数向gpu发送,以使得gpu完成对该第一视频帧数据的渲染的s200步骤中,具体包括:

s210:初始化视频特效的渲染环境,向gpu发送渲染指令,以使得gpu响应于该渲染指令完成对该第一视频帧数据的渲染。

对视频特效进行渲染之前需要对进行视频的渲染环境进行初始化,以使得渲染环境中包含的属性能够实现对视频的特效渲染,其中,在初始化之前,需要设置视频特效相关的参数,其可以在渲染工具中设置,也可以是搭载所述渲染工具的系统上设置,在渲染环境初始化完成之后,实现渲染的平台或者工具向gpu发送渲染指令,使得gpu能在前述的渲染环境下对需要渲染的视频帧数据进行特效渲染,此处,需要渲染的视频帧数据为第一视频帧数据。

具体地,在其中一种实施例中,对视频帧实现特效渲染的平台或者工具为opengl,当然,也可以是mediashowespresso或者directx等其他的实现对视频特效的渲染的接口或者应用程序,初始化之前,在opengl中设置视频特效相关的参数,或者在搭载opengl的系统上设置视频特效相关的参数,初始化视频特效的渲染环境主要包括了确定进行渲染的终端的物理层的硬件设备的配置可以用于进行渲染,如内存、运算速率等,和/或包括了进行特效渲染的应用层的系统的配置,如应用层的插件、控件、语言环境等,只有在环境条件满足对视频帧的特效渲染时,才能对视频进行特效渲染,环境条件满足后,opengl向实现运算的硬件设备(gpu)发送渲染的指令,硬件设备才开始运算,对视频帧数据进行处理,以获得带有特效的视频帧数据(第二视频帧数据),opengl调用函数向gpu发送渲染的指令,函数以映射关系存储在opengl的数据库中,渲染的指令包括了对视频帧进行渲染所需的特效以及各个特效作用的时间区间等,在进行渲染的时候,可以是同时对一个视频的多线程在gpu中进行特效渲染,也可以是多个视频多线程的在gpu中进行特效渲染,对于单个视频特效,输入一帧第一视频帧数据,输入输出的视频帧数不发生改变,输出的任然是一帧经过处理后的第一视频帧数据的图像数据,输出的被处理过的所述第一视频帧数据为第二视频帧数据;对于多个视频素材的特效处理,会有两组第一视频帧数据的图像数据序列作为输入源,分别为切出视频结尾的n帧图像数据,和切入的开头的n帧图像数据,同时需要有n帧yuv视频格式的图像数据作为输出,n的取值为一个常数,其值由用户确定,在渲染之前,第一视频帧数据携带有视频帧在同一个视频帧中的顺序标识和同一个视频帧源的标识,以便于渲染输出后的视频帧数据可以按照视频源的视频帧的排列顺序进行排列。

进一步地,所述初始化视频特效的渲染环境,并向gpu发送渲染指令,以使得gpu响应于该渲染指令完成对该第一视频帧数据的渲染的步骤s210中,具体包括步骤s211至s213。

s211:获取对所述目标视频进行特效渲染的第一平台的上下文环境及用于将所述第二视频帧显示在设备上的对象,其中,所述第一平台的上下文环境通过eglgetcurrentcontext函数获得,所述第二视频帧显示在设备上的对象通过eglgetdisplay函数获得。

如前所述,在对视频帧进行特效渲染之前,需要对初始化进行视频帧的特效渲染的环境,其中包括视频帧经过特效渲染完成后将要显示的系统显示设备对象,以便于渲染完成后的视频帧可以通过显示设备对象显示在显示装置上,显示装置可以是手机、电脑显示屏、电视机等其他可以显示视频的装置;其中还包括了提供渲染函数使得gpu可根据渲染函数进行运算而得到渲染后的视频帧数据的渲染工具或平台的上下文环境,其中工具可为前述opengl等应用程序,平台可以为搭载opengl工具的且opengl可进行渲染操作的系统或者opengl等,系统如安卓系统、ios系统、windows系统等,平台也可以是opengl,其他用于渲染的工具或者应用程序同理,在此不做赘述,从而对第一视频帧数据进行运算,实现对视频帧进行二维渲染或者三维渲染的特效渲染,初始化具体包括选择像素格式、申请显存、选择显示设备(有些设备可能有不只一个显示器)、选择某些特性(某一个特效所必须具备的属性)、指定当前的环境为绘制环境等;当有多个绘制环境,每个环境有不同参数,需要在这些环境中切换(如同时在两个显示器上绘制不同的画面),所以必须指定当前的绘制环境。

具体的,在此步骤中,opengl和承载opengl的系统之间还包括了一个中间的接口egl,使得opengl和本地系统可通过egl连接起来,因此,egl调用与其连接的数据库中的eglgetcurrentcontext函数获取opengl的上下文环境,使得在渲染过程中可以调用与opengl连接的数据库中函数对视频帧进行渲染,换而言之,gpu可以通过与opengl连接的数据库中的函数对第一视频帧数据进行处理,从而获得第二视频帧数据,同理可得,egl调用与其连接的数据库中的eglgetdisplay函数获得以视频帧形式显示第二视频帧数据的显示设备对象,显示设备对象可以为电脑的显示屏、手机显示屏等,且显示屏以一对象的形式存在于系统的程序或者opengl中,且该对象可被其他的应用程序和/或系统调用,如opengl和/或安卓等。

s212:创建用于处理所述第一视频帧数据的对象。

在进行视频帧渲染过程中,第一视频帧数据经过底层的opengl、系统以及gpu中的处理之后才能得到第二视频帧数据,由于opengl为视频帧的渲染过程仅提供了基本程序框架,因此为了方便处理第一视频帧数据,在opengl中和/或承载opengl的平台中创建用于处理第一视频帧的数据的对象,其具体创建的对象在后文详述,在此不做赘述。

s213:加载用于执行渲染操作的shader程序,对所述shader程序进行编译。

如前文所述,opengl为视频帧的渲染过程提供了基本程序框架,为优化其对视频的渲染过程,创建了具有不同功能的对象,同样opengl在本有的框架基础上,为视频帧渲染提供了一个固定管线的渲染管线,使视频帧渲染过程在研发人员控制的范围内,加载shader(着色器),shader是用来替代固定渲染管线的可编辑程序,主要目的是实现图像渲染,shader可以直接从gpu的计算得到相应的颜色参数,编译shader即为加载用于渲染视频帧的程序,shader包括顶点shader和像素shader,顶点3d图形都是由一个一个三角形组成的,顶点shader就是计算顶点位置,并为后期像素渲染做准备的,像素shader以像素为单位,计算光照、颜色的一系列算法。在opengl中顶点shader也叫做vertexshader,像素shader叫做fragmentshader。

进一步地,所述创建用于处理所述第一视频帧数据的对象的步骤s212中,具体包括步骤s2121。

s2121:创建缓存所述渲染画面数据的缓冲区对象。

创建缓存所述渲染画面数据的缓冲区对象主要用来存储gpu渲染后的画面数据,在渲染完成之后,可以从该存储区读取到渲染的画面数据,其中,缓冲区对象为一段程序,用于划分存储渲染后的画面数据的内存,缓冲区对象可以存在于对视频帧进行渲染的工具中,也可以是在搭载渲染工具的应用程序或者系统中,划分一部分渲染工具、应用程序或者系统的存储空间用于存储gpu渲染后的画面数据,并在在渲染完成之后,可以从该存储区读取到渲染的画面数据,如果是在搭载渲染工具的应用程序或者系统中,则该渲染缓冲区对象与渲染工具搭接,使得gpu渲染完成后的画面数据可以存储在渲染缓冲区对象中。

具体的,若渲染的工具为opengl,则缓冲区对象从opengl划分出来的一部分存储空间为缓冲区,用于存储gpu渲染后的画面数据,在渲染完成之后,可以从该存储区读取到渲染的画面数据,若渲染的工具为opengl,则缓冲区对象从内存或硬盘虚拟内存的一部分为所述缓冲区,用于临时存储gpu渲染后的画面数据,在渲染完成之后,可以从该区中读取到渲染的画面数据。

进一步地,所述缓冲区对象包括渲染缓存区对象和/或读取缓存区对象。

缓冲区对象的缓存区对象用于存储渲染视频特效画面数据,读取缓存区对象用于读取渲染的视频特效画面数据,渲染视频特效画面数据到渲染缓存区,渲染完成后标记该缓存区画面数据有效;交换渲染缓存区和读取缓存区对象;从读取缓存区中读取渲染画面数据,读取完成后标记该渲染缓存区画面数据无效;两个缓存区对象可以在多线程环境下同时进行处理,减少渲染和读取过程相互等待的时间,从而提高视频特效渲染的处理效率,进一步的,为了更快速的通过读取缓存区读取到渲染后的视频特效画面,egl还创建了eglimage对象,该对象主要是用来加速从gpu中读取渲染后的画面数据,使得渲染后的画面数据可以通过egl可以为本地系统利用。

进一步地,所述创建用于处理所述第一视频帧数据的对象的步骤s212中,具体包括步骤s2122。

s2122:创建用于绘制所述第一视频帧数据经渲染后的视频帧数据的帧缓存对象。

帧缓存对象也简称为fbo,用来接收渲染工具或者渲染平台的渲染结果,而不用将渲染结果直接绘制在默认的帧缓存对象上,相对默认的帧缓存对象,在需要显示渲染的结果时,帧缓存对象可以直接将渲染结果显示在显示装置上,而默认的帧缓存对象是直接在显示装置上绘制结果,其效率相对新建的帧缓存对象慢得多,帧缓存对象由渲染工具创建且存在于渲染工具中,即使渲染工具搭载在系统或者应用程序中,帧缓存对象完全受渲染工具的控制,fbo也包含一些存储颜色、深度和模板数据的区域,为可以和帧缓存对象关联起来的二维数组像素。

具体的,如若渲染工具为opengl,opengl搭载在系统或者应用程序中,则glextframebufferobject提供了一种创建额外的不能显示的帧缓存对象的接口,帧缓存对象与opengl连接,其完全受opengl的控制,通过使用帧缓存对象(fbo),opengl可以将显示输出到引用程序帧缓存对象,若opengl未有任何搭载,帧缓存对象存在与opengl中,其同样完全受opengl的控制,通过使用帧缓存对象(fbo),opengl可以将显示输出到引用程序帧缓存对象。

进一步地,所述创建用于处理所述第一视频帧数据的对象的步骤s212中,具体包括步骤s2123至步骤s2124。

s2123:创建视频图像画面纹理对象;

纹理对象是内部数据类型,存储着纹理数据和选项等,纹理对象封装了和纹理贴图或者视频图像画面相关联的各种状态设置,纹理对象不能被直接访问它,但是可以通过一个整数的id来作为其句柄(handler)进行跟踪;为了分配到一个唯一的id,opengl提供了glgentextures函数来获取一个有效的id标识值:voidglgentexture(glsizein,gluint*texture);texture是一个数组,用于存储分配到的n个id值。在调用一次glgentextures后,会将分配到的id标识为'已用'。

s2124:填充所述第一视频帧数据到所述纹理对象中。

由前述可知,纹理对象创建时为空的数据,需要在其中填充数据,使得纹理才能在渲染的被使用,纹理对象封装了和纹理贴图相关的各种状态的设置,因此填充所述第一视频帧数据得到所述纹理对象中,使得纹理对象将所述第一视频帧的数据封装起来,即纹理对象与第一视频帧数据以映射关系关联起来。具体的,渲染工具为opengl时,纹理对象被创建在opengl中。

进一步地,所述从gpu获取第二视频帧数据进行编码以得到目标特效视频,其中该第二视频帧数据为gpu对所述第一视频帧数据进行渲染得到的步骤s300之后,具体包括步骤s310。

s310:显示所述目标特效视频。

第一视频帧数据经特效渲染处理后得到第二视频帧数据,为了使用户或者开发人员能直观的观看到特效渲染后的视频帧,或者将第二视频帧数据能被其他程序调用,将所述第二视频帧数据进行编码压缩,从而得到目标特效视频,编码压缩可以为转换第二视频帧数据的格式,压缩为尽可能保证视觉效果的前提下减少视频数据率,压缩包括有损和无损压缩、帧内和帧间压缩、对称和不对称编码,无损压缩也即压缩前和解压缩后的数据完全一致,多数的无损压缩都采用rle行程编码算法,有损压缩意味着解压缩后的数据与压缩前的数据不一致。在压缩的过程中要丢失一些人眼和人耳所不敏感的图像或音频信息;帧内压缩仅考虑一帧的数据而不考虑相邻帧之间的冗余信息,这实际上与静态图像压缩类似。帧内一般采用有损压缩算法,由于帧内压缩时各个帧之间没有相互关系,所以压缩后的视频数据仍可以以帧为单位进行编辑,帧间压缩是基于许多视频或动画的连续前后两帧具有很大的相关性,或者说前后两帧信息变化很小的特点,也即连续的视频其相邻帧之间具有冗余信息,压缩相邻帧之间的冗余量就可以进一步提高压缩量,帧间压缩也称为时间压缩(temporalcompression),它通过比较时间轴上不同帧之间的数据进行压缩,帧间压缩一般是无损的,帧差值(framedifferencing)算法是一种典型的时间压缩法,它通过比较本帧与相邻帧之间的差异,仅记录本帧与其相邻帧的差值,对称性(symmetric)是压缩编码的一个关键特征;对称编码意味着压缩和解压缩占用相同的计算处理能力和时间,不对称编码意味着压缩时需要花费大量的处理能力和时间,而解压缩时则能较好地实时回放,也即以不同的速度进行压缩和解压缩;经过前述的处理过程后得到的目标视频帧,就可以被显示装置显示,具体的,如第一视频帧数据经opengl特效渲染后得到第二视频帧数据,第二视频帧数据再经过opengl的编码压缩得到目标特效视频,就可以被显示装置显示了,其中显示装置可以为电脑显示屏、电视或者手机等。

进一步地,所述响应于用户指令,对获取的视频源进行解码,以得到特定格式的第一视频帧数据的步骤s100中,具体包括步骤s110。

s110:转换解码后的所述视频源的格式以得到特定格式的第一视频帧数据。

由于gpu只能识别指定格式的数据,视频源的数据不是gpu能识别的数据格式时,需要将视频源数据进行转换解码为gpu能识别的数据格式,使得在后续对视频源数据进行特效渲染时,gpu可根据渲染工具的指令对视频源的数据进行运算,从而得到渲染后的视频帧数据,即第二视频帧数据。

具体的,视频源经过解码后的数据通常都是yuv(4:2:0)平面格式的数据序列,但是gpu无法识别yuv(4:2:0)格式的数据,因此,在图像数据输入到gpu之前必须先对其进行格式转换,变成yuv(4:4:4)格式排列的数据后才能输入到gpu中去,opengl向gpu发送渲染指令后,gpu可根据opengl调用的函数对前述的第一视频帧数据进行处理从而得到第二视频帧数据。

进一步地,解码后的所述视频源的格式为4:2:0的yuv平面格式数据序列,所述第一视频帧数据的特定格式为4:4:4的yuv平面格式数据序列。

如前所述,在其中一种实施例中,解码后的所述视频源的格式为4:2:0的yuv平面格式数据序列,所述第一视频帧数据的特定格式为4:4:4的yuv平面格式数据序列,使得gpu可根据opengl调用的函数对第一视频帧数据进行处理得到第二视频帧数据。

进一步地,所述将所述第一视频帧数据及预设的特效参数向gpu发送,以使得gpu完成对该第一视频帧数据的渲染的步骤s200中,具体包括步骤s220至步骤s240。

s220:将所述第一视频帧数据进行初始化,保存所述第一平台的初始环境状态。

将所述第一视频帧数据进行初始化,主要是将第一视频帧数据设为默认值,使得第一视频帧数据做好了被渲染的准备,保存所述第一平台的初始环境状态,即保存opengl渲染前为渲染做的前述准备工作,也可以是保存搭载opengl的系统或者应用程序在渲染前为渲染做的准备,如前述的创建对象和/或获取对象等,当然opengl也可以是其他的前述的用于渲染的工具。

s230:将所述渲染程序与所述第一平台中的函数进行绑定,开启所述渲染程序的属性,并向所述渲染程序中传入所述特效参数,对所述第一视频帧进行渲染操作。

将渲染程序与所述第一平台中函数进行绑定,使得在渲染过程,渲染程序可以调用所述第一平台中函数对所述第一视频帧数据进行处理,gpu也可以根据所述第一平台中的函数对所述第一视频帧数据进行运算以得到第二视频帧数据,为了使渲染的结果为预设效果,开启渲染程序的属性,可以增加或者减少渲染的流程,或者对数据处理的步骤,在渲染程序包含了预设特效的参数时,渲染程序以所述特效参数为依据,将所述特效参数赋值到所述第一平台中的函数中时,第一视频帧数据才能被gpu运算得到第二视频帧数据,即为对所述第一视频帧进行渲染操作。

具体的,将渲染程序与opengl中的函数绑定,其中,opengl可以是搭载在系统或者应用程序中,也可以是单独的opengl渲染工具,渲染程序可以是前述的对象或者是新建的与前述对象连接的,开启渲染程序的属性,可以增加或者减少渲染的流程,或者对数据处理的步骤,向所述渲染程序传入所述特效参数,渲染程序以所述特效参数为依据,将所述特效参数赋值到opengl的函数中时,第一视频帧数据才能被gpu运算得到第二视频帧数据,即为对所述第一视频帧进行渲染操作,例如,执行渲染操作,调用gluseprogram函数绑定渲染程序,调用glbindbuffer函数绑定顶点数组对象,调用glenablevertexattribarray开启顶点数组属性,调用glvertexattribpointer传入顶点数据以及渲染颜色数据,调用gldrawarrays函数执行渲染操作。

s240:恢复所述第一平台的环境状态至初始环境状态。

恢复所述第一平台的环境状态至初始环境,避免在对同一视频源/特效进行处理过程中,在每一帧或者连续部分帧视频特效渲染完成后,需要每次对所述第一平台的环境状态进行初始化,节约了特效渲染的流程和时间,降低了对内存的占有率;具体的,如前所述,在每一帧或者连续部分帧视频特效渲染完成后,将所述opengl环境状态恢复至前述的初始化后的状态。

进一步地,所述将所述第一视频帧数据进行初始化,保存所述第一平台的初始环境状态的步骤s220中,具体包括步骤s221和s222。

s221:加载用于获取所述第一视频帧顶点数据的shader程序,对所述shader程序进行编译。

如前所述,shader着色器包括了顶点shader和像素shader,具体还包括了片元shader着色器,顶点着色器最基本的任务是接收三维空间中点的坐标,将其处理为二维空间中的坐标并输出;片元着色器最基本的任务是对需要处理的屏幕上的每个像素输出一个颜色值,顶点着色器接受attribute变量和uniform变量,attribute变量存储着关于点本身的数据,其中最重要的当然是点的位置,uniform变量存储的数据仅仅帮助着色器完成任务,着色器仅仅是需要uniform变量而并不处理他们,顶点着色器需要输出varying变量给片元着色器。片元着色器的任务是给出屏幕上每个像素的颜色,片元着色器接受varying变量,varying变量是顶点着色器的输出,片元着色器的处理单元是像素,将顶点转化为像素的技术称为“图元光栅化”;对加载的顶点着色器和片元着色器进行编译链接,使得在渲染过程中可以调用所述顶点着色器和片元着色器对第一视频帧数据进行处理。

s222:通过函数创建用于渲染的程序。

如前所述,在进行渲染前,需要创建渲染程序,使得渲染步骤可以跟随渲染程序进行,其中渲染程序有函数建成,具体的,在opengl中,创建渲染程序的函数是glcreatprogram。

进一步地,所述将所述第一视频帧数据进行初始化,保存所述第一平台的初始环境状态的步骤s220中,具体包括步骤s223。

s223:创建用于执行保存所述第一平台的初始环境状态的对象。

如前文所述,为了降低工作量以及节约渲染流程和时间,需要保存所述第一平台的初始环境状态,即保存opengl渲染前为渲染做的前述准备工作,也可以是保存搭载opengl的系统或者应用程序在渲染前为渲染做的准备,执行保存opengl渲染前的初始环境状态为一对象,所述对象包含了执行保存opengl初始环境状态的程序。

进一步地,所述将所述第一视频帧数据进行初始化,保存所述第一平台的初始环境状态的的步骤s220中,具体包括步骤s224至步骤s226。

s224:绑定帧缓存对象和与所述帧缓对象挂接的纹理对象到所述第一平台实现渲染的上下文中。

如前文所述,创建了帧缓存对象,帧缓存对象用于接收渲染工具或者所述第一平台的渲染结果,而不用将渲染结果直接绘制在默认的帧缓存对象上,在需要显示渲染的结果时,帧缓存对象可以直接将渲染结果显示在显示装置上,将帧缓存对象绑定到所述第一平台的上下文中,以便于接下来的渲染工具的渲染操作都可以在创建的帧缓存对象上进行,将纹理对象绑定到所述第一平台的上下文环境中个,以便于对纹理对象进行渲染操作,其中纹理对象与所述帧缓存对象挂接。

具体的,如前文所述,将帧缓存对象绑定到opengl的上下文中,以便于接下来的opengl渲染操作都在自定义的帧缓存对象上进行,即opengl在帧缓存对象上绘制渲染结果,将纹理对象绑定到opengl的上下文环境中,以便opengl接下来对纹理对象进行渲染操作,纹理对象通过着色器的处理后,将其渲染到帧缓存上,帧缓存由帧缓存对象得到,帧缓存将渲染后的纹理对象显示在显示装置上。

s225:将所述特效参数传入所述渲染程序。

所前文所述,在特效的参数传入所述渲染程序时,gpu才能根据渲染程序对所述第一视频帧数据进行运算,从而得到第二视频帧数据。

s226:调用所述第一平台中的绘图函数对所述第一视频帧进行特效渲染。

如前文所述在渲染时,渲染即为通过gpu依据第一平台的绘图函数和特效参数等对所述第一视频帧进行运算得到第二视频帧数据的过程。因此在渲染过程中,需要调用所述第一平台中的绘图函数。具体的,opengl调用与其连接的数据库中绘图函数,并在函数中赋值特效参数,gpu依据渲染程序和绘图函数对所述第一视频帧数据进行运算。

优选地,所述特效参数包括所述特效的顶点数据和纹理数据。

如前文所述,必要的特效参数主要包括顶点数据和纹理数据,具体的,如果是一个三角形,顶点数据为三角形的顶点左边;纹理数据可以为一张图片或者线或者点等。

进一步地,所述调用所述第一平台中的绘图函数对所述第一视频帧进行特效渲染的步骤s226中,具体包括步骤s2261至步骤s2263。

s2261:初始化所述纹理对象以及所述第一平台实现纹理渲染的环境,并为所述纹理对象创建用于纹理渲染的属性,其中纹理渲染的环境通过eglgetcurrentcontext函数实现。

所述纹理对象的初始化为将添加数据后的所述纹理对象设为默认值,并调用eglgetcurrentcontext函数获取当前的egl上下文,调用glgentextures产生一个opengl的纹理id,具体id已在前文描述,常见默认的渲染对象,新渲染对象未附加任何值。

s2262:依据所述纹理渲染的属性,将所述纹理数据映射到所述属性中,设置所述纹理对象参数。

依据前文所述的纹理渲染的属性,opengl调用glteximage2d函数将渲染画面数据填充到opengl的纹理对象中,并设置纹理对象参数,以通过前述的对象或者步骤实现对所述视频帧的渲染操作,纹理对象参数在后文详述。

s2263:创建渲染对象,对所述第一视频帧进行特效渲染。

创建渲染对象,创建的渲染对象代表将要渲染到所述视频帧上的特效,且创建的一个渲染对象代表着一种特效效果,opengl调用performrender函数进行特效画面渲染操作。

优选地,所述纹理对象参数包括任意一个或多个以下参数,包括:顶点坐标、纹理坐标、背景颜色、旋转角度。

如前文所述,在进行纹理参数设置时,主要参数包括任意一个或多个以下参数顶点坐标、纹理坐标、背景颜色、旋转角度,顶点坐标为特效图形顶点的坐标,顶点坐标即为几何坐标,在绘制纹理映射场景时,不仅要给每个顶点定义几何坐标,而且也要定义纹理坐标。经过多种变换后,几何坐标决定顶点在屏幕上绘制的位置,而纹理坐标决定纹理图像中的哪一个纹理赋予该顶点。纹理图像是方形数组,纹理坐标通常可定义成一、二、三或四维形式,称为s,t,r和q坐标,以区别于物体坐标(x,y,z,w)和其他坐标。一维纹理常用s坐标表示,二维纹理常用(s,t)坐标表示,目前忽略r坐标,q坐标象w一样,一半值为1,主要用于建立齐次坐标。opengl坐标定义的函数是:voidgltexcoord{1234}{sifd}[v](typecoords);设置当前纹理坐标,此后调用glvertex*()所产生的顶点都赋予当前的纹理坐标,对于gltexcoord1*(),s坐标被设置成给定值,t和r设置为0,q设置为1,用gltexcoord2*()可以设置s和t坐标值,r设置为0,q设置为1,对于gltexcoord3*(),q设置为1,其它坐标按给定值设置,用gltexcoord4*()可以给定所有的坐标,使用适当的后缀(s,i,f或d)和type的相应值(glshort、glint、glfloat或gldouble)来说明坐标的类型;在某些场合(环境映射等)下,为获得特殊效果需要自动产生纹理坐标,并不要求为用函数gltexcoord*()为每个物体顶点赋予纹理坐标值,opengl提供了自动产生纹理坐标的函数,其如:voidgltexgen{if}[v](glenumcoord,glenumpname,typeparam);自动产生纹理坐标,第一个参数必须是gl_s、gl_t、gl_r或gl_q,它指出纹理坐标s,t,r,q中的哪一个要自动产生;第二个参数值为gl_texture_gen_mode、gl_object_plane或gl_eye_plane;第三个参数param是一个定义纹理产生参数的指针,其值取决于第二个参数pname的设置,当pname为gl_texture_gen_mode时,param是一个常量,即gl_object_linear、gl_eye_linear或gl_sphere_map,它们决定用哪一个函数来产生纹理坐标。背景颜色是纹理的背景色,如前述三角形,背景颜色为三角形填充颜色,旋转角度为当三角形渲染到视频帧中时,三角形在视频帧中旋转的角度,旋转角度为任意方向任意角度。

进一步地,所述恢复所述第一平台的环境状态至初始环境状态的步骤s240中,具体包括步骤s241。

s241:从所述第一平台中解绑所述渲染程序。

如前文所述,渲染完成后,为了能在初始环境的条件下对其他帧进行特效渲染,需要恢复所述第一平台中所绑定的前述程序,具体的,如在opengl中,即为恢复opengl的初始环境状态,如从opengl上下文环境中解绑帧缓存对象,从opengl中解绑纹理对象等,opengl可以一次恢复一个或者多个前述绑定的特征属性。

一种视频特效渲染装置,如图2所示,包括响应单元10、渲染单元20、编码单元30。

所述响应单元10,用于响应于用户指令,对获取的视频源进行解码,以得到特定格式的第一视频帧数据;

所述渲染单元20,用于将所述第一视频帧数据及预设的特效参数向gpu发送,以使得gpu完成对该第一视频帧数据的渲染;

所述编码单元30,用于从gpu获取第二视频帧数据进行编码以得到目标特效视频,其中该第二视频帧数据为gpu对所述第一视频帧数据进行渲染得到。

一种视频特效渲染终端,包括:存储器、处理器,所述存储器存储有计算机程序,其特征在于,所述计算机程序被所述处理器执行时实现上述方法的步骤。

本技术领域技术人员可以理解,本发明包括关联用于执行本申请中所述操作中的一项或多项的设备。这些设备可以为所需的目的而专门设计和制造,或者也可以包括通用计算机中的已知设备。这些设备具有存储在其内的计算机程序,这些计算机程序选择性地激活或重构。这样的计算机程序可以被存储在设备(例如,计算机、手机、电视)可读介质中或者存储在适于存储电子指令并分别耦联到总线的任何类型的介质中,所述计算机可读介质包括但不限于任何类型的盘(包括软盘、硬盘、光盘、cd-rom、和磁光盘)、rom(read-onlymemory,只读存储器)、ram(randomaccessmemory,随即存储器)、eprom(erasableprogrammableread-onlymemory,可擦写可编程只读存储器)、eeprom(electricallyerasableprogrammableread-onlymemory,电可擦可编程只读存储器)、闪存、磁性卡片或光线卡片。也就是,可读介质包括由设备(例如,计算机)以能够读的形式存储或传输信息的任何介质。

本技术领域技术人员可以理解,可以用计算机程序指令来实现这些结构图和/或框图和/或流图中的每个框以及这些结构图和/或框图和/或流图中的框的组合。本技术领域技术人员可以理解,可以将这些计算机程序指令提供给通用计算机、专业计算机或其他可编程数据处理方法的处理器来实现,从而通过计算机或其他可编程数据处理方法的处理器来执行本发明公开的结构图和/或框图和/或流图的框或多个框中指定的方案。

本技术领域技术人员可以理解,本发明中已经讨论过的各种操作、方法、流程中的步骤、措施、方案可以被交替、更改、组合或删除。进一步地,具有本发明中已经讨论过的各种操作、方法、流程中的其他步骤、措施、方案也可以被交替、更改、重排、分解、组合或删除。进一步地,现有技术中的具有与本发明中公开的各种操作、方法、流程中的步骤、措施、方案也可以被交替、更改、重排、分解、组合或删除。

以上所述仅是本发明的部分实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1