视频渲染方法及装置、存储介质、电子设备与流程

文档序号:31516856发布日期:2022-09-14 12:08阅读:56来源:国知局
1.本公开涉及视频处理
技术领域
:,尤其涉及一种视频渲染方法与视频渲染装置、计算机可读存储介质及电子设备。
背景技术
::2.随着计算机技术的不断发展,带透明通道的mp4(movingpictureexpertsgroup4,动态图像专家组)视频渲染技术已经比较成熟。例如,开源项目alphaplayer(直播中台使用的一个视频动画特效sdk(softwaredevelopmentkit,软件开发工具包))可以支持渲染带透明通道信息的mp4视频,或者是vap(videoanimationplayer,用于播放酷炫动画的实现方案)支持mp4视频结合图片渲染的方案,可以用于播放特效动画的实现方案。这种方式相比于webp(图片格式)、apng(animatedportablenetworkgraphics,位图动画格式)等动图方案,由于素材更小,具有高压缩率的优点,并且,通过硬件解码的方式达成了解码更快的效果。3.alphaplayer只支持带透明度的视频播放,因此只是mp4视频的播放和渲染。vap支持透明视频的播放和渲染的同时,增加了渲染图片和文字的功能。但是,这两种方案都没有实现视频和视频的混合渲染。4.鉴于此,本领域亟需开发一种新的视频渲染方法及装置。5.需要说明的是,在上述
背景技术
:部分公开的信息仅用于加强对本公开的背景的理解,因此可以包括不构成对本领域普通技术人员已知的现有技术的信息。技术实现要素:6.本公开的目的在于提供一种视频渲染方法、视频渲染装置、计算机可读存储介质及电子设备,进而至少在一定程度上克服由于相关技术的限制而导致的无法实现视频纹理共享和两种视频混合渲染的技术问题。7.本公开的其他特性和优点将通过下面的详细描述变得显然,或部分地通过本公开的实践而习得。8.根据本发明实施例的第一个方面,提供一种视频渲染方法,所述方法包括:9.获取第一视频的第一纹理,并创建所述第一视频的共享环境,以及创建所述第一视频的共享对象,所述共享环境为间接共享的所述第一纹理所依赖的渲染环境,所述共享对象为将所述第一纹理暴露给外部进行间接共享的所需对象;10.基于所述共享环境,在所述共享对象中绘制所述第一纹理;11.通过所述共享对象将所述第一纹理调用至与所述第一视频对应的第二视频,以对所述第一视频和所述第二视频进行混合渲染得到混合视频。12.在本发明的一种示例性实施例中,所述创建所述第一视频的共享环境,包括:13.确定所述第一视频的上下文对象为共享上下文对象,并创建渲染线程;14.基于所述渲染线程,利用所述共享上下文对象创建共享环境。15.在本发明的一种示例性实施例中,所述基于所述共享环境,在所述共享对象中绘制所述第一纹理,包括:16.创建临时帧缓冲,并绑定所述第一纹理和所述临时帧缓冲得到第一绑定关系;17.基于所述共享环境,利用所述第一绑定关系将所述第一纹理绘制至所述共享对象。18.在本发明的一种示例性实施例中,所述基于所述共享环境,利用所述第一绑定关系将所述第一纹理绘制至所述共享对象,包括:19.创建当前纹理标识,并绑定所述临时帧缓冲和所述当前纹理标识得到第二绑定关系;20.基于所述第一绑定关系和所述第二绑定关系,将所述第一纹理绘制到与所述临时帧缓冲绑定的所述当前纹理标识中;21.基于所述共享环境,根据所述当前纹理标识将所述第一纹理绘制到所述共享对象。22.在本发明的一种示例性实施例中,所述根据所述当前纹理标识将所述第一纹理绘制到所述共享对象,包括:23.利用所述共享对象创建数据存储区;24.基于所述数据存储区,根据所述当前纹理标识将所述第一纹理绘制到所述共享对象。25.在本发明的一种示例性实施例中,在所述根据所述当前纹理标识将所述第一纹理绘制到所述共享对象之后,所述方法还包括:26.将所述第一纹理发送至所述渲染线程。27.在本发明的一种示例性实施例中,在所述通过所述共享对象将所述第一纹理调用至与所述第一视频对应的第二视频之后,所述方法还包括:28.利用所述共享对象解除所述第一纹理的所述共享环境。29.在本发明的一种示例性实施例中,所述通过所述共享对象将所述第一纹理调用至与所述第一视频对应的第二视频,包括:30.创建对象纹理标识,并绑定所述共享对象和所述对象纹理标识得到第三绑定关系;31.根据所述第三绑定关系将所述对象纹理标识赋值给绘制到所述共享对象中的第一纹理;32.当监听到在所述共享对象绘制出所述第一纹理时,利用所述对象纹理标识将所述第一纹理调用至与所述第一视频对应的第二视频。33.在本发明的一种示例性实施例中,所述对所述第一视频和所述第二视频进行混合渲染得到混合视频,包括:34.当根据所述第二视频确定混合视频中的所述第一视频为透明时,对所述第二视频进行渲染得到混合视频;35.当根据所述第二视频确定混合视频中的所述第一视频为非透明时,对所述第一视频和所述第二视频进行混合渲染得到混合视频。36.在本发明的一种示例性实施例中,所述对所述第一视频和所述第二视频进行混合渲染得到混合视频,包括:37.获取所述第一视频的第一顶点位置和第一纹理像素值,并对所述第一顶点位置进行矩阵变换得到混合显示位置;38.获取所述第二视频的第二顶点位置和第二纹理像素值,并根据所述混合显示位置、所述第一纹理像素值、所述第二顶点位置和所述第二纹理像素值对所述第一视频和所述第二视频进行混合渲染得到混合视频。39.在本发明的一种示例性实施例中,在所述获取所述第二视频的第二顶点位置和第二纹理像素值之后,所述方法还包括:40.当通过所述共享对象未将所述第一纹理调用至与所述第一视频对应的第二视频时,获取默认图片以及所述默认图片的图片顶点位置和图片像素值;41.根据所述图片顶点位置、所述图片像素值、所述第二顶点位置和所述第二纹理像素值对所述默认图片和所述第二视频进行混合渲染得到混合视频。42.在本发明的一种示例性实施例中,所述根据所述混合显示位置、所述第一纹理像素值、所述第二顶点位置和所述第二纹理像素值对所述第一视频和所述第二视频进行混合渲染得到混合视频,包括:43.根据所述第一纹理像素值和所述第二纹理像素值得到目标透明度和目标颜色值;44.获取所述第一视频在所述第二视频中的混合位置和混合尺寸;45.基于所述混合显示位置、所述第二顶点位置、所述混合位置和所述混合尺寸,按照所述目标透明值和所述目标颜色值对所述第一视频和所述第二视频进行混合渲染得到混合视频。46.在本发明的一种示例性实施例中,所述根据所述第一纹理像素值和所述第二纹理像素值得到目标透明度和目标颜色值,包括:47.对所述第一纹理像素值进行二维采样得到第一采样像素值,并对所述第二纹理像素值进行二维采样得到第二采样像素值;48.对所述第一采样像素值和所述第二采样像素值进行差值计算得到目标透明值;49.对所述第一采样像素值和所述第二采样像素值进行线性差值计算得到目标颜色值。50.根据本发明实施例的第二个方面,提供一种视频渲染装置,包括:51.纹理获取模块,被配置为获取第一视频的第一纹理,并创建所述第一视频的共享环境和共享对象;52.间接共享模块,被配置为基于所述共享环境,在所述共享对象中绘制所述第一纹理;53.混合渲染模块,被配置为通过所述共享对象将所述第一纹理调用至与所述第一视频对应的第二视频,以对所述第一视频和所述第二视频进行混合渲染得到混合视频。54.根据本发明实施例的第三个方面,提供一种电子设备,包括:处理器和存储器;其中,存储器上存储有计算机可读指令,所述计算机可读指令被所述处理器执行时实现上述任意示例性实施例中的视频渲染方法。55.根据本发明实施例的第四个方面,提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述任意示例性实施例中的视频渲染方法。56.由上述技术方案可知,本公开示例性实施例中的视频渲染方法、视频渲染装置、计算机存储介质及电子设备至少具备以下优点和积极效果:57.在本公开的示例性实施例提供的方法及装置中,一方面,通过共享环境和共享对象实现了第一视频的第一纹理的间接共享,提供了一种安全且高效的视频纹理共享方式,避免了因直接共享导致第一纹理改动的问题的发生,同时提前预防了混合视频产生黑屏或闪烁等情况;另一方面,对第一视频和第二视频进行混合渲染,提供了一种既支持带透明度的视频渲染,又支持两个视频混合的方式,保证了原本视频的色彩饱和度和清晰度的正常显示,也能够将两个视频平滑自然的完美融合,极大地优化了混合视频的视觉效果,丰富了混合视频的应用场景。58.应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。附图说明59.此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。60.图1示意性示出本公开示例性实施例中一种视频渲染方法的流程示意图;61.图2示意性示出了本公开示例性实施例中创建第一视频的共享环境的方法的流程示意图;62.图3示意性示出了本公开示例性实施例中实现创建新的eglcontext的代码示意图;63.图4示意性示出本公开示例性实施例中对实现创建共享对象的代码示意图;64.图5示意性示出本公开示例性实施例中在共享对象中绘制第一纹理的方法的流程示意图;65.图6示意性示出本公开示例性实施例中利用第一绑定关系绘制第一纹理的方法的流程示意图;66.图7示意性示出本公开示例性实施例中根据当前纹理标识绘制第一纹理的方法的流程示意图;67.图8示意性示出本公开示例性实施例中实现利用共享对象创建数据存储区的代码示意图;68.图9示意性示出本公开示例性实施例中将第一纹理调用至第二视频的方法的流程示意图;69.图10示意性示出本公开示例性实施例中对第一视频和第二视频进行混合渲染的方法的流程示意图;70.图11示意性示出本公开示例性实施例中第二视频的原始画面的场景效果图;71.图12示意性示出本公开示例性实施例中进一步对第一视频和第二视频进行混合渲染的方法的流程示意图;72.图13示意性示出本公开示例性实施例中实现获取混合显示位置和第一纹理像素值的部分代码示意图;73.图14示意性示出本公开示例性实施例中获取第二顶点位置的代码示意图;74.图15示意性示出本公开示例性实施例中获取第二纹理像素值的代码示意图;75.图16示意性示出本公开示例性实施例中更进一步的对第一视频和第二视频进行混合渲染的方法的流程示意图;76.图17示意性示出本公开示例性实施例中透明度的计算方式的示意图;77.图18示意性示出本公开示例性实施例中计算得到目标透明度和目标颜色值的方法的示意图;78.图19示意性示出本公开示例性实施例中片元着色器进行二维采样的代码示意图;79.图20示意性示出本公开示例性实施例中对默认图片和第二视频进行混合渲染的方法的流程示意图;80.图21示意性示出本公开示例性实施例中混合渲染得到的混合视频的场景效果图;81.图22示意性示出本公开示例性实施例中一种视频渲染装置的结构示意图;82.图23示意性示出本公开示例性实施例中一种用于实现视频渲染方法的电子设备;83.图24示意性示出本公开示例性实施例中一种用于实现视频渲染方法的计算机可读存储介质。具体实施方式84.现在将参考附图更全面地描述示例实施方式。然而,示例实施方式能够以多种形式实施,且不应被理解为限于在此阐述的范例;相反,提供这些实施方式使得本公开将更加全面和完整,并将示例实施方式的构思全面地传达给本领域的技术人员。所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施方式中。在下面的描述中,提供许多具体细节从而给出对本公开的实施方式的充分理解。然而,本领域技术人员将意识到,可以实践本公开的技术方案而省略所述特定细节中的一个或更多,或者可以采用其它的方法、组元、装置、步骤等。在其它情况下,不详细示出或描述公知技术方案以避免喧宾夺主而使得本公开的各方面变得模糊。85.本说明书中使用用语“一个”、“一”、“该”和“所述”用以表示存在一个或多个要素/组成部分/等;用语“包括”和“具有”用以表示开放式的包括在内的意思并且是指除了列出的要素/组成部分/等之外还可存在另外的要素/组成部分/等;用语“第一”和“第二”等仅作为标记使用,不是对其对象的数量限制。86.此外,附图仅为本公开的示意性图解,并非一定是按比例绘制。图中相同的附图标记表示相同或类似的部分,因而将省略对它们的重复描述。附图中所示的一些方框图是功能实体,不一定必须与物理或逻辑上独立的实体相对应。87.随着计算机技术的不断发展,带透明通道的mp4视频渲染技术已经比较成熟。例如,开源项目alphaplayer可以支持渲染带透明通道信息的mp4视频,或者是vap支持mp4视频结合图片渲染的方案,可以用于播放特效动画的实现方案。这种方式相比于webp、apng等动图方案,由于素材更小,具有高压缩率的优点,并且,通过硬件解码的方式达成了解码更快的效果。88.alphaplayer只支持带透明度的视频播放,因此只是mp4视频的播放和渲染。vap支持透明视频的播放和渲染的同时,增加了渲染图片和文字的功能。但是,这两种方案都没有实现视频和视频的混合渲染。89.除此之外,现有的共享视频画面的方法包括将视频a的画面通过图片的形式(bitmap,位图)传给另一个播放器对应的渲染视图,例如glsurfaceview(一种opengl(opengraphicslibrary,开放图形库)类)进行图片混合渲染。亦即,将视频a播放的画面通过截图的方式拷贝图片数据,再转为bitmap给第二个视频渲染时使用,混合的方式是纹理贴图的方式实现图层混合的效果。90.其中,opengl是图形领域的工业标准,是一套跨编程语言、跨平台、专业的图形编程(软件)接口,也是底层图形库。91.但是,这种方式对于视频a的每一帧都需要gpu(graphicsprocessingunit,图形处理器)拷贝出来,并转化成bitmap,再从cpu(centralprocessingunit,中央处理器)拷贝到gpu转成纹理进行渲染。整个过程非常耗费性能,容易导致设备发热。92.除此之外,还可以直接使用视频a的surfacetexture传递画面数据。在视频b渲染时,从surfacetexture中获取图像帧。93.其中,surfacetexture是android系统上做渲染的核心组件,它是surface和opengles纹理(一种安卓平台的纹理类型,亦即oes纹理)的组合,用于提供输出oes纹理的surface,是连接surface和oes纹理的桥梁94.但是,这种直接共用一个surfacetexture的方式会有一些问题,例如黑屏、闪烁等,多线程访问同一个数据源可能无法拿到视频数据而使画面异常。95.针对相关技术中存在的问题,本公开提出了一种视频渲染方法。图1示出了视频渲染方法的流程图,如图1所示,视频渲染方法至少包括以下步骤:96.步骤s110.获取第一视频的第一纹理,并创建第一视频的共享环境,以及创建第一视频的共享对象,共享环境为间接共享的第一纹理所依赖的渲染环境,共享对象为将第一纹理暴露给外部进行间接共享的所需对象。97.步骤s120.基于共享环境,在共享对象中绘制第一纹理。98.步骤s130.通过共享对象将第一纹理调用至与第一视频对应的第二视频,以对第一视频和第二视频进行混合渲染得到混合视频。99.在本公开的示例性实施例中,一方面,通过共享环境和共享对象实现了第一视频的第一纹理的间接共享,提供了一种安全且高效的视频纹理共享方式,避免了因直接共享导致第一纹理改动的问题的发生,同时提前预防了混合视频产生黑屏或闪烁等情况;另一方面,对第一视频和第二视频进行混合渲染,提供了一种既支持带透明度的视频渲染,又支持两个视频混合的方式,保证了原本视频的色彩饱和度和清晰度的正常显示,也能够将两个视频平滑自然的完美融合,极大地优化了混合视频的视觉效果,丰富了混合视频的应用场景。100.下面对视频渲染方法的各个步骤进行详细说明。101.在步骤s110中,获取第一视频的第一纹理,并创建第一视频的共享环境,以及创建第一视频的共享对象,共享环境为间接共享的第一纹理所依赖的渲染环境,共享对象为将第一纹理暴露给外部进行间接共享的所需对象。102.在本公开的示例性实施例中,第一视频可以是视频生产者,亦即将要混合进其他视频的视频。举例而言,第一视频可以是直播流、摄像头数据等,本示例性实施例对此不做殊限定。103.对于第一视频能够渲染的每一帧,都可以获取对应的纹理作为第一纹理,亦即texture。并且,将该第一纹理用整数类型的textida表示。104.其中,texture通常是一个2d图片,可以用来添加物体的细节。105.在第一视频渲染时,还可以创建第一视频的共享环境和共享对象。106.在可选的实施例中,图2示出了创建第一视频的共享环境的方法的流程示意图,如图2所示,该方法至少可以包括以下步骤:在步骤s210中,确定第一视频的上下文对象为共享上下文对象,并创建渲染线程。107.具体的,通过egl14.eglgetcurrentcontext()获取第一视频当前的context作为共享上下文对象sharedcontext。108.其中,context存储渲染相关的输入数据,例如保存内部状态信息、gl调用指令。109.其中,android应用模型是基于组件的应用设计模式,组件的运行要有一个完整的android工程环境。在这个工程环境下,activity(一种android系统组件)、service(一种android系统组件)等系统组件才能够正常工作,而这些组件并不能采用普通的java(一种计算机编程语言)对象创建方式,new(新建)一下就能创建实例了,而是要有它们各自的上下文环境,也就是context。可以这样讲,context是维持android程序中各组件能够正常工作的一个核心功能类。110.源码中的注释是这么来解释的,context提供了关于应用环境全局信息的接口。它是一个抽象类,它的执行被android系统所提供。它允许获取以应用为特征的资源和类型,是一个统领一些资源(应用程序环境变量等)的上下文。111.context描述一个应用程序环境的信息(即上下文);android提供了该抽象类的具体实现类;通过它可以获取应用程序的资源和类(包括应用级别操作,如启动activity,发广播,接受intent(意图,媒体中介)等)。112.context具有四个作用,分别是:四大组件的交互,包括启动activity、broadcast(一种android系统组件)、service,获取contentresolver等;获取系统/应用资源,包括assetmanager、packagemanager、resources、systemservice以及color、string、drawable等系统/应用资源;文件,包括获取缓存文件夹、删除文件、sharedpreference(一个轻量级的数据存储)相关等;数据库(sqlite)相关,包括打开数据库、删除数据库、获取数据库路径等。113.进一步的,使用handlerthread创建新的渲染线程。114.在步骤s220中,基于渲染线程,利用共享上下文对象创建共享环境。115.在已创建好的渲染线程中,使用共享上下文对象sharedcontext在另一个线程中创建一个新的eglcontext,用于构建新的egl环境,亦即共享环境。116.其中,egl是opengles和本地窗口系统(nativewindowsystem)之间的通信接口。117.图3示出了实现创建新的eglcontext的代码示意图,如图3所示,入参megldisplay是通过egl14.eglgetdisplay(0)获取默认的显示屏。config是通过egl14.eglchooseconfig获取配置,它包含egl(android系统的绘图api(applicationprogramminginterface,应用程序接口))相关的各种属性。118.因此,后续的所有初始化、渲染等操作都要在该渲染线程中执行,并且,执行的操作都需要依赖该共享环境。119.进一步的,创建一个新的surfacetexture对象,作为第一视频的共享对象。120.具体的,图4示出了实现创建共享对象的代码示意图,如图4所示,该共享对象用于关联共享的上下文(attachtoglcontext)、解绑上下文(detachfromglcontext)、用于绘制共享的纹理数据以及给外部设置监听使用等。121.在本示例性实施例中,通过创建第一视频的共享环境和共享对象,为后续的渲染等操作提供环境支持和对象支持,保障视频渲染的可实施性。122.在步骤s120中,基于共享环境,在共享对象中绘制第一纹理。123.在本公开的示例性实施例中,创建第一视频的共享环境和共享对象之后,可以进一步根据共享环境和共享对象绘制第一纹理。124.在可选的实施例中,图5示出了在共享对象中绘制第一纹理的方法的流程示意图,如图5所示,该方法至少可以包括以下步骤:在步骤s510中,创建临时帧缓冲,并绑定第一纹理和临时帧缓冲得到第一绑定关系。125.创建一个临时帧缓冲,并且,该临时帧缓冲可以用framebuffer表示。126.其中,临时帧缓冲是一个fbo(framebufferobject,帧缓冲区对象),实际上是一个可添加缓冲区的容器,可以为其添加纹理或渲染缓冲区对象。127.fbo本身不能用于渲染,只有添加了纹理或者渲染缓冲区之后才能作为渲染目标,它仅且提供了3个附着(attachment),分别是颜色附着、深度附着和模板附着。128.进一步的,将该临时帧缓冲与第一纹理进行绑定得到第一纹理和临时帧缓冲之间的第一绑定关系。129.绑定第一纹理和临时帧缓冲是opengl的api操作,亦即gles20.glframebuffertexture2d。130.具体的,可以通过以下代码实现:131.gles20.glframebuffertexture2d(132.gles20.gl_framebuffer,133.gles20.gl_color_attachment0,134.gles20.gl_texture_2d,textureid,0135.)136.在步骤s520中,基于共享环境,利用第一绑定关系将第一纹理绘制至共享对象。137.在可选的实施例中,图6示出了利用第一绑定关系绘制第一纹理的方法的流程示意图,如图6所示,该方法至少可以包括以下步骤:在步骤s610中,创建当前纹理标识,并绑定临时帧缓冲和当前纹理标识得到第二绑定关系。138.同时,创建一个新的纹理,并用texttempid这一当前纹理标识表示。139.具体的,创建方式可以是:140.gles20.glgentextures(count,texture,0)141.进一步的,通过gles20.glframebuffertexture2d将临时帧缓冲绑定该新的纹理texttempid得到第二绑定关系。142.具体的,可以通过以下代码实现绑定:143.gles20.glbindframebuffer(gles20.gl_framebuffer,framebuffer)144.gles20.glframebuffertexture2d(145.gles20.gl_framebuffer,gles20.gl_color_attachment0,146.gles20.gl_texture_2d,texttempid,0147.)148.在步骤s620中,基于第一绑定关系和第二绑定关系,将第一纹理绘制到与临时帧缓冲绑定的当前纹理标识中。149.在生成第一纹理和临时帧缓冲之间的第一绑定关系,以及生成临时帧缓冲和当前纹理标识之间的第二绑定关系之后,可以将textida表征的第一纹理绘制到与临时帧缓冲绑定的当前纹理标识texttempid中。具体的绘制方式可以通过gles20.gldrawarrays实现。150.在步骤s630中,基于共享环境,根据当前纹理标识将第一纹理绘制到共享对象。151.图7示出了根据当前纹理标识绘制第一纹理的方法的流程示意图,如图7所示,该方法至少可以包括以下步骤:在步骤s710中,利用共享对象创建数据存储区。152.图8示出了实现利用共享对象创建数据存储区的代码示意图,如图8所示,将共享对象surfacetexture对象作为入参,创建绘制画面的surface作为数据存储区。153.图8的具体实现可以是egl14.eglcreatewindowsurface(this.megldisplay,this.meglconfig,surface,newint[]{12344},0)。[0154]其中,surface对应着一块屏幕缓冲区。每个window对应一个surface,存储渲染相关的输出数据,例如颜色、深度、模板buffer等。[0155]在步骤s720中,基于数据存储区,根据当前纹理标识将第一纹理绘制到共享对象。[0156]在共享环境中,根据surface数据存储区中的数据,可以按照当前纹理标识将第一纹理绘制到共享对象中。[0157]由于共享对象surfacetexture对象是传递出去给与第一视频关联的第二视频使用的,所以每次有图像更新,第二视频都能在后续通过surfacetexture获取到。[0158]在本示例性实施例中,根据共享环境和共享对象绘制第一纹理,为第一视频暴露给外部提供了实现方式,解决了第一视频的资源共享问题,并且,该第一视频共享方式为安卓系统所独有,具有安全且高效等一系列优点。[0159]值得说明的是,还可以将该第一纹理进行离屏渲染实现拷贝,以作其他用途[0160]在可选的实施例中,将第一纹理发送至渲染线程。[0161]在步骤s620基于第一绑定关系和第二绑定关系,将第一纹理绘制到与临时帧缓冲绑定的当前纹理标识中之后,可以将第一纹理通过当前纹理标识texttempid传送给共享上下文对象的渲染线程。[0162]这样,在新的egl环境里面就能拿到第一视频的数据,而不需要通过glcopyteximage实现纹理图像拷贝,提供了一种更加便捷分享视频纹理的方式,并且,提高了第一视频的渲染效率,也避免了屏幕闪烁、黑屏等问题的产生。[0163]即使后续第二视频渲染该拷贝的第一纹理,也可以再次创建其他的帧缓冲区对象,对第一视频的图像纹理进行二次处理。[0164]在步骤s130中,通过共享对象将第一纹理调用至与第一视频对应的第二视频,以对第一视频和第二视频进行混合渲染得到混合视频。[0165]在本公开的示例性实施例中,通过共享环境将第一纹理绘制到共享对象之后,可以通过该共享对象调用第一纹理。[0166]在可选的实施例中,图9示出了将第一纹理调用至第二视频的方法的流程示意图,如图9所示,该方法至少可以包括以下步骤:在步骤s910中,创建对象纹理标识,并绑定共享对象和对象纹理标识得到第三绑定关系。[0167]在创建第一视频的共享对象之后,可以创建对象纹理标识,并将该对象纹理标识用纹理id表示。[0168]具体的,可以通过以下代码实现创建对象纹理标识:[0169]int[]texture=newint[1];[0170]gles20.glgentextures(1,texture,0)[0171]其中,该纹理id是通过入参的形式传递给surfacetexture的。[0172]进一步的,可以将该共享对象和对象纹理标识进行绑定得到共享对象和对象纹理标识之间的第三绑定关系。[0173]具体的,通过gles20.glbindtexture(inttarget,inttexture)实现绑定共享对象和对象纹理标识。[0174]其中,第一个参数为纹理id,第二个参数是纹理类型。绑定的对象纹理标识用于渲染视频画面,方便后续传递纹理id获取第一纹理。[0175]在步骤s920中,根据第三绑定关系将对象纹理标识赋值给绘制到共享对象中的第一纹理。[0176]由于第三绑定关系是将共享对象和对象纹理标识进行绑定,因此,通过该绑定关系可以将对象纹理标识赋值给已经绘制到共享对象中的第一纹理,以进行后续渲染。[0177]在步骤s930中,当监听到在共享对象绘制出第一纹理时,利用对象纹理标识将第一纹理调用至与第一视频对应的第二视频。[0178]由于在创建surfacetexture的时候就设置监听:this.vsurfacetexture.setonframeavailablelistener(listener),因此,通过共享对象设置的监听能够监听到在共享对象绘制出第一纹理。[0179]进一步的,对于第一视频已经共享出来的绘制好第一纹理的共享对象,可以调用updateteximage()方法更新纹理,然后通过该共享对象的对象宝文理标识就能够将第一纹理调用至第二视频。[0180]更进一步的,可以对第一视频和第二视频进行混合渲染,以得到对应的混合视频。[0181]在第二视频渲染一帧时,可以通过urfacetexture.attachtoglcontext(inttextureid)获取第一视频最近更新的那一帧纹理,亦即第一纹理。[0182]这个第一纹理纹理绑定在gl_texture_external_oes纹理目标上的,因此,第一纹理纹理是oes纹理。[0183]具体的,在gles20.glbindtexture(target,textid)绑定纹理有两个参数,一个是target类型,一个是纹理id。其中,gl_texture_external_oes是一个内置变量,表示类型为外部oes纹理,android平台的纹理是oes纹理,因此,后续需要转换成普通的2d纹理。[0184]attachtoglcontext方法能获取到第一视频的第一纹理,纹理类型为oes纹理。[0185]attachtoglcontext的作用是将surfacetexture附加到调用线程当前的opengles上下文,创建一个新的opengles纹理对象,并使用上次调用surfacetexture.detachfromglcontext()方法时的surfacetexture图像帧填充。亦即获取第一视频最近更新的第一纹理,将第一视频的第一纹理填充到第二视频的纹理上。参数textureid是第二视频的渲染线程中生成纹理id,也就是对应着gl_texture_external_oes纹理的位置,这样就能拿到第一视频的数据,在第二视频中渲染。[0186]图10示出了对第一视频和第二视频进行混合渲染的方法的流程示意图,如图10所示,该方法至少可以包括以下步骤:在步骤s1010中,当根据第二视频确定混合视频中的第一视频为透明时,对第二视频进行渲染得到混合视频。[0187]由于第二视频其实是先渲染的,只是在渲染过程中插入了第一视频的第一纹理,因此,在第二视频的渲染过程中可以先获取第二视频右半边视频的g值(rgb(red、green、blue)颜色系统中g通道中的值)。该第二视频右半边视频的g值用于表征在混合视频中第一视频是否为透明。[0188]图11示出了第二视频的原始画面的场景效果图,如图11所示,第二视频均分为左右两个部分。[0189]左半部分包含了第二视频的rgb值,右半部分的r通道存储第二视频的透明度信息alpha2,g通道用于存储第一视频的透明度信息alpha1。该第一视频的透明度信息也可以使用b通道存储,本示例性实施例对此不做特殊限定。[0190]基于此,获取第二视频的右半部分的g通道或者r通道存储的第一视频的透明度信息。当该透明度信息为0时,表明在混合视频中的第一视频是透明的,因此,无法在混合视频中看到第一视频,只对第二视频进行渲染即可得到该种情况下的混合视频。[0191]在步骤s1020中,当根据第二视频确定混合视频中的第一视频为非透明时,对第一视频和第二视频进行混合渲染得到混合视频。[0192]由于第二视频其实是先渲染的,只是在渲染过程中插入了第一视频的第一纹理,因此,在第二视频的渲染过程中可以先获取第二视频右半边视频的g值。该第二视频右半边视频的g值用于表征在混合视频中第一视频是否为透明。[0193]如图11所示,第二视频均分为左右两个部分,左半部分包含了第二视频的rgb值,右半部分的r通道存储第二视频的透明度信息alpha2,g通道用于存储第一视频的透明度信息alpha1。该第一视频的透明度信息也可以使用b通道存储,本示例性实施例对此不做特殊限定。[0194]基于此,获取第二视频的右半部分的g通道或者r通道存储的第一视频的透明度信息。当该透明度信息不为0时,表明在混合视频中的第一视频不是透明的,因此,可以在混合视频中看到第一视频,那么需要对第一视频和第二视频进行混合渲染得到该种情况下的混合视频。[0195]在可选的实施例中,图12示出了进一步对第一视频和第二视频进行混合渲染的方法的流程示意图,如图12所示,该方法至少可以包括以下步骤:在步骤s1210中,获取第一视频的第一顶点位置和第一纹理像素值,并对第一顶点位置进行矩阵变换得到混合显示位置。[0196]在通过共享的方式获取到第一视频的第一纹理之后,需要在渲染时绑定该第一纹理。进一步的,获取第一视频每一帧的第一纹理的第一顶点位置和第一纹理像素值。[0197]具体的,第一顶点位置的获取是要将第一视频在第二视频哪个范围内渲染的物理坐标转换为openggl坐标系的第一顶点位置,从而确定第一视频的显示位置。[0198]值得说明的是,对于纹理坐标,取整个第一视频的区域,即完整的1*1的纹理坐标范围。[0199]具体的,通过往顶点着色器里面传递position(位置)信息确定,该position信息包括包含x,y,z,w的值。其中,顶点坐标是一个四维向量,x,y,z是三个常见的轴,w表示缩放因子,x、y、z除以w来进行缩放,通常情况下,w可以为1.0。[0200]其中,顶点着色器程序用来描述顶点需要执行的模型变换、视变换、投影变换、光照(transformandlighting)处理的顶点着色器程序源代码/可执行文件。[0201]顶点着色器的输入有:用attribute修饰的属性,可以传递顶点数据、纹理坐标等;用uniform修饰的属性,可以传递变换矩阵等。[0202]顶点着色器常见的输出有:gl_position,将变换后的顶点数据进行输出;gl_pointsize,设置点的大小。[0203]在顶点着色器进行的业务处理有矩阵变换的计算、计算光照公式生成逐顶点颜色、生成/变换纹理坐标等。[0204]为了能够使得第一视频要显示的第一顶点位置完美切合第二视频,因此可以进一步对第一顶点位置进行矩阵变换,以得到混合显示位置。[0205]具体的,通过安卓系统提供的gles20.gluniformmatrix4fv(vertexmatrixhandler,1,false,matrix,0)实现对第一顶点位置的矩阵变换。其中,matrix为计算好的对第一视频进行移动或者缩放等处理的外部传入矩阵,vertexmatrixhandler为顶点着色器的矩阵变量的句柄(引用)。该句柄表示给片元着色器传递矩阵的一个int(整数)类型的引用,相当于要找个关联对象帮助传入矩阵。[0206]其中,片元着色器程序是用来描述片段上执行操作(例如颜色混合)的片元着色器程序源代码/可执行文件。[0207]在片元着色器中的输入有:在光栅化阶段通过插值为每个片段生成的纹理坐标;用uniform修饰的属性,可以传递在片元着色器需要使用的数据等;用sampler2d修饰的属性,传递纹理对象,实际上传递的是对应的纹理单元(textureunit)索引号。[0208]片元着色器的常用输出:gl_fragcolor输出每个片段的颜色。[0209]在片元着色器的业务处理有计算颜色;获取纹素;往像素点中填充颜色值;可以用于图片/视频中每个像素的颜色填充,例如给视频添加滤镜,实际上就是将视频中每个图片的像素点颜色填充进行修改等。[0210]由于外部传入矩阵为四维向量,并且每个第一顶点位置都有对应的(x,y,z,w),因此,将外部传入矩阵的四维向量和第一顶点位置的四维向量进行相乘就能得到对应的混合显示位置,达到变换的目的。[0211]第一纹理像素值的获取是通过片元着色器使用samplerexternaloes对第一纹理进行采样,确定其每个像素的rgb颜色值。而由于第一纹理像素值是第一纹理的argb色值,因此除了对第一视频的第一纹理进行采样得到rgb颜色值之外,透明度的获取还可以是通过片元着色器对第二视频中的g通道进行采样得到。[0212]图13示出了实现获取混合显示位置和第一纹理像素值的部分代码示意图,如图13所示,该代码表示获取混合显示位置和第一纹理像素值可以是通过第一视频的顶点着色器和片元着色器实现的。[0213]其中,a_position就是外部传入的纹理的坐标位置,u_matrix为传入矩阵,用于视图变换(旋转、缩放、移动等),gl_position将变换后的顶点数据进行输出,gl_fragcolor就是最终a纹理的颜色,这个部分透明度为1.0,rgb值为原始视频的rgb。[0214]在步骤s1220中,获取第二视频的第二顶点位置和第二纹理像素值,并根据混合显示位置、第一纹理像素值、第二顶点位置和第二纹理像素值对第一视频和第二视频进行混合渲染得到混合视频。[0215]第二视频的渲染处理过程与第一视频相同,也要先获取对应的第二顶点位置和第二纹理像素值。并且,位置取决于视频播放的容器的大小和在屏幕中的位置。举例而言,当全屏展示时,画布就是整个屏幕的大小;当半屏展示时,亦即一般的屏幕高度,可以顶部对齐,也可以居中对齐,或者是底部对齐。[0216]图14示出了获取第二顶点位置的代码示意图,如图14所示,该第二顶点位置的获取可以是通过顶点着色器实现,因此,该代码为顶点着色器的获取逻辑。[0217]其中,rgbcolor获取的是第二视频左半边区域的颜色值。[0218]alphacolor是第二视频的右边视频区域的对应颜色,获取r值作为渲染的透明度。[0219]gl_fragcolor为实际rgba的颜色输出。[0220]图15示出了获取第二纹理像素值的代码示意图,如图15所示,该第二纹理像素值的获取可以是通过顶点着色器实现的,因此,该代码为顶点着色器获取第二纹理像素值的逻辑。[0221]其中,v_texcoordinatergb为第二视频的左半边(用于rgb着色)纹理坐标。[0222]v_texcoordinatealpha为第二视频的右半边(用于alpha着色)纹理坐标。[0223]v_texcoordinatesrc为第一视频的纹理坐标(1*1的原第一视频纹理区域)。[0224]a_position为外部传入,根据第二视频渲染的位置尺寸动态确定,亦即第二视频在屏幕中的位置和显示尺寸。[0225]gl_postion为顶点着色器的内置变量,表示输出像素点的最终的坐标位置。[0226]在可选的实施例中,图16示出了更进一步的对第一视频和第二视频进行混合渲染的方法的流程示意图,如图16所示,该方法至少可以包括以下步骤:在步骤s1610中,根据第一纹理像素值和第二纹理像素值得到目标透明度和目标颜色值。[0227]图17示出了透明度的计算方式的示意图,如图17所示,该公式表征两个图层混合时,计算出透明度的方法。举例而言,当画面a上面遮盖画面b,人眼看画面b时,如果画面b完全透明,就只能够看到画面a;如果画面b有一定的透明度,那么在看到画面b的同时,也能够看到有一定透明度的画面a。透明度的值会因为两个图层的透明度不同有一定的渗透率。[0228]在可选的实施例中,图18示出了计算得到目标透明度和目标颜色值的方法的示意图,如图18所示,该方法至少可以包括以下步骤:在步骤s1810中,对第一纹理像素值进行二维采样得到第一采样像素值,并对第二纹理像素值进行二维采样得到第二采样像素值。[0229]图19示出了片元着色器进行二维采样的代码示意图,如图19所示,src表示对第一视频的纹理进行2d(twodimension,二维)采样得到视频第一的rgba值,以作为第一采样像素值;left表示对第二视频左边纹理进行2d采样得到的四维向量,四个值分别代表原始的rgba通道的值(red,green,blue,alpha);right表示对第二视频右边纹理进行2d采样,同样得到右边部分的rgba值。因此,可以确定对第二视频左边纹理进行2d采样得到的四维向量和对第二视频右边纹理进行2d采样得到的右边部分的rgba值为第二采样像素值。[0230]在步骤s1820中,对第一采样像素值和第二采样像素值进行差值计算得到目标透明值。[0231]值得说明的是,对于第一视频和第二视频两个视频不做额外处理之前,原始的a值(alpha)基本都是1,即非透明。[0232]alpha1是第二视频左边的透明度a。[0233]此时alpha2是第二视频右边的g通道的值与第一视频的透明度值的乘积。[0234]对第一视频和第二视频混合部分的透明度进行差值计算可以得到目标透明值。[0235]该目标透明值的计算方式如该公式所示:alpha=1.0-(1.0-alpha1)*(1.0-alpha2)。[0236]其中,alpha即为目标透明值。[0237]在步骤s1830中,对第一采样像素值和第二采样像素值进行线性差值计算得到目标颜色值。[0238]在计算目标颜色值时,需要对第二视频第二采样像素值的左半边部分的颜色值rgb2和第一视频第一采样像素值的颜色值rgb1进行混合。[0239]具体的,可以利用片元着色器的mix函数实现线性差值计算。在mix函数中,前两个参数分别为rgb1和rgb2,第三个参数为线性差值系数,可以使用alpha2。通过mix函数进行线性差值计算后可以得到混合部分的目标颜色值。[0240]在本示例性实施例中,通过二维采样和计算之后可以得到目标透明值和目标颜色值,为混合视频的渲染提供了数据支持和基础,保障了第一视频和第二视频的混合效果和混合视频的渲染效果。[0241]在步骤s1620中,获取第一视频在第二视频中的混合位置和混合尺寸。[0242]在与图15关联的代码中,还可以通过顶点着色器获取到第一视频在第二视频中的混合位置,该混合位置表征混合视频中,第一视频在第二视频中的显示位置。[0243]除此之外,还可以获取到混合尺寸。该混合尺寸表示在混合后,第一视频要在第二视频中显示的位置范围。举例而言,该混合尺寸可以是将第一视频原本的尺寸完全显示在第二视频中,也可以是截取第一视频的部分,显示在第二视频中。[0244]在步骤s1630中,基于混合显示位置、第二顶点位置、混合位置和混合尺寸,按照目标透明值和目标颜色值对第一视频和第二视频进行混合渲染得到混合视频。[0245]按照混合显示位置、第二顶点位置、混合位置和混合尺寸确定变换后的第一视频、第一视频在第二视频中的显示位置、第二视频的显示位置和第一视频在第二视频中的尺寸等信息后,可以按照目标透明值和目标颜色值对第一视频和第二视频进行混合渲染得到混合视频。[0246]为输出最终的混合视频,可以将混合视频的纹理像素的rgba值通过gl_fragcolor=vec4(rgb,alpha)输出。[0247]其中,gl_fragcolor是着色器的内置变量,表示输出像素的argb值[0248]该变量可以将目标像素值和目标透明值传送到gpu的渲染管线,以进行着色得到混合视频。[0249]值得说明的是,在第一视频未与第二视频进行混合的其他第二视频的部分,按照原来的第二视频进行渲染即可。[0250]在本示例性实施例中,通过对第一视频和第二视频的混合渲染能够得到对应的混合视频,提供了一种两个视频的混合方式,融合方式极佳,两个视频的纹理边界平滑自然,并且色彩饱和度和清晰度正常,因此,支持两个视频的完美混合,提高了混合视频的观赏性。[0251]值得说明的是,当通过共享对象将第一纹理调用至第二视频时,可能会因为网络等问题导致无法正常调用。在这种情况下,还支持普通图片的占位渲染。[0252]在可选的实施例中,图20示出了对默认图片和第二视频进行混合渲染的方法的流程示意图,如图20所示,该方法至少可以包括以下步骤:在步骤s2010中,当通过共享对象未将第一纹理调用至与第一视频对应的第二视频时,获取默认图片以及默认图片的图片顶点位置和图片像素值。[0253]在步骤s130中无法通过共享对象将第一纹理调用至第二视频时,获取预先设置好的默认图片。并且,还可以获取到该默认图片的图片顶点位置和图片像素值。此时,无需对图片顶点位置进行矩阵变化。[0254]在步骤s2020中,根据图片顶点位置、图片像素值、第二顶点位置和第二纹理像素值对默认图片和第二视频进行混合渲染得到混合视频。[0255]在获取到默认图片的图片顶点位置和图片像素值之后,可以按照步骤s1220的方式根据图片顶点位置、图片像素值、第二顶点位置和第二纹理像素值对默认图片和第二视频进行混合渲染得到混合视频,本示例性实施例对此不做特殊限定。[0256]值得说明的是,由于是利用共享对象将第一为例调用至第二视频中的,因此,在绘制完一帧第一纹理之后,需要对共享对象进行解绑。[0257]在可选的实施例中,利用共享对象解除第一纹理的共享环境。[0258]具体的,通过共享对象的surfacetexture.detachfromglcontext()解绑绘制完的第一纹理和共享环境。这样,就可以实现安全的纹理共享。[0259]图21示出了混合渲染得到的混合视频的场景效果图,如图21所示,在图11示出的第二视频的原始画面中,左边中间的白色区域就是一个电视机。[0260]但是,在将第一视频混合至第二视频得到的混合视频中,在第二视频的原始画面播放时,可以在该电视机上显示第一视频的画面。最终混合视频呈现的效果就是第二视频中的人坐在电视机前面看电视,而电视机里面播放的是外部共享的第一视频的画面。[0261]值得说明的是,第二视频给用户看到的只有左边部分,右边部分是用来读取透明度信息的,并不会真正渲染到屏幕上。而第一视频给用户看到的只有电视机中的部分。[0262]综上所述,在视频纹理共享部分,如果a、b两个视频(其中,视频a为视频生产者,视频b为需要混合视频a的视频的消费者),它们是在两个不同的播放器播放,渲染视图也不是一个,那么它们是在不同的渲染线程,不同的上下文,视频数据是不能彼此读取的。因为opengl操作会判断发起gl指令的线程所关联的context是否与目标数据所在的context一致。[0263]视频共享图像帧不能像传递java对象那样直接抛给对方使用。如果要共享视频数据,需要使用同一个openggl的context,或者采用间接的方式共享。[0264]直接共享context是可以共享一些资源的,但是如果视频提供方不希望调用方改动到它原本的上下文,就不便直接共享context实现视频资源共享。[0265]因此,在本公开中通过间接共享的方式实现。亦即,在视频a渲染时,通过视频a的context创建一个新的eglcontext启动一个渲染线程,将视频a渲染线程的纹理数据共享给新的渲染线程。[0266]在视频a绘制时,创建一个framebuffer,绑定一个新创建的纹理进行绘制。亦即,通过fbo管理这份纹理数据,离屏渲染到新eglcontext绑定的surfacetexture,再通过给外界暴露surfacetexture的方式来实现画面数据共享。[0267]在视频和视频的混合渲染部分,视频的渲染实际上是解码视频每一帧数据,每一帧对应一个2d图片。然后,将每一张图片绘制到屏幕上面,mp4视频常规的渲染是不支持透明的,只有rgb的颜色值,即red、green、blue三个通道的值,通过三原色组成了视频多彩的画面。[0268]视频a可以是常规的视频,也可以是直播的画面,画面颜色只有rgb通道信息。[0269]视频b需要特殊处理,做成左右对半分的视频,可以通过工具计算生成,也可以设计师通过美术工具制作。[0270]视频渲染需要的顶点坐标、纹理坐标都可以通过视频尺寸和要显示的位置确定。视频b渲染时,读取左半部分纹理的rgb,再读取右半部分纹理的r值,就能得到视频b的argb值;视频a取其原本的全部纹理显示,视频a的rgb值加上alpha1就能得到视频a的argb值。[0271]然后,指定渲染的区域大小为原始视频的一半,即可实现带alpha值的纹理的混合渲染。[0272]视频b处理成对半分的,主要是方便计算视频的顶点坐标位置,而r、g通道分别存储透明度信息,是因为原本的r通道已经被视频b的alpha信息占用了,所以视频a的透明度信息就无法保存,必须用另一个通道来存储,所以也可以放在b通道。[0273]值得说明的是,当没有传入第一视频的第一纹理的情况下,就无须进行视频纹理共享的部分,只需要将视频b转换成2d纹理,并进行渲染即可。[0274]在本公开中,原始视频,亦即第二视频是左右对半分的视频,左边是带有rgb通道的彩色视频,右边是灰白色视频或者其他颜色的视频,例如r通道不为0,其他通道为0,即为红色视频;g通道不为0,其他通道为0,即为绿色视频;b通道不为0,其他通道为0,即为蓝色视频。并且,用r通道存储视频渲染时所需的alpha值。[0275]并且,解决了视频资源共享的问题,例如图像帧(imageframe)、着色器、纹理等。一个正在播放的视频a,例如视频直播间的实时视频帧数据传给另一个正在播放的mp4视频b,让a在b中进行同步渲染,能够解决不同opengl环境中的视频资源共享的问题。亦即不同渲染线程、不同上下文(context)的资源共享。[0276]除此之外,解决了纹理混合渲染以及二次处理。具体的,支持两个画面完美混合,对共享的视频画面进行二次处理的需要,例如旋转、缩放、变换、移动等需要,还可以通过fbo实现对画面进行多次处理,也解决了原始mp4画面与直播画面边缘混合和位置对齐的问题。具体的,使用opengl实现自定义顶点着色器和片段着色器,例如顶点坐标变换、纹理像素颜色混合等。[0277]进一步的,在待混合的视频画面数据获取失败,并导致无法混合时,还支持普通图片的占位渲染。[0278]更进一步的,也解决了画面闪烁、黑屏和混合边界存在缝隙等问题。[0279]值得说明的是,本公开完全在gpu中执行,无需与cpu进行交互或者使cpu参与其中,因此节约渲染性能,对设备等硬件设施非常友好,实用性极强。[0280]在本公开的示例性实施例中的视频渲染方法,一方面,通过共享环境和共享对象实现了第一视频的第一纹理的间接共享,提供了一种安全且高效的视频纹理共享方式,避免了因直接共享导致第一纹理改动的问题的发生,同时提前预防了混合视频产生黑屏或闪烁等情况;另一方面,对第一视频和第二视频进行混合渲染,提供了一种既支持带透明度的视频渲染,又支持两个视频混合的方式,保证了原本视频的色彩饱和度和清晰度的正常显示,也能够将两个视频平滑自然的完美融合,极大地优化了混合视频的视觉效果,丰富了混合视频的应用场景,也能够提升应用场景中的产品竞争力,在一定程度上增加产品观赏性和营收。[0281]此外,在本公开的示例性实施例中,还提供一种视频渲染装置。图22示出了视频渲染装置的结构示意图,如图22所示,视频渲染装置2200可以包括:纹理获取模块2210、间接共享模块2220和混合渲染模块2230。其中:[0282]纹理获取模块2210,被配置为获取第一视频的第一纹理,并创建所述第一视频的共享环境和共享对象;[0283]间接共享模块2220,被配置为基于所述共享环境,在所述共享对象中绘制所述第一纹理;[0284]混合渲染模块2230,被配置为通过所述共享对象将所述第一纹理调用至与所述第一视频对应的第二视频,以对所述第一视频和所述第二视频进行混合渲染得到混合视频。[0285]在本发明的一种示例性实施例中,所述创建所述第一视频的共享环境和共享对象,包括:[0286]创建所述第一视频的共享环境;[0287]创建所述第一视频的共享对象。[0288]在本发明的一种示例性实施例中,所述创建所述第一视频的共享环境,包括:[0289]确定所述第一视频的上下文对象为共享上下文对象,并创建渲染线程;[0290]基于所述渲染线程,利用所述共享上下文对象创建共享环境。[0291]在本发明的一种示例性实施例中,所述基于所述共享环境,在所述共享对象中绘制所述第一纹理,包括:[0292]创建临时帧缓冲,并绑定所述第一纹理和所述临时帧缓冲得到第一绑定关系;[0293]基于所述共享环境,利用所述第一绑定关系将所述第一纹理绘制至所述共享对象。[0294]在本发明的一种示例性实施例中,所述基于所述共享环境,利用所述第一绑定关系将所述第一纹理绘制至所述共享对象,包括:[0295]创建当前纹理标识,并绑定所述临时帧缓冲和所述当前纹理标识得到第二绑定关系;[0296]基于所述第一绑定关系和所述第二绑定关系,将所述第一纹理绘制到与所述临时帧缓冲绑定的所述当前纹理标识中;[0297]基于所述共享环境,根据所述当前纹理标识将所述第一纹理绘制到所述共享对象。[0298]在本发明的一种示例性实施例中,所述根据所述当前纹理标识将所述第一纹理绘制到所述共享对象,包括:[0299]利用所述共享对象创建数据存储区;[0300]基于所述数据存储区,根据所述当前纹理标识将所述第一纹理绘制到所述共享对象。[0301]在本发明的一种示例性实施例中,在所述根据所述当前纹理标识将所述第一纹理绘制到所述共享对象之后,所述方法还包括:[0302]将所述第一纹理发送至所述渲染线程。[0303]在本发明的一种示例性实施例中,在所述通过所述共享对象将所述第一纹理调用至与所述第一视频对应的第二视频之后,所述方法还包括:[0304]利用所述共享对象解除所述第一纹理的所述共享环境。[0305]在本发明的一种示例性实施例中,所述通过所述共享对象将所述第一纹理调用至与所述第一视频对应的第二视频,包括:[0306]创建对象纹理标识,并绑定所述共享对象和所述对象纹理标识得到第三绑定关系;[0307]根据所述第三绑定关系将所述对象纹理标识赋值给绘制到所述共享对象中的第一纹理;[0308]当监听到在所述共享对象绘制出所述第一纹理时,利用所述对象纹理标识将所述第一纹理调用至与所述第一视频对应的第二视频。[0309]在本发明的一种示例性实施例中,所述对所述第一视频和所述第二视频进行混合渲染得到混合视频,包括:[0310]当根据所述第二视频确定混合视频中的所述第一视频为透明时,对所述第二视频进行渲染得到混合视频;[0311]当根据所述第二视频确定混合视频中的所述第一视频为非透明时,对所述第一视频和所述第二视频进行混合渲染得到混合视频。[0312]在本发明的一种示例性实施例中,所述对所述第一视频和所述第二视频进行混合渲染得到混合视频,包括:[0313]获取所述第一视频的第一顶点位置和第一纹理像素值,并对所述第一顶点位置进行矩阵变换得到混合显示位置;[0314]获取所述第二视频的第二顶点位置和第二纹理像素值,并根据所述混合显示位置、所述第一纹理像素值、所述第二顶点位置和所述第二纹理像素值对所述第一视频和所述第二视频进行混合渲染得到混合视频。[0315]在本发明的一种示例性实施例中,在所述获取所述第二视频的第二顶点位置和第二纹理像素值之后,所述方法还包括:[0316]当通过所述共享对象未将所述第一纹理调用至与所述第一视频对应的第二视频时,获取默认图片以及所述默认图片的图片顶点位置和图片像素值;[0317]根据所述图片顶点位置、所述图片像素值、所述第二顶点位置和所述第二纹理像素值对所述默认图片和所述第二视频进行混合渲染得到混合视频。[0318]在本发明的一种示例性实施例中,所述根据所述混合显示位置、所述第一纹理像素值、所述第二顶点位置和所述第二纹理像素值对所述第一视频和所述第二视频进行混合渲染得到混合视频,包括:[0319]根据所述第一纹理像素值和所述第二纹理像素值得到目标透明度和目标颜色值;[0320]获取所述第一视频在所述第二视频中的混合位置和混合尺寸;[0321]基于所述混合显示位置、所述第二顶点位置、所述混合位置和所述混合尺寸,按照所述目标透明值和所述目标颜色值对所述第一视频和所述第二视频进行混合渲染得到混合视频。[0322]在本发明的一种示例性实施例中,所述根据所述第一纹理像素值和所述第二纹理像素值得到目标透明度和目标颜色值,包括:[0323]对所述第一纹理像素值进行二维采样得到第一采样像素值,并对所述第二纹理像素值进行二维采样得到第二采样像素值;[0324]对所述第一采样像素值和所述第二采样像素值进行差值计算得到目标透明值;[0325]对所述第一采样像素值和所述第二采样像素值进行线性差值计算得到目标颜色值。[0326]上述视频渲染装置2200的具体细节已经在对应的视频渲染方法中进行了详细的描述,因此此处不再赘述。[0327]应当注意,尽管在上文详细描述中提及了视频渲染装置2200的若干模块或者单元,但是这种划分并非强制性的。实际上,根据本公开的实施方式,上文描述的两个或更多模块或者单元的特征和功能可以在一个模块或者单元中具体化。反之,上文描述的一个模块或者单元的特征和功能可以进一步划分为由多个模块或者单元来具体化。[0328]此外,在本公开的示例性实施例中,还提供了一种能够实现上述方法的电子设备。[0329]下面参照图23来描述根据本发明的这种实施例的电子设备2300。图23显示的电子设备2300仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。[0330]如图23所示,电子设备2300以通用计算设备的形式表现。电子设备2300的组件可以包括但不限于:上述至少一个处理单元2310、上述至少一个存储单元2320、连接不同系统组件(包括存储单元2320和处理单元2310)的总线2330、显示单元2340。[0331]其中,所述存储单元存储有程序代码,所述程序代码可以被所述处理单元2310执行,使得所述处理单元2310执行本说明书上述“示例性方法”部分中描述的根据本发明各种示例性实施例的步骤。[0332]存储单元2320可以包括易失性存储单元形式的可读介质,例如随机存取存储单元(ram)2321和/或高速缓存存储单元2322,还可以进一步包括只读存储单元(rom)2323。[0333]存储单元2320还可以包括具有一组(至少一个)程序模块2325的程序/实用工具2324,这样的程序模块2325包括但不限于:操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。[0334]总线2330可以为表示几类总线结构中的一种或多种,包括存储单元总线或者存储单元控制器、外围总线、图形加速端口、处理单元或者使用多种总线结构中的任意总线结构的局域总线。[0335]电子设备2300也可以与一个或多个外部设备2500(例如键盘、指向设备、蓝牙设备等)通信,还可与一个或者多个使得用户能与该电子设备2300交互的设备通信,和/或与使得该电子设备2300能与一个或多个其它计算设备进行通信的任何设备(例如路由器、调制解调器等等)通信。这种通信可以通过输入/输出(i/o)接口2350进行。并且,电子设备2300还可以通过网络适配器2360与一个或者多个网络(例如局域网(lan),广域网(wan)和/或公共网络,例如因特网)通信。如图所示,网络适配器2360通过总线2330与电子设备2300的其它模块通信。应当明白,尽管图中未示出,可以结合电子设备2300使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、raid系统、磁带驱动器以及数据备份存储系统等。[0336]通过以上的实施例的描述,本领域的技术人员易于理解,这里描述的示例实施例可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本公开实施例的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是cd-rom,u盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、终端装置、或者网络设备等)执行根据本公开实施例的方法。[0337]在本公开的示例性实施例中,还提供了一种计算机可读存储介质,其上存储有能够实现本说明书上述方法的程序产品。在一些可能的实施例中,本发明的各个方面还可以实现为一种程序产品的形式,其包括程序代码,当所述程序产品在终端设备上运行时,所述程序代码用于使所述终端设备执行本说明书上述“示例性方法”部分中描述的根据本发明各种示例性实施例的步骤。[0338]参考图24所示,描述了根据本发明的实施例的用于实现上述方法的程序产品2400,其可以采用便携式紧凑盘只读存储器(cd-rom)并包括程序代码,并可以在终端设备,例如个人电脑上运行。然而,本发明的程序产品不限于此,在本文件中,可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。[0339]所述程序产品可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以为但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。[0340]计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。可读信号介质还可以是可读存储介质以外的任何可读介质,该可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。[0341]可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、有线、光缆、rf等等,或者上述的任意合适的组合。[0342]可以以一种或多种程序设计语言的任意组合来编写用于执行本发明操作的程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如java、c++等,还包括常规的过程式程序设计语言—诸如“c”语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。在涉及远程计算设备的情形中,远程计算设备可以通过任意种类的网络,包括局域网(lan)或广域网(wan),连接到用户计算设备,或者,可以连接到外部计算设备(例如利用因特网服务提供商来通过因特网连接)。[0343]本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其他实施例。本技术旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本
技术领域
:中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由权利要求指出。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1