视频合成方法及装置与流程

文档序号:12136295阅读:281来源:国知局
视频合成方法及装置与流程

本发明涉及通讯技术领域,尤其涉及一种视频合成方法及装置。



背景技术:

随着4G时代的到来,互联网领域已从文字时代、图片时代、短视频时代进入到了直播时代,移动视频直播已经成为当前互联网表现最抢眼的领域之一。为了增加视频的趣味性,美化视频效果,主播通常会在录制时增加一些美颜、趣味贴图或者动画等装饰效果,但通常存在录制端与播放端设备不同而不能播放合成视频或是装饰效果与录制视频不能同步播放的问题,导致用户体验较差。



技术实现要素:

本发明的主要目的在于提供一种视频合成方法及装置,旨在解决录制端与播放端设备不同而不能播放合成视频或是装饰效果与录制视频不能同步播放的技术问题。

为实现上述目的,本发明提供的一种视频合成方法包括以下步骤:

获取相机的原始视频帧,将原始视频帧转换成原始视频帧纹理并缓存于系统编码库生成的绘图层;

创建绘图窗口,并建立绘图窗口与所述绘图层的对应关系,以将所述绘图层缓存的原始视频帧纹理绘制于所述绘图窗口;

将绘图窗口的原始视频帧纹理与本地系统的效果数据混合编码,生成并输出合成视频,以供接收端解码播放所述合成视频。

优选地,所述获取相机的原始视频帧,将原始视频帧转换成原始视频帧纹理并缓存于系统编码库生成的绘图层的步骤包括:

创建相机预览窗口以获取相机的原始视频帧,并为所述相机预览窗口设置渲染器;

获取所述渲染器基于各个原始视频帧创建的表面纹理和对应的纹理编号,并将获取的所述原始视频帧通过表面纹理和纹理编号转换成原始视频帧纹理;

将原始视频帧纹理缓存于系统编码库生成的绘图层。

优选地,所述创建绘图窗口,并建立绘图窗口与所述绘图层的对应关系,以将所述绘图层缓存的原始视频帧纹理绘制于所述绘图窗口的步骤包括:

创建绘图窗口,根据系统函数接收绘图层缓存的原始视频帧纹理,以建立绘图窗口与绘图层的对应关系;

根据系统编码线程窗口切换规则,完成绘图层与绘图窗口之间的切换,并根据预设的绘图参数和绘图流程,将绘图层的原始视频帧纹理绘制于绘图窗口中。

优选地,所述将绘图窗口的原始视频帧纹理与本地系统的效果数据混合编码,生成并输出合成视频,以供接收端解码播放所述合成视频的步骤包括:

根据接收的输入指令,从本地系统中获取对应的效果数据;

基于系统开放图形库将效果数据转换为对应的效果纹理,并将效果纹理绘制于绘图窗口中;

对绘图窗口中的原始视频帧纹理和效果纹理进行混合和编码,生成并输出合成视频,以供接收端解码播放所述合成视频。

优选地,所述对绘图窗口中的原始视频帧纹理和效果纹理进行混合和编码,生成并输出合成视频,以供接收端解码播放所述合成视频的步骤包括:

将绘图窗口中的原始视频帧纹理和效果纹理混合成新的视频帧,并输出至与绘图窗口对应的绘图层;

基于系统编码库将绘图层上当前的新的视频帧按照预设格式编码,生成并输出合成视频,以供接收端解码播放所述合成视频。

此外,为实现上述目的,本发明还提供一种视频合成装置,包括:

获取模块,用以获取相机的原始视频帧,将原始视频帧转换成原始视频帧纹理并缓存于系统编码库生成的绘图层;

绘制模块,用以创建绘图窗口,并建立绘图窗口与所述绘图层的对应关系,以将所述绘图层缓存的原始视频帧纹理绘制于所述绘图窗口;

编码模块,用以将绘图窗口的原始视频帧纹理与本地系统的效果数据混合编码,生成并输出合成视频,以供接收端解码播放所述合成视频。

优选地,所述获取模块包括:

获取单元,用以创建相机预览窗口以获取相机的原始视频帧,并为所述相机预览窗口设置渲染器;

转换单元,用以获取所述渲染器基于各个原始视频帧创建的表面纹理和对应的纹理编号,并将获取的所述原始视频帧通过表面纹理和纹理编号转换成原始视频帧纹理;

缓存单元,用以将原始视频帧纹理缓存于系统编码库生成的绘图层。

优选地,所述绘制模块包括:

绘图窗口创建单元,用以创建绘图窗口,根据系统函数接收绘图层缓存的原始视频帧纹理,以建立绘图窗口与绘图层的对应关系;

绘制单元,用以根据系统编码线程窗口切换规则,完成绘图层与绘图窗口之间的切换,并根据预设的绘图参数和绘图流程,将绘图层的原始视频帧纹理绘制于绘图窗口中。

优选地,所述编码模块包括:

效果图片获取单元,用以根据接收的输入指令,从本地系统中获取对应的效果数据;

效果纹理绘制单元,用以基于系统开放图形库将效果数据转换为对应的效果纹理,并将效果纹理绘制于绘图窗口中;

编码单元,用以对绘图窗口中的原始视频帧纹理和效果纹理进行混合和编码,生成并输出合成视频,以供接收端解码播放所述合成视频。

优选地,所述编码单元包括:

混合单元,用以将绘图窗口中的原始视频帧纹理和效果纹理混合成新的视频帧,并输出至与绘图窗口对应的绘图层;

输出单元,用以基于系统编码库将绘图层上当前的新的视频帧按照预设格式编码,生成并输出合成视频,以供接收端解码播放所述合成视频。

本发明提供的技术方案中,获取相机的原始视频帧,将原始视频帧转换成原始视频帧纹理并缓存于系统编码库生成的绘图层,再创建绘图窗口,并建立绘图窗口与所述绘图层的对应关系,以将所述绘图层缓存的原始视频帧纹理绘制于所述绘图窗口,最后将绘图窗口的原始视频帧纹理与本地系统的效果数据混合编码,生成并输出合成视频,以供接收端解码播放所述合成视频,从而基于绘图层在视频发送端将效果数据合成至待发送视频中,合成视频为通用格式,使得不管接收端是何种类型设备,都能对接收的编码视频解码播放,也解决了现有技术中录制视频与增加的装饰效果数据单独发送而造成的不能同步播放的技术问题,提高了用户体验。

附图说明

图1为本发明视频合成方法第一实施例的流程示意图;

图2为本发明视频合成方法第二实施例中获取原始视频帧步骤的细化流程示意图;

图3为本发明视频合成方法第三实施例中创建绘图窗口步骤的细化流程示意图;

图4为本发明视频合成方法第四实施例中将原始视频帧纹理与效果数据编码步骤的细化流程示意图;

图5为本发明视频合成方法第五实施例中实现视频合成步骤的细化流程示意图;

图6为本发明视频合成装置第一实施例的功能模块示意图;

图7为本发明视频合成装置第二实施例中获取模块的细化功能模块示意图;

图8为本发明视频合成装置第三实施例中绘制模块的细化功能模块示意图;

图9为本发明视频合成装置第四实施例中编码模块的细化功能模块示意图;

图10为本发明视频合成装置第五实施例中编码单元的细化功能模块示意图。

本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。

具体实施方式

应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

本发明提供一种视频合成方法,参照图1,在一实施例中,该视频合成方法包括:

步骤S10,获取相机的原始视频帧,将原始视频帧转换成原始视频帧纹理并缓存于系统编码库生成的绘图层;

可以理解地,视频录制端可以通过多种方式获取相机的原始视频帧;例如,当视频录制端为手机时,可以通过手机自带的相机获取原始视频帧,当视频录制端为电脑时,可以通过电脑外接摄像头来获取原始视频帧。本实施例中,视频录制端为自带有相机的视频录制端,且操作系统为Android系统。

具体地,通过Android系统打开视频录制端的相机,并设置相机参数,例如光圈值、曝光控制、感光度、对焦距离等参数的设置;打开摄像头预览,并创建相机预览窗口(GL Surface View),同时为相机预览窗口设置渲染器(Render),上述步骤均是基于Android系统中开放图形库(Open GL)实现。

所述相机预览窗口用以获取相机的原始视频帧,也就是说,相机每更新一帧数据,系统就会调用一次渲染器的on Draw Frame(GL10)方法为相机预览窗口绘制图像,根据获取的相机每一帧的原始视频帧数据生成开放图形库的原始视频帧纹理。

需要说明的是,纹理就是一个图像或照片,用于在基本图形的表面加入额外的细节。每个二位的纹理都有其自己的坐标空间,其范围是从一个拐角的(0,0)到另一个拐角的(1,1)。当需要把一个纹理应用于一个矩形的时候,因此需要为每个顶点指定一个纹理坐标,以便Open GL知道需要用那个纹理的哪个部分画到矩形上。Android系统中,将以原始的视频帧和贴图作为纹理,使用(0,0)、(1,0)、(0,1)、(1,1)作为四个顶点的纹理坐标,其效果就是将整个图像缩放后,完整地绘制在顶点坐标指定的矩形区域上。

具体地,所述渲染器基于获取的每一原始视屏帧创建表面纹理和对应的纹理编号,这样,在渲染器的on Draw Frame中就可以通过创建的表面纹理(Surface Texure)和纹理编号(Texureld)获取纹理数据和操作纹理了。也就是说,获取所述原始视频帧通过渲染器on Draw Frame转换为对应的原始视频帧纹理。并通过Android系统编码库(Mediacodec)生成一个绘图层(surface),用以缓存所述原始视频帧纹理,所述编码库将从该绘图层获取待编码的视频流。

步骤S20,创建绘图窗口,并建立绘图窗口与所述绘图层的对应关系,以将所述绘图层缓存的原始视频帧纹理绘制于所述绘图窗口;

基于Android系统创建绘图窗口,用以将所述绘图层缓存的原始视频帧纹理绘制于所述绘图窗口;可以理解地,需要建立绘图窗口与绘图层的对应关系。

具体地,为了使用绘图窗口绘图,通过系统函数egl Create Window Surface创建一个EGL Surface,该函数接收编码库生成的绘图层(surface)作为参数,这样就建立了绘图窗口和绘图层的对应关系。

进一步地,Android系统编码线程通过修改“current”来设置EGL Surface,为了使Open GL能够在创建的绘图窗口上绘图,还需要通过系统编码线程调用EGL Surface.make Current方法完成绘图层与绘图窗口之间的切换,并根据预设的绘图参数和绘图流程将绘图层的原始视频帧纹理绘制于绘图窗口。可以理解地,所述绘图参数可以为预设的顶点坐标、纹理坐标和顶点着色器、片段着色器等,根据Open GL的绘图流程,将所述原始视频帧纹理绘制在绘图窗口上。

需要说明的是,所述顶点坐标指的是归一化坐标,用于指定矩形的绘制区域。在Open GL里,需要渲染的一切物体都要映射到x轴和y轴上的[-1,1]的范围内,这个范围内的坐标被称为归一化设备坐标,其独立于屏幕实际的尺寸或形状。Android系统中Open GL占用整个显示屏,因此x轴、y轴的[-1,1]的范围分别映射为屏幕的像素宽和像素高。

可以理解地,图像在绘制之前,需要在Open GL的管道中传递,这就需要称为着色器的子例程,这些着色器会告诉GPU如何绘制数据,有顶点着色器和片段着色器,在绘制任何内容到屏幕之前,需要先定义顶点着色器和片段着色器。

具体地,首先读取原始视频帧的顶点数据,执行顶点着色器,进而可以控制每个顶点,实现渲染、确定顶点位置纹理坐标变换等指令;当顶点的全部属性都被确定后,将顶点组装成图元,然后光栅化图元,负责接收一个图元经过处理的电,并把它转换为片段,每个片段对应屏幕的一个像素;执行片段着色器,进行纹理查找,确定纹理坐标;而后将原始视频帧写入帧缓冲区,即绘图层(surface),最后显示在屏幕上。

步骤S30,将绘图窗口的原始视频帧纹理与本地系统的效果数据混合编码,生成并输出合成视频,以供接收端解码播放所述合成视频。

可以理解地,效果数据可以是美颜、滤镜、趣味贴图、动画效果等。所述效果数据可以是预存于系统中的数据,也可以是用户基于系统程序而产生的当前数据并缓存于系统内存中。

具体地,基于用户输入的控制指令获取系统内存中的效果数据,并与绘图窗口的原始视频帧纹理混合和编码,合成新的视频,并输出到网络推流模块,以供接收端解码播放。

本发明提供的技术方案中,通过获取相机的原始视频帧,将原始视频帧转换成原始视频帧纹理并缓存于系统编码库生成的绘图层,再创建绘图窗口,并建立绘图窗口与所述绘图层的对应关系,以将所述绘图层缓存的原始视频帧纹理绘制于所述绘图窗口,最后将绘图窗口的原始视频帧纹理与本地系统的效果数据混合编码,生成并输出合成视频,以供接收端解码播放所述合成视频,从而基于绘图层在视频发送端将效果数据合成至待发送视频中(即合成视频),合成视频为通用格式,使得不管接收端是何种类型设备,都能对接收的编码视频解码播放,也解决了现有技术中录制视频与增加的装饰效果数据单独发送而造成的不能同步播放的技术问题,提高了用户体验。

进一步地,请参照图2,基于上述实施例一,在本实施例中,上述步骤S10包括:

步骤S11,创建相机预览窗口以获取相机的原始视频帧,并为所述相机预览窗口设置渲染器;

步骤S12,获取所述渲染器基于各个原始视频帧创建的表面纹理和对应的纹理编号,并将获取的所述原始视频帧通过表面纹理和纹理编号转换成原始视频帧纹理;

步骤S13,将原始视频帧纹理缓存于系统编码库生成的绘图层。

具体地,基于Android系统的开放图形库(Open GL),通过Android系统的Camera类,设置相机参数,打开摄像头预览,并创建相机预览窗口(GL Surface View),并为所述相机预览窗口设置渲染器。所述相机预览窗口的创建,能获取相机的原始视频帧。

进一步地,为了获取纹理数据,首先在渲染器中使用开放图形库(Open GL)基于原始视频帧创建表面纹理(Surface Texure)和对应的纹理编号(Texureld),然后通过Camera的set Preview Texture接口传入纹理;这样,通过渲染器的on Draw Frame方法,将获取的所述原始视频帧通过表面纹理和纹理编号转换成原始视频帧纹理,并缓存于系统编码库生成的绘图层。

在本实施例提供的技术方案中,进一步提出了通过创建相机预览窗口以获取相机的原始视频帧,并为所述相机预览窗口设置渲染器;获取所述渲染器基于各个原始视频帧创建的表面纹理和对应的纹理编号,并将获取的所述原始视频帧通过表面纹理和纹理编号转换成原始视频帧纹理,并缓存于系统编码库生成的绘图层。借助Android系统中独立于窗口系统、独立于硬件的开放图形库来实现相机预览窗口的创建,在运行各种操作系统的各种计算机上都可以用,优化视频直播体验和效率。

进一步地,请参照图3,基于上述实施例二,在本实施例中,上述步骤S20包括:

步骤S21,创建绘图窗口,根据系统函数接收绘图层缓存的原始视频帧纹理,以建立绘图窗口与绘图层的对应关系;

步骤S22,根据系统编码线程中的窗口切换规则,完成绘图层与绘图窗口之间的切换,并根据预设的绘图参数和绘图流程,将绘图层的原始视频帧纹理绘制于绘图窗口中。

本发明提供的技术方案中,为了完成录制视频和效果数据的合成,需要创建一个绘图窗口,以完成原始视频帧的绘制和效果数据的绘制。

具体地,为了使用绘图窗口绘图,需要创建一个EGL Context和一个EGL Surface;EGL Context就是当前渲染代码所在的线程,EGL Surface是通过系统函数egl Create Window Surface创建的,该函数接收系统编码库生成的绘图层作为参数,以建立绘图窗口和绘图层的对应关系。

进一步地,当建立了绘图窗口与绘图层之间的对应关系,需要将缓存于绘图层的原始视频帧纹理绘制于绘图窗口。通过系统编码线程调用EGL Surface.make Current方法完成绘图层与绘图窗口之间的切换,基于开放图形库的绘图流程,将原始视频帧纹理绘制在绘图窗口上。

本实施例中,通过创建绘图窗口,以完成原始视频帧纹理的绘制,进而能在绘图窗口对获取的所述原始视频帧进行纹理绘制,并能将本地系统中的效果数据也绘制于绘图窗口,以实现录制视频与效果数据的合成;所述绘图窗口的创建,独立于相机预览窗口,进而能避免相机预览窗口卡顿等现象的发生,提高系统的处理效率。

进一步地,请参照图4,基于上述实施例三,在本实施例中,上述步骤S30包括:

步骤S31,根据接收的输入指令,从本地系统中获取对应的效果数据;

步骤S32,基于系统开放图形库将效果数据转换为对应的效果纹理,并将效果纹理绘制于绘图窗口中;

步骤S33,对绘图窗口中的原始视频帧纹理和效果纹理进行混合和编码,生成并输出合成视频,以供接收端解码播放所述合成视频。

可以理解地,为了美化视频效果,需要在录制的视频中添加效果数据,且需要将效果数据转换成与原始视频帧纹理相同的格式,以实现将效果数据与原始视频帧纹理的混合。需要说明的是,所述效果数据可以是预存于系统中的数据,例如贴图、动画等,也可以是用户基于系统程序而产生的当前数据并缓存于系统内存中,例如滤镜、美颜图片等。

具体地,根据接收的输入指令,首先读取系统磁盘中png或者jpg格式的图片,并生成bitmap位图数据到内存中,然后基于开放图形库的glTexImage2D函数生成二位图像的效果纹理,并使用相应的坐标和着色器将所述效果纹理绘制于绘图窗口上。绘制完成后,将绘图窗口上的原始视频帧纹理和效果纹理混合编码,生成新的合成视频并输出至网络推流模块,以供接收端解码播放。

本实施例提供的技术方案中,进一步细化了效果数据的处理步骤,将录制的原始视频帧与效果数据在视频录制端合成编码,实现了视频合成的实时传输,播放端只需解码播放即可,减少了播放端的处理流程,优化了直播效率,提高了用户体验。

进一步地,请参照图5,基于上述实施例四,在本实施例中,上述步骤S33包括:

步骤S331,将绘图窗口中的原始视频帧纹理和效果纹理混合成新的视频帧,并输出至与绘图窗口对应的绘图层;

步骤S332,基于系统编码库将绘图层上当前的新的视频帧按照预设格式编码,生成并输出合成视频,以供接收端解码播放所述合成视频。

具体地,当完成将效果纹理绘制于绘图窗口的步骤后,将绘图窗口上的原始视频帧纹理和效果纹理混合成新的视频帧,并调用系统中的egl Swap Buffer函数来提交绘制在绘图窗口的当前新的视频帧,输出至与当前绘图窗口对应的绘图层中,系统编码库将以该绘图层作为输出对象,并将绘图层上的当前新的视频帧按照预设的格式编码,输出至网络推流模块,接收端只需解码播放即可。

需要说明的是,本实施例中,通过如下设置以完成将绘图窗口上的原始视频帧纹理和效果纹理的混合:

glEnbale(GL_BLEND);//启用混合

glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);//混合函数。

其中GL_SRC_ALPHA是源混合因子sfactor,GL_ONE_MINUS_SRC_ALPHA是目标混合因子dfactor。使用这个设置,实现了由远及近的绘图,在效果纹理的绘制区域,透明部分将显示原始帧,有像素的部分将显示效果纹理。

本实施例提供的技术方案中,通过将绘图窗口中的原始视频帧纹理和效果纹理混合成新的视频帧,并输出至与绘图窗口对应的绘图层;基于系统编码库将绘图层上当前的新的视频帧按照预设格式编码,生成并输出合成视频,以供接收端解码播放所述合成视频。进一步优化了效果纹理与原始视频帧纹理的处理步骤,以实现录制视频与效果数据的高效同步播放的效果。

本发明还提供一种视频合成装置,参照图6,在一实施例中,本发明提供的视频合成装置包括:

获取模块10,用以获取相机的原始视频帧,将原始视频帧转换成原始视频帧纹理并缓存于系统编码库生成的绘图层;

可以理解地,视频录制端可以通过多种方式获取相机的原始视频帧;例如,当视频录制端为手机时,可以通过手机自带的相机获取原始视频帧,当视频录制端为电脑时,可以通过电脑外接摄像头来获取原始视频帧。本实施例中,视频录制端为自带有相机的视频录制端,且操作系统为Android系统。

具体地,通过Android系统打开视频录制端的相机,并设置相机参数,例如光圈值、曝光控制、感光度、对焦距离等参数的设置;打开摄像头预览,并创建相机预览窗口(GL Surface View),同时为相机预览窗口设置渲染器(Render),上述步骤均是基于Android系统中开放图形库(Open GL)实现。

所述相机预览窗口用以获取相机的原始视频帧,也就是说,相机每更新一帧数据,系统就会调用一次渲染器的on Draw Frame(GL10)方法为相机预览窗口绘制图像,根据获取的相机每一帧的原始视频帧数据生成开放图形库的原始视频帧纹理。

需要说明的是,纹理就是一个图像或照片,用于在基本图形的表面加入额外的细节。每个二位的纹理都有其自己的坐标空间,其范围是从一个拐角的(0,0)到另一个拐角的(1,1)。当需要把一个纹理应用于一个矩形的时候,因此需要为每个顶点指定一个纹理坐标,以便Open GL知道需要用那个纹理的哪个部分画到矩形上。Android系统中,将以原始的视频帧和贴图作为纹理,使用(0,0)、(1,0)、(0,1)、(1,1)作为四个顶点的纹理坐标,其效果就是将整个图像缩放后,完整地绘制在顶点坐标指定的矩形区域上。

具体地,所述渲染器基于获取的每一原始视屏帧创建表面纹理和对应的纹理编号,这样,在渲染器的on Draw Frame中就可以通过创建的表面纹理(Surface Texure)和纹理编号(Texureld)获取纹理数据和操作纹理了。也就是说,获取的相机的所述原始视频帧通过渲染器on Draw Frame转换为对应的原始视频帧纹理。并通过Android系统编码库(Mediacodec)生成一个绘图层(surface),用以缓存所述原始视频帧纹理,所述编码库将从该绘图层获取待编码的视频流。

绘制模块20,用以创建绘图窗口,并建立绘图窗口与所述绘图层的对应关系,以将所述绘图层缓存的原始视频帧纹理绘制于所述绘图窗口;

基于Android系统创建绘图窗口,用以将所述绘图层缓存的原始视频帧纹理绘制于所述绘图窗口;可以理解地,需要建立绘图窗口与绘图层的对应关系。

具体地,为了使用绘图窗口绘图,通过系统函数egl Create Window Surface创建一个EGL Surface,该函数接收编码库生成的绘图层(surface)作为参数,这样就建立了绘图窗口和绘图层的对应关系。

进一步地,Android系统编码线程通过修改“current”来设置EGL Surface,为了使Open GL能够在创建的绘图窗口上绘图,还需要通过系统编码线程调用EGL Surface.make Current方法完成绘图层与绘图窗口之间的切换,并根据预设的绘图参数和绘图流程将绘图层的原始视频帧纹理绘制于绘图窗口。可以理解地,所述绘图参数可以为预设的顶点坐标、纹理坐标和顶点着色器、片段着色器等,根据Open GL的绘图流程,将所述原始视频帧纹理绘制在绘图窗口上。

需要说明的是,所述顶点坐标指的是归一化坐标,用于指定矩形的绘制区域。在Open GL里,需要渲染的一切物体都要映射到x轴和y轴上的[-1,1]的范围内,这个范围内的坐标被称为归一化设备坐标,其独立于屏幕实际的尺寸或形状。Android系统中Open GL占用整个显示屏,因此x轴、y轴的[-1,1]的范围分别映射为屏幕的像素宽和像素高。

可以理解地,图像在绘制之前,需要在Open GL的管道中传递,这就需要称为着色器的子例程,这些着色器会告诉GPU如何绘制数据,有顶点着色器和片段着色器,在绘制任何内容到屏幕之前,需要先定义顶点着色器和片段着色器。

具体地,首先读取原始视频帧的顶点数据,执行顶点着色器,进而可以控制每个顶点,实现渲染、确定顶点位置纹理坐标变换等指令;当顶点的全部属性都被确定后,将顶点组装成图元,然后光栅化图元,负责接收一个图元经过处理的电,并把它转换为片段,每个片段对应屏幕的一个像素;执行片段着色器,进行纹理查找,确定纹理坐标;而后将原始视频帧写入帧缓冲区,即绘图层(surface),最后显示在屏幕上。

编码模块30,用以将绘图窗口的原始视频帧纹理与本地系统的效果数据混合编码,生成并输出合成视频,以供接收端解码播放所述合成视频。

可以理解地,效果数据可以是美颜、滤镜、趣味贴图、动画效果等。所述效果数据可以是预存于系统中的数据,也可以是用户基于系统程序而产生的当前数据并缓存于系统内存中。

具体地,基于用户输入的控制指令获取系统内存中的效果数据,并与绘图窗口的原始视频帧纹理混合和编码,合成新的视频,并输出到网络推流模块,以供接收端解码播放。

本发明提供的技术方案中,通过获取模块10获取相机的原始视频帧,将原始视频帧转换成原始视频帧纹理并缓存于系统编码库生成的绘图层,绘制模块20再创建绘图窗口,并建立绘图窗口与所述绘图层的对应关系,以将所述绘图层缓存的原始视频帧纹理绘制于所述绘图窗口,最后编码模块30将绘图窗口的原始视频帧纹理与本地系统的效果数据混合编码,生成并输出合成视频,以供接收端解码播放所述合成视频,从而基于绘图层在视频发送端将效果数据合成至待发送视频中(即合成视频),合成视频为通用格式,使得不管接收端是何种类型设备,都能对接收的编码视频解码播放,也解决了现有技术中录制视频与增加的装饰效果数据单独发送而造成的不能同步播放的技术问题,提高了用户体验。

进一步地,请参照图7,基于上述实施例一,在本实施例中,所述获取模块10包括:

获取单元11,用以创建相机预览窗口以获取相机的原始视频帧,并为所述相机预览窗口设置渲染器;

转换单元12,用以获取所述渲染器基于各个原始视频帧创建的表面纹理和对应的纹理编号,并将获取的所述原始视频帧通过表面纹理和纹理编号转换成原始视频帧纹理;

缓存单元13,用以将原始视频帧纹理缓存于系统编码库生成的绘图层。

具体地,基于Android系统的开放图形库(Open GL),通过Android系统的Camera类,设置相机参数,打开摄像头预览,并创建相机预览窗口(GL Surface View),并为所述相机预览窗口设置渲染器。所述相机预览窗口的创建,能获取相机的原始视频帧。

进一步地,为了获取纹理数据,首先在渲染器中使用开放图形库(Open GL)基于原始视频帧创建表面纹理(Surface Texure)和对应的纹理编号(Texureld),然后通过Camera的set Preview Texture接口传入纹理;这样,通过渲染器的on Draw Frame方法,将获取的所述原始视频帧通过表面纹理和纹理编号转换成原始视频帧纹理,并缓存于系统编码库生成的绘图层。

在本实施例提供的技术方案中,获取单元11通过创建相机预览窗口以获取相机的原始视频帧,并为所述相机预览窗口设置渲染器;转换单元12将获取的所述原始视频帧通过渲染器创建的表面纹理和纹理编号转换成原始视频帧纹理,并通过缓存单元13缓存于系统编码库生成的绘图层。借助Android系统中独立于窗口系统、独立于硬件的开放图形库来实现相机预览窗口的创建,在运行各种操作系统的各种计算机上都可以用,优化视频直播体验和效率。

进一步地,请参照图8,基于上述实施例二,在本实施例中,所述绘制模块20包括:

绘图窗口创建单元21,用以创建绘图窗口,根据系统函数接收绘图层缓存的原始视频帧纹理,以建立绘图窗口与绘图层的对应关系;

绘制单元22,用以根据系统编码线程窗口切换规则,完成绘图层与绘图窗口之间的切换,并根据预设的绘图参数和绘图流程,将绘图层的原始视频帧纹理绘制于绘图窗口中。

本发明提供的技术方案中,为了完成录制视频和效果数据的合成,需要创建一个绘图窗口,以完成原始视频帧的绘制和效果数据的绘制。

具体地,为了使用绘图窗口绘图,需要创建一个EGL Context和一个EGL Surface;EGL Context就是当前渲染代码所在的线程,EGL Surface是通过系统函数egl Create Window Surface创建的,该函数接收系统编码库生成的绘图层作为参数,以建立绘图窗口和绘图层的对应关系。

进一步地,当建立了绘图窗口与绘图层之间的对应关系,需要将缓存于绘图层的原始视频帧纹理绘制于绘图窗口。通过系统编码线程调用EGL Surface.make Current方法完成绘图层与绘图窗口之间的切换,基于开放图形库的绘图流程,将原始视频帧纹理绘制在绘图窗口上。

本实施例中,通过创建绘图窗口,以完成原始视频帧纹理的绘制,进而能在绘图窗口对获取的所述原始视频帧进行纹理绘制,并能将本地系统中的效果数据也绘制于绘图窗口,以实现录制视频与效果数据的合成;所述绘图窗口的创建,独立于相机预览窗口,进而能避免相机预览窗口卡顿等现象的发生,提高系统的处理效率。

进一步地,请参照图9,基于上述实施例三,在本实施例中,所述编码模块30包括:

效果图片获取单元31,用以根据接收的输入指令,从本地系统中获取对应的效果数据;

效果纹理绘制单元32,用以基于系统开放图形库将效果数据转换为对应的效果纹理,并将效果纹理绘制于绘图窗口中;

编码单元33,用以对绘图窗口中的原始视频帧纹理和效果纹理进行混合和编码,生成并输出合成视频,以供接收端解码播放所述合成视频。

可以理解地,为了美化视频效果,需要在录制的视频中添加效果数据,且需要将效果数据转换成与原始视频帧纹理相同的格式,以实现将效果数据与原始视频帧纹理的混合。需要说明的是,所述效果数据可以是预存于系统中的数据,例如贴图、动画等,也可以是用户基于系统程序而产生的当前数据并缓存于系统内存中,例如滤镜、美颜图片等。

具体地,所述效果图片获取单元31首先获取系统磁盘png或者jpg格式的图片,并生成bitmap位图数据到内存中,然后基于开放图形库的glTexImage2D函数生成二位图像的纹理数据,并使用相应的坐标和着色器将所述效果纹理绘制于绘图窗口上。绘制完成后,将绘图窗口上的原始视频帧纹理和效果纹理混合编码,生成新的合成视频并输出至网络推流模块,以供接收端解码播放。

本实施例提供的技术方案中,进一步细化了效果数据的处理步骤,将录制的原始视频帧与效果数据在视频录制端合成编码,实现了视频合成的实时传输,播放端只需解码播放即可,减少了播放端的处理流程,优化了直播效率,提高了用户体验。

进一步地,请参照图10,基于上述实施例四,在本实施例中,所述编码单元33包括:

混合单元331,用以将绘图窗口中的原始视频帧纹理和效果纹理混合成新的视频帧,并输出至与绘图窗口对应的绘图层;

输出单元332,用以基于系统编码库将绘图层上当前的新的视频帧按照预设格式编码,生成并输出合成视频,以供接收端解码播放所述合成视频。

具体地,当完成将效果纹理绘制于绘图窗口的步骤后,将绘图窗口上的原始视频帧纹理和效果纹理混合成新的视频帧,并调用系统中的egl Swap Buffer函数来提交绘制在绘图窗口的当前新的视频帧,输出至与当前绘图窗口对应的绘图层中,系统编码库将以该绘图层作为输出对象,并将绘图层上的当前新的视频帧按照预设的格式编码,输出至网络推流模块,接收端只需解码播放即可。

需要说明的是,本实施例中,通过如下设置以完成将绘图窗口上的原始视频帧纹理和效果纹理的混合:

glEnbale(GL_BLEND);//启用混合

glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);//混合函数。

其中GL_SRC_ALPHA是源混合因子sfactor,GL_ONE_MINUS_SRC_ALPHA是目标混合因子dfactor。使用这个设置,实现了由远及近的绘图,在效果纹理的绘制区域,透明部分将显示原始帧,有像素的部分将显示效果纹理。

本实施例提供的技术方案中,通过混合单元331将绘图窗口中的原始视频帧纹理和效果纹理混合成新的视频帧,并输出至与绘图窗口对应的绘图层;输出单元332通过系统编码库将绘图层上当前的新的视频帧按照预设格式编码,生成并输出合成视频,以供接收端解码播放所述合成视频。进一步优化了效果纹理与原始视频帧纹理的处理步骤,以实现录制视频与装饰效果的高效同步的效果。

以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

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