视频制作方法、装置及系统的制作方法
【专利摘要】本发明属于视频制作技术领域,具体涉及一种视频制作方法、装置及系统。本发明的视频制作方法包括以下步骤:读取配置文件,获取并加载制作视频的资源;启动渲染引擎,初始化硬件编解码环境和OpenGL离屏渲染环境;进行逐帧离屏渲染,生成裸视频流。通过采用离屏渲染技术,使得视频制作可以以后台任务的形式运行,不受屏幕分辨率的限制;通过基于解码时间的逐帧渲染,保证了输出视频的音视频同步和动画的流畅性;另外,通过对支持硬件解码的视频采用硬件解码以及对离屏渲染好的内容进行硬件截屏,充分利用硬件资源,降低了视频制作过程中CPU占用率,提高了处理效率。
【专利说明】
视频制作方法、装置及系统
技术领域
[0001]本发明属于视频制作技术领域,具体涉及一种视频制作方法、装置及系统。
【背景技术】
[0002]视频制作是将图片、视频及背景音乐进行重新剪辑、整合、编排,从而生成一个新的视频文件的过程,不仅是对原素材的合成,也是对原有素材的再加工。现阶段视频制作技术已经得到广泛的应用,无论在生活中还是网络上,经常可以看到将照片和视频制作成的各种精美视频。视频制作软件也层出不穷,除了可以在电脑上使用的视频制作软件,还可以在移动端使用的视频制作软件。另一方面,除了在电脑和移动端利用本机的硬件资源进行视频制作外,在C/S(客户端/服务端)或B/S(浏览器/服务端)架构中的服务器端进行视频制作和合成的需求也日益迫切。在服务器端进行制作视频,比在客户端进行制作,需要更加高效的进行合成以支持更多的合成任务。
[0003]现有的视频制作软件,大多使用软件编解码的方式,通过CPU对视频进行编解码处理,这种方式导致CHJ占用率高,编码效率低,处理速度缓慢。另外,支持硬件编解码的软件,需要通过专用的设备(子卡)单独完成视频编解码,比如VCD/DVD解压卡、视频压缩卡等等,这类专用设备大多价格高昂,并且不支持命令式操作和离屏渲染。
【发明内容】
[0004]本发明的目的之一在于克服以上缺点,降低视频制作时候的CPU使用率,提高视频制作效率,同时使得视频制作不受屏幕分辨率的限制。
[0005]为了解决上述技术问题,本发明提供了一种视频制作方法,包括以下步骤:
[0006]读取配置文件,获取并加载制作视频的资源;
[0007]启动渲染引擎,初始化硬件编解码环境和OpenGL离屏渲染环境;
[0008]进行逐帧离屏渲染,生成裸视频流。
[0009]本发明的技术方案,通过采用离屏渲染技术,使得视频制作可以以后台任务的形式运行;同时使得视频制作不受屏幕分辨率的限制,即使不接显示器也可制作。
[0010]进一步地,所述的视频制作方法,还包括步骤:
[0011 ]将裸视频流和音频流进行叠加得到最终的视频文件。
[0012]进一步地,所述制作视频的资源包括下列两种或两种以上的组合:初始视频、音频、图片或字蒂。
[0013]进一步地,所述逐帧离屏渲染,包括以下步骤:
[0014]生成当前视频帧的时间戳;
[0015]清空OpenGL渲染内容;
[0016]将制作视频的资源渲染到OpenGL;
[0017]在GPU中将离屏渲染好的内容复制到进行硬件编码的纹理中;
[0018]使用GPU进行硬件编码;
[0019]将硬件编码后的内容写入裸视频流。
[0020]首先,通过基于解码时间的逐帧渲染,使得视频、动画、音频能够以共同的时间基准进行渲染,保证了输出视频的音视频同步和动画的流畅性;同时,通过将离屏渲染好的内容进行硬件截屏,避免了软件截屏的方式将待编码的数据需要从GHJ拷贝到CPU导致CPU占用率升高的问题。
[0021 ] 进一步地,所述将制作视频的资源清染到OpenGL,包括以下步骤:
[0022]视频内容渲染;
[0023]图片渲染,根据配置文件中动画的时间,将图片上传为GPU纹理,并进行渲染和动画操作;
[0024]字幕渲染,通过图形引擎将文字转换为图片,根据节目时间将图片上传为GPU纹理并进行渲染。
[0025]进一步地,所述视频内容渲染,包括以下步骤:
[0026]读取视频文件;
[0027]判断视频已播放总时间是否到达当前视频帧的时间戳;
[0028]若视频已播放总时间到达当前视频帧的时间戳,则进一步判断GPU中是否有未解码的视频帧,若有,进一步判断视频文件是否支持硬件解码,若视频文件支持硬件解码,则将视频帧GPU解码成GPU中YUV纹理,并将GPU中YUV纹理转换为GPU中RGB纹理,渲染当前帧RGB纹理到OpenGL离屏显示;若视频文件不支持硬件解码,则将视频帧CPU解码得到视频图像,并将图像上传成GPU中RGB纹理,渲染当前帧RGB纹理到OpenGL离屏显示;若GPU中没有未解码的视频帧,进一步判断GHJ中是否有RGB纹理,若有,则渲染上一帧RGB纹理到OpenGL离屏显示;若没有,则不进行操作;
[0029]若视频已播放总时间未到达当前视频帧的时间戳,则不进行处理。
[0030]本技术方案,通过对支持硬件解码的视频,采用硬件解码,充分利用硬件资源,降低了视频制作过程中视频解码的CPU占用率,提高了解码处理效率,以适应后台任务的形式。
[0031 ]相应地,本发明还提供了一种视频制作装置,包括:
[0032]加载模块,用于读取配置文件,获取并加载制作视频的资源;
[0033]初始化模块,用于启动渲染引擎,初始化硬件编解码环境和OpenGL离屏渲染环境;
[0034]渲染模块,用于进行逐帧离屏渲染,生成裸视频流。
[0035]进一步地,所述的视频制作装置,还包括:
[0036]合并模块,用于将裸视频流和音频流进行叠加得到最终的视频文件。
[0037]进一步地,所述渲染模块,包括:
[0038]第一渲染单元,用于生成当前视频帧的时间戳;
[0039]第二清染单元,用于清空OpenGL清染内容;
[0040]第三渲染单元,用于将制作视频的资源渲染到OpenGL;
[0041]第四渲染单元,用于在GPU中将离屏渲染好的内容复制到进行硬件编码的纹理中;
[0042]第五渲染单元,用于使用GPU进行硬件编码;
[0043]第六渲染单元,用于将硬件编码后的内容写入裸视频流。
[0044]进一步地,所述第三渲染单元,包括:
[0045]视频渲染子单元,用于视频内容渲染;
[0046]图片渲染子单元,用于图片渲染,根据配置文件中动画的时间,将图片上传为GPU纹理,并进行渲染和动画操作;
[0047]字幕渲染子单元,用于字幕渲染,通过图形引擎将文字转换为图片,根据节目时间将图片上传为GPU纹理并进行渲染。
[0048]进一步地,所述视频清染子单元,包括:
[0049]第一视频渲染构件,用于读取视频文件;
[0050]第二视频渲染构件,用于判断视频已播放总时间是否到达当前视频帧的时间戳;
[0051]第三视频渲染构件,用于若视频已播放总时间到达当前视频帧的时间戳,则进一步判断GPU中是否有未解码的视频帧,若有,进一步判断视频文件是否支持硬件解码,若视频文件支持硬件解码,则将视频帧GPU解码成GPU中YUV纹理,并将GPU中YUV纹理转换为GPU中RGB纹理,渲染当前帧RGB纹理到OpenGL离屏显示;若视频文件不支持硬件解码,则将视频帧CPU解码得到视频图像,并将图像上传成GPU中RGB纹理,渲染当前帧RGB纹理到OpenGL离屏显示;若GPU中没有未解码的视频帧,进一步判断GPU中是否有RGB纹理,若有,则清染上一帧RGB纹理到OpenGL离屏显示;若没有,则不进行操作;
[0052]第四视频渲染构件,用于若视频已播放总时间未到达当前视频帧的时间戳,则不进行处理。
[0053]相应地,本发明还提供了一种视频制作系统,包括客户端和服务端,所述服务端和客户端通过网络连接,所述客户端用于采集视频资源,所述服务端用于对客户端采集的视频进行合成处理。
[0054]采用服务端进行视频合成处理的方式,不仅方便了视频处理软件的管理部署,还减轻了客户端的运行负载。
[0055]综上所述,本发明技术方案的有益效果有:
[0056]1.通过采用离屏渲染技术,使得视频制作可以以后台任务的形式运行;同时使得视频制作不受屏幕分辨率的限制,即使不接显示器也可制作。
[0057]2.通过基于解码时间的逐帧渲染,使得视频、动画、音频能够以共同的时间基准进行渲染,保证了输出视频的音视频同步和动画的流畅性。
[0058]3.本技术方案,通过对支持硬件解码的视频,采用硬件解码,充分利用硬件资源,降低了视频制作过程中视频解码的CHJ占用率,提高了解码处理效率,以适应后台任务的形式。
[0059]4.通过将离屏渲染好的内容进行硬件截屏,避免了软件截屏的方式将待编码的数据需要从GHJ拷贝到CPU导致CPU占用率升高的问题。
【附图说明】
[0060]图1是本发明实施例的一种视频制作方法步骤流程图。
[0061 ]图2是本发明实施例的离屏逐帧渲染视频步骤流程图。
[0062]图3是本发明实施例的一种将内容渲染到OpenGL步骤流程图。
[0063]图4是本发明实施例的一种视频内容渲染步骤流程图。
[0064]图5是本发明实施例的一种视频制作装置结构框架图。
[0065]图6是本发明实施例的一种渲染模块结构框架图。
[0066]图7是本发明实施例的一种第三渲染单元结构框架图。
[0067]图8是本发明实施例的一种视频渲染子单元结构框架图。
[0068]图9是本发明实施例的一种视频制作系统结构框架图。
【具体实施方式】
[0069]下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0070]如图1,是本发明实施例的一种视频制作方法步骤流程图,包括以下步骤:
[0071 ]步骤10.读取配置文件,获取制作视频需要的资源;
[0072]所述制作视频的资源包括下列两种或两种以上的组合:初始视频、音频、图片或字幕。其中,初始视频文件可以是通过采集设备采集的原始文件,也可以是其他视频编辑软件生成的视频文件;音频数据文件,包含初始视频文件中的声音或音乐,还可以是另一段独立的音频数据;无伴音的动画文件;静态图像文件;在做电视节目、新闻或者采访的片段中,还可能包括字幕文件,以更明确的表示画面的内容,使人物说话的内容更加清晰。所述制作视频的资源可以包括以上全部的四种文件,还可以是其中两种或三种文件的组合,例如制作视频的资源可以只包括初始视频和音频,或只包括初始视频和字幕等。
[0073]通过读取配置文件信息,确定需要制作的视频由哪些素材文件组成,以及这些素材各自存放的物理路径地址,如果资源获取不到,则退出制作程序。
[0074]步骤11.加载制作视频的各类资源;
[0075]通常为了提高视频处理的速度,都是将制作视频的各类素材加载到计算机内存中,同时加载过程中,也会对各类素材进行基本的校验,例如,判断视频资源是否完整,判断音频文件是否完整,如果资源加载出错,则退出制作程序。
[0076]步骤12.启动渲染引擎,初始化硬件编解码环境和OpenGL离屏渲染;
[0077]通常视频制作需要包括解码,渲染,编码步骤,其中解码是指对视频文件的解压缩,渲染是指将解码器还原出来的视频流以及其他素材组合后正确地“画”在屏幕上,编码是指将组合好的视频重新压缩成指定的文件格式。
[0078]0penGL(0pen Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口,它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。OpenGL中,GPU屏幕渲染有以下两种方式:一、当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行,渲染的结果直接在屏幕上显示;二、离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作,这种渲染结果不在屏幕上显示。本发明的技术方案,通过采用OpenGL离屏渲染技术,使得视频制作可以以后台任务的形式运行;同时使得视频制作不受屏幕分辨率的限制,即使不接显示器也可制作。
[0079]初始化硬件编解码环境和OpenGL离屏渲染主要包括:初始化Xl I (类UNIX操作系统的窗口系统)显示设备、初始化vaapi(Video Accelerat1n API)、初始化EGL(0penGL和具体平台实现的接口层)、和使用EGL接口初始化OpenGL离屏渲染。
[0080]步骤13.离屏逐帧渲染视频;
[0081]众所周知,视频文件就是利用人类视觉暂留的原理通过播放一系列的图片,使人眼产生运动的感觉,其中每一幅静止的图片,我们称之为视频帧。为了能使动画,字幕,图像等素材与视频文件相结合,就必须对整个视频文件进行逐帧的渲染操作,将特定时间点所需的动画特效,字幕,图像同时输出到视频帧的屏幕画布上,这样才能达到相应的显示效果O
[0082]步骤14.如果初始视频文件的播放时间结束,则退出渲染;反之则重复步骤13,得到裸视频流;
[0083]按照初始视频文件的播放时间顺序对每个视频帧图像进行渲染,直至视频文件包含的所有图像帧全部渲染完成。
[0084]在其他的一些实施例中,还可以包括以下步骤15:
[0085]步骤15.将编码后的裸视频流和音频数据进行合成,得到最终视频。
[0086]通过上述步骤14,即可得到裸视频。由于对视频帧,动画内容,静态图像以及字幕等素材的渲染结果都是针对显示内容的,视频的声音并不包含在内,通常称为裸视频文件,所以还必须将音频文件和裸视频文件进行合并,得到最终的视频文件。
[0087]如图2,是本发明步骤13离屏逐帧渲染视频步骤流程图,包括:
[0088]步骤131.生成当前视频帧的时间戳。
[0089]FPS是图像领域中的定义,是指视频每秒显示的图像帧数,每秒钟帧数愈多,所显示的动作就会愈流畅。通常一段视频的每秒帧数是固定的,其中,视频的每秒帧数取值可以是23.97,25等。本技术方案中的实施例中,我们需要先获取所有待处理视频中的最大帧率max_fps (即取视频每秒帧数的最大值),并通过公式n/max_fps计算当前视频帧的时间戳,再通过当前视频帧的时间戳为基准时间来处理视频渲染操作。(公式中,η为帧数序列号,取值为0,1,2……,max_fps;例如,在一视频文件中,帧率为25,某一帧在视频中的序列号为4,贝IJn取值为4,则该视频帧显示结束时,当前视频帧的时间戳为4/25 = 0.16s。)本发明该步骤的优点,基于解码的时间来计算当前视频帧的时间戳,使得渲染引擎最大限度保持原始视频帧率,保持原有视频的连贯性,否则需要通过图像插值来保持,效率较低。
[0090]步骤132.清空OpenGL渲染内容。将OpenGL渲染缓冲区中的内容清空。
[0091 ]步骤133.将初始视频文件的内容,以及相关的素材渲染到OpenGL渲染缓冲区。
[0092]步骤134.将离屏渲染好的内容从GPU中复制到进行硬件编码的纹理中。
[0093]传统的做法都是将离屏渲染好的内容从GPU拷贝到内存中,再在内存中利用CPU做颜色空间RGB到YUV的转换,再复制到硬件编码的纹理中。其中,将GPU显存内容到内存的拷贝需要占用CPU,颜色空间RGB到YUV的转换更占用CPU,从而使得CPU占用率很高,在视频文件为高清视频的时候,CPU占用率可能达到100%。本发明的实施例中,通过将离屏渲染好的内容从GPU中复制到进行硬件编码的纹理中,可使得视频制作CPU占用率降低至20%。
[0094]步骤135.通过vaapi库使用GPU进行硬件编码。
[0095]通过GPU硬件编码的方式,采用特定的压缩技术(例如,H.264编码方式或MPEG-4编码方式等),将视频格式的文件转换成另一种视频格式文件。例如,在一具体的实施例中,可米用MPEG-4编码方式进行视频编码;另一具体实施例中,可米用H.264编码方式进行视频编码。
[0096]步骤136.通过vaapi库将硬件编码后的内容写入视频文件中。
[0097]将编码好的视频帧图像,按照播放的时间顺序写到视频文件中,从而形成一系列动态的图片序列。
[0098]如图3,是本发明实施例的一种将内容渲染到OpenGL步骤流程图,包括:
[0099]I)视频内容渲染;
[0100]如图4,是本发明实施例的一种视频内容渲染步骤流程图,包括:
[0101]步骤1331.读取视频文件;
[0102]在本发明实施例中,采用FFmpeg读取视频文件。FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序,有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。
[0103]步骤1332.判断视频已播放总时间是否到达当前视频帧的时间戳;当需要处理的视频为两个以上时,以帧率最大的视频的视频帧时间戳为准;
[0104]若视频已播放总时间未到达当前视频帧的时间戳,则不进行处理;
[0105]若视频已播放总时间到达当前视频帧的时间戳,则进一步判断GPU中是否有未解码的视频帧,若有,则对接收的未解码的视频帧依次进行解码、渲染处理;若无,则进入步骤1336;
[0106]所述视频已播放总时间为视频从开始播放后,共进行播放的时间。所述视频帧的时间戳是根据帧率计算得到的数值。例如,若一视频的帧率为25fps,则第一视频帧的时间戳为I /25 = 0.04s;第二视频帧的时间戳为2/25 = 0.08s;依次类推,该视频的时间戳依次为
0.04s、0.08s、0.12s……的递增数列。
[0107]视频帧的时间戳根据每个视频文件的帧率确定的,在视频编码时就已经确定的,通过解码视频文件可以获得到该视频帧的时间戳;当需要处理的视频为两个以上时,本发明以帧率最大的视频的视频帧时间戳为准。
[0108]当只有一个需要进行渲染的视频文件的时候,视频已播放总时间每到达一次视频帧的时间戳,均对视频帧进行相应处理(包括解码处理,渲染处理)一次。例如,视频文件的帧率为25帧,则第一帧视频帧的时间戳为1/25 = 0.04s,第二帧视频帧的时间戳为2/25 =
0.08s...依此类推。本发明的技术方案在视频已播放总时间为0.04s时,判断第一帧视频的时间戳(0.04s)已经到达,则开始对第一帧视频进行处理;同理,在视频已播放总时间为
0.08s开始对第二帧进行处理,在视频已播放总时间0.12s开始对第三帧进行处理...依此类推。
[0109]在某些特殊的应用场景中,存在需要对多路视频进行渲染的情况,而视频的帧率可能存在不一致的情况,这时候就需要取最大的帧率值计算视频帧时间戳,例如,在有两个视频文件需要同时渲染的实施例中,视频I帧率是25fps,则视频I的第一帧视频帧时间戳为1/25 = 0.04s,第二帧视频时间戳为2/25 = 0.08s,第三帧视频时间戳为3/25 = 0.12s...依此类推;视频2帧率是30fps,则视频2的第一帧视频时间戳为1/30 = 0.033s,第二帧视频时间戳为2/30 = 0.066s,第三帧视频时间戳为3/30 = 0.1s...依此类推。取视频I和视频2的最大帧率30fps来计算视频帧时间戳,当视频已播放总时间为0.033s时,此时判断视频I第一帧视频的时间戳(0.04s)尚未达到,则不进行处理,而视频2的第一帧视频的时间戳(0.033s)已经达到,则进行视频2第一帧视频的后续处理;当视频已播放总时间为0.066s,此时判断视频I的第一帧视频的时间戳(0.04s)已经达到,即视频I中存在未解码的视频帧,则处理视频I的第一帧,同时判断视频2的第二帧视频的时间戳(0.066s)已经达到,则处理视频2的第二帧视频;当视频已播放总时间为0.1s,此时判断视频I的第二帧视频的时间戳(0.08s)已经达到,视频I中存在未解码的视频帧,则处理视频I的第二帧;判断视频2的第三帧视频的时间戳(0.1s)已经达到,则处理视频2的第三帧...依此类推。
[0110]步骤1333.判断视频文件是否支持硬件解码,如果支持硬件解码,则跳转到步骤1334;如果支持不硬件解码,则跳转到步骤1335;
[0111]本发明主要面向的是支持硬件解码的高清视频。对于支持硬件解码的视频文件,采用硬件解码,从而降低CHJ占用,以适应后台任务的形式。在实际的实施例中,CPU的占用率可以由100%降至5%;对于不支持硬件解码的视频文件(如MPEG1),为保证兼容性的需要,本发明采用软件解码方式进行处理,由于通常这类视频分辨率不高,此时CPU占用率也并不高。
[0?12] 步骤I 3 3 4.对于支持硬件解码的视频,则使用F Fm P e g和V a a P i ( V i d e οAccelerat1n API)库进行GPU解码成GPU中YUV纹理,并将GPU中YUV纹理转换为GPU中RGB纹理。
[0113]上述的RGB和YUV都是人为规定的彩色模型或颜色空间,它的用途是在某些标准下用通常可接受的方式对彩色加以说明,其中,RGB(红绿蓝)是依据人眼识别的颜色定义出的空间,可表示大部分颜色,而在YUV空间中,每一个颜色有一个亮度信号Y,和两个色度信号U和V。亮度信号是强度的感觉,它和色度信号断开,这样强度就可以在不影响颜色的情况下改变。RGB和YUV可以相互进行转换。
[0114]本发明的实施例中,通过在支持GPU硬件编解码功能的IntelCPU上,采用GPU硬件对视频文件进行解码,充分利用硬件资源,降低了视频制作过程中视频解码的CPU占用率,并且在相同时间内可以解码更多帧视频,从而加快视频制作过程。
[0115]GPU硬件解码完成后,渲染RGB纹理到OpenGL离屏显示。具体的操作如下:创建纹理显示的着色语言(shader),包括顶点着色器(vertex shader)和片段着色器(fragmentshader),将视频纹理与之绑定,执行着色语言将纹理渲染到缓冲区,缓冲区的内容即为离屏显示的结果,执行完成后销毁着色语言。
[0116]步骤1335.对于不支持硬件解码的视频,则使用FFmpeg进行CHJ解码得到视频图像,并将图像上传成GHJ中RGB纹理;
[0117]步骤1336.若视频已播放总时间到达当前视频帧的时间戳,其GPU中无未解码的视频帧,进一步判断GPU中是否有RGB纹理,若有,则渲染上一帧RGB纹理到OpenGL离屏显示;若没有,则不进行操作。
[0118]2)图片渲染,根据配置文件中动画所在视频中的时间点,将图片上传为GPU纹理,并进行渲染和动画操作;所述动画操作可以是对图片的缩放操作、旋转操作、加速操作等等。
[0119]3)字幕渲染,由于文字无法直接显示在屏幕上,所以必须通过图形引擎将文字转换为图片格式,再根据字幕需要显示的节目时间将图片上传为GHJ纹理并进行渲染。
[0120]下面以一具体实施例详细说明本发明的视频制作方法。
[0121]本实施例中,制作视频的资源包括初始视频文件、图片、音频和字幕。所述初始视频文件为用户在KTV中唱歌时电视播放的歌曲MTV,图片为用户移动终端中的照片,音频为用户所唱歌曲的湿声(通过音效器将麦克风录制的干声和歌曲合成后的声音),所述字幕为用户所唱歌曲的歌词。将上述初始视频文件、图片、音频和字幕进行制作视频的具体过程为:
[0122]步骤11.加载制作视频的四类资源:用户在KTV中唱歌时电视播放的歌曲MTV、用户移动终端中的照片、用户所唱歌曲的湿声和用户所唱歌曲的字幕;
[0123]判断视频资源、音频文件是否完整,如果资源加载出错,则退出制作程序;若完整则进入步骤12;
[0124]步骤12.启动渲染引擎,初始化硬件编解码环境和OpenGL离屏渲染;
[0125]步骤13.离屏逐帧渲染视频,具体包括以下步骤;
[0126]步骤131.生成当前视频帧的时间戳。
[0127]首先获取所有待处理视频中的最大帧率max_fps(本实施例中,只有一个视频文件,即为视频的帧率,通常为29.97),并通过公式n/max_f p s计算当前视频帧的时间戳。(η为帧数序列号,取值为0,1,2……;例如,某一帧在视频中的序列号为4,则η取值为4。)
[0128]步骤132.清空OpenGL渲染内容。
[0129]步骤133.将初始视频文件的内容,以及图片和字幕渲染到OpenGL渲染缓冲区,包括以下步骤:
[0130]I)视频内容渲染;
[0131]步骤1331.读取视频文件;在本发明实施例中,采用FFmpeg读取视频文件。
[0132]步骤1332.判断视频已播放总时间是否到达当前视频帧的时间戳,如果视频已播放总时间未到达当前视频帧的时间戳,则不处理;若视频已播放总时间到达当前视频帧的时间戳,则进一步判断GPU中是否有未解码的视频帧,若有,则执行步骤1333;若无,则进入步骤1336;
[0133]步骤1333.进一步判断视频文件是否支持硬件解码,由于本实施例中的初始视频文件支持硬件解码,则跳转到步骤1334;本发明主要面向的是支持硬件解码的高清视频。对于支持硬件解码的视频文件,采用硬件解码,从而降低CPU占用,以适应后台任务的形式。在实际的实施例中,CPU的占用率可以由100 %降至5% ;对于不支持硬件解码的视频文件(如MPEGl ),为保证兼容性的需要,本发明采用软件解码方式进行处理,由于通常这类视频分辨率不高,此时CPU占用率也并不高。
[0134]步骤1334.使用FFmpeg和vaapi(Video Accelerat1n API)库将初始视频文件进行GPU解码成GPU中YUV纹理,并将GPU中YUV纹理转换为GPU中RGB纹理,渲染当前帧RGB纹理至IjOpenGL离屏显示。
[0135]本实施例中,通过在支持GPU硬件编解码功能的InteI CPU上,采用GPU硬件对视频文件进行解码,充分利用硬件资源,降低了视频制作过程中视频解码的CPU占用率,并且在相同时间内可以解码更多帧视频,从而加快视频制作过程。
[0136]GPU硬件解码完成后,渲染RGB纹理到OpenGL离屏显示。具体操作如下:创建纹理显示的着色语言(shader),包括顶点着色器(vertex shader)和片段着色器(fragmentshader),将视频纹理与之绑定,执行着色语言将纹理渲染到缓冲区,缓冲区的内容即为离屏显示的结果,执行完成后销毁着色语言。
[0137]步骤1335.对于不支持硬件解码的视频,则使用FFmpeg进行CHJ解码得到视频图像,并将图像上传成GHJ中RGB纹理;
[0138]步骤1336.若视频已播放总时间到达当前视频帧的时间戳,其GPU中无未解码的视频帧,进一步判断GPU中是否有RGB纹理,若有,则渲染上一帧RGB纹理到OpenGL离屏显示;若没有,则不进行操作。
[0139]2)照片渲染,根据配置文件中动画所在视频中的时间点,将图片上传为GPU纹理,并进行渲染和动画操作;所述动画操作可以是对图片的缩放操作、旋转操作、加速操作等等。本实施例中照片透明叠加在视频上方。
[0140]3)歌词字幕渲染,由于文字无法直接显示在屏幕上,所以必须通过图形引擎将文字转换为图片格式,再根据字幕需要显示的节目时间将图片上传为GHJ纹理并进行渲染。本实施例中字幕在照片之后渲染,并显示在视频和照片的上方。
[0141]步骤134.将离屏渲染好的内容从GPU中复制到进行硬件编码的纹理中。
[0142]传统的做法都是将离屏渲染好的内容从GPU拷贝到内存中,再在内存中利用CPU做颜色空间RGB到YUV的转换,再复制到硬件编码的纹理中。将GPU显存内容到内存的拷贝需要占用CPU,颜色空间RGB到YUV的转换更占用CPU,从而使得CPU占用率很高,在视频文件为高清视频的时候,CPU占用率可能达到100%。本发明的实施例中,通过将离屏渲染好的内容从GHJ中复制到进行硬件编码的纹理中,可使得视频制作CPU占用率降低至20%。
[0143]步骤135.通过vaapi库使用GPU进行硬件编码。
[0144]通过GPU硬件编码的方式,采用特定的压缩技术(例如,H.264编码方式或MPEG-4编码方式等),将视频格式的文件转换成另一种视频格式文件。例如,在一具体的实施例中,可米用MPEG-4编码方式进行视频编码;另一具体实施例中,可米用H.264编码方式进行视频编码。
[0145]步骤136.通过vaapi库将硬件编码后的内容写入视频文件中。
[0146]将编码好的视频帧图像,按照播放的时间顺序写到视频文件中,从而形成一系列动态的图片序列。
[0147]步骤14.如果初始视频文件的播放时间结束,则退出渲染;反之则重复步骤13。
[0148]按照初始视频文件的播放时间顺序对每个视频帧图像进行渲染,直至视频文件包含的所有图像帧全部渲染完成,得到裸视频流,这里的裸视频流包括用户演唱视频、用户上传的照片和歌曲字幕。
[0149]步骤15.将编码后的裸视频流和音频数据进行合成,得到最终视频。
[0150]如图5,是本发明实施例的一种视频制作装置结构框架图,包括:
[0151]加载模块,用于读取配置文件,获取并加载制作视频的资源;
[0152]初始化模块,用于启动渲染引擎,初始化硬件编解码环境和OpenGL离屏渲染环境;
[0153]渲染模块,用于进行逐帧离屏渲染,生成裸视频流;
[0154]合并模块,用于将裸视频流和音频流进行叠加得到最终的视频文件。
[0155]如图6,是本发明实施例的一种渲染模块结构框架图,包括:
[0156]第一渲染单元,用于生成当前视频帧的时间戳;
[0157]第二渲染单元,用于清空OpenGL渲染内容;
[0158]第三渲染单元,用于将制作视频的资源渲染到OpenGL;
[0159]第四渲染单元,用于在GPU中将离屏渲染好的内容复制到进行硬件编码的纹理中;
[0160]第五渲染单元,用于使用GPU进行硬件编码;
[0161]第六渲染单元,用于将硬件编码后的内容写入裸视频流。
[0162]如图7,是本发明实施例的一种第三渲染单元结构框架图,包括:
[0163]视频渲染子单元,用于视频内容渲染;
[0164]图片渲染子单元,用于图片渲染,根据配置文件中动画的时间,将图片上传为GPU纹理,并进行渲染和动画操作;
[0165]字幕渲染子单元,用于字幕渲染,通过图形引擎将文字转换为图片,根据节目时间将图片上传为GPU纹理并进行渲染。
[0166]如图8,是本发明实施例的一种视频渲染子单元结构框架图,包括:
[0167]第一视频渲染构件,用于读取视频文件;
[0168]第二视频渲染构件,用于判断视频已播放总时间是否到达当前视频帧的时间戳;
[0169]第三视频渲染构件,用于若视频已播放总时间到达当前视频帧的时间戳,则进一步判断GPU中是否有未解码的视频帧,若有,进一步判断视频文件是否支持硬件解码,若视频文件支持硬件解码,则将视频帧GPU解码成GPU中YUV纹理,并将GPU中YUV纹理转换为GPU中RGB纹理,渲染当前帧RGB纹理到OpenGL离屏显示;若视频文件不支持硬件解码,则将视频帧CPU解码得到视频图像,并将图像上传成GPU中RGB纹理,渲染当前帧RGB纹理到OpenGL离屏显示;若GPU中没有未解码的视频帧,进一步判断GPU中是否有RGB纹理,若有,则清染上一帧RGB纹理到OpenGL离屏显示;若没有,则不进行操作;
[0170]第四视频渲染构件,用于若视频已播放总时间未到达当前视频帧的时间戳,则不进行处理。
[0171]如图9,是本发明实施例的一种视频制作系统结构框架图,包括客户端和服务端,服务端和客户端通过网络连接。
[0172]客户端用于采集视频资源并将视频发送给服务端,客户端可以是配有摄像头的电脑设备,也可以是具有视频采集功能的移动终端,如手机、平板、智能手表,当然,还可以是专业的录像摄像设备,如安防监控摄像头,KTV录像机。
[0173]服务端用于对客户端采集的视频进行合成处理,在一具体的实施例中,一个服务端可对应一个客户端,专门负责对该客户端采集发送的视频进行制作,通常这种情况下对服务器的要求不高,服务器可以由移动终端设备,电脑设备或小型服务器来担任。
[0174]在另一优选的实施例中,一个服务端可对应多个客户端,服务端负责对多个客户端采集发送的视频进行后期制作,这种情况下,服务器通常由大型服务器来担任。例如,在一个KTV场所内,只需设置一台录像服务器,通过离屏的视频合成技术,可对该场所内所有包厢采集的视频进行合成处理;又如,在小区安防监控控制中心设置一台视频制作服务器,可对小区所有的监控摄像头采集的视频文件进行合成处理。通过这种一对多的方式,可以减少视频制作服务器的硬件投资,提高硬件的使用率,同时,只需要部署一套的视频制作环境,简化了部署维护工作。
[0175]上述【具体实施方式】只是对本发明的技术方案进行详细解释,本发明并不只仅仅局限于上述实施例,凡是依据本发明原理的任何改进或替换,均应在本发明的保护范围之内。
【主权项】
1.一种视频制作方法,其特征在于,包括以下步骤: 读取配置文件,获取并加载制作视频的资源; 启动渲染引擎,初始化硬件编解码环境和OpenGL离屏渲染环境; 进行逐帧离屏渲染,生成裸视频流。2.如权利要求1所述的视频制作方法,其特征在于,还包括步骤: 将裸视频流和音频流进行叠加得到最终的视频文件。3.如权利要求2所述的视频制作方法,其特征在于,所述制作视频的资源包括下列两种或两种以上的组合:初始视频、音频、图片或字幕。4.如权利要求1或2所述的视频制作方法,其特征在于,所述逐帧离屏渲染,包括以下步骤: 生成当前视频帧的时间戳; 清空OpenGL渲染内容; 将制作视频的资源渲染到OpenGL; 在GRJ中将离屏渲染好的内容复制到进行硬件编码的纹理中; 使用GRJ进行硬件编码; 将硬件编码后的内容写入裸视频流。5.如权利要求4所述的视频制作方法,其特征在于,所述将制作视频的资源渲染到OpenGL,包括以下步骤: 视频内容渲染; 图片渲染,根据配置文件中动画的时间,将图片上传为GPU纹理,并进行渲染和动画操作; 字幕渲染,通过图形引擎将文字转换为图片,根据节目时间将图片上传为GPU纹理并进行渲染。6.如权利要求5所述的视频制作方法,其特征在于,所述视频内容渲染,包括以下步骤: 读取视频文件; 判断视频已播放总时间是否到达当前视频帧的时间戳; 若视频已播放总时间到达当前视频帧的时间戳,则进一步判断GPU中是否有未解码的视频帧,若有,进一步判断视频文件是否支持硬件解码,若视频文件支持硬件解码,则将视频帧GPU解码成GPU中YUV纹理,并将GPU中YUV纹理转换为GPU中RGB纹理,渲染当前帧RGB纹理到OpenGL离屏显示;若视频文件不支持硬件解码,则将视频帧CPU解码得到视频图像,并将图像上传成GPU中RGB纹理,渲染当前帧RGB纹理到OpenGL离屏显示;若GPU中没有未解码的视频帧,进一步判断GPU中是否有RGB纹理,若有,则渲染上一帧RGB纹理到OpenGL离屏显示;若没有,则不进行操作; 若视频已播放总时间未到达当前视频帧的时间戳,则不进行处理。7.一种视频制作装置,其特征在于,包括: 加载模块,用于读取配置文件,获取并加载制作视频的资源; 初始化模块,用于启动渲染引擎,初始化硬件编解码环境和OpenGL离屏渲染环境; 渲染模块,用于进行逐帧离屏渲染,生成裸视频流。8.如权利要求7所述的视频制作装置,其特征在于,还包括: 合并模块,用于将裸视频流和音频流进行叠加得到最终的视频文件。9.如权利要求8所述的视频制作装置,其特征在于,所述渲染模块,包括: 第一渲染单元,用于生成当前视频帧的时间戳; 第二清染单元,用于清空OpenGL清染内容; 第三渲染单元,用于将制作视频的资源渲染到OpenGL; 第四渲染单元,用于在GRJ中将离屏渲染好的内容复制到进行硬件编码的纹理中; 第五渲染单元,用于使用GRJ进行硬件编码; 第六渲染单元,用于将硬件编码后的内容写入裸视频流。10.如权利要求9所述的视频制作装置,其特征在于,所述第三渲染单元,包括: 视频渲染子单元,用于视频内容渲染; 图片渲染子单元,用于图片渲染,根据配置文件中动画的时间,将图片上传为GPU纹理,并进行渲染和动画操作; 字幕渲染子单元,用于字幕渲染,通过图形引擎将文字转换为图片,根据节目时间将图片上传为GHJ纹理并进行渲染。11.如权利要求10所述的视频制作装置,其特征在于,所述视频渲染子单元,包括: 第一视频渲染构件,用于读取视频文件; 第二视频渲染构件,用于判断视频已播放总时间是否到达当前视频帧的时间戳; 第三视频渲染构件,用于若视频已播放总时间到达当前视频帧的时间戳,则进一步判断GPU中是否有未解码的视频帧,若有,进一步判断视频文件是否支持硬件解码,若视频文件支持硬件解码,则将视频帧GPU解码成GPU中YUV纹理,并将GPU中YUV纹理转换为GPU中RGB纹理,渲染当前帧RGB纹理到OpenGL离屏显示;若视频文件不支持硬件解码,则将视频帧CPU解码得到视频图像,并将图像上传成GPU中RGB纹理,渲染当前帧RGB纹理到OpenGL离屏显示;若GPU中没有未解码的视频帧,进一步判断GI3U中是否有RGB纹理,若有,则渲染上一帧RGB纹理到OpenGL离屏显示;若没有,则不进行操作; 第四视频渲染构件,用于若视频已播放总时间未到达当前视频帧的时间戳,则不进行处理。12.一种视频制作系统,其特征在于,包括客户端和服务端,所述服务端和客户端通过网络连接,所述客户端用于采集视频资源,所述服务端用于对客户端采集的视频进行合成处理。
【文档编号】H04N21/235GK105933724SQ201610344295
【公开日】2016年9月7日
【申请日】2016年5月23日
【发明人】李靖禹, 许锦坤, 卓康志, 林鎏娟
【申请人】福建星网视易信息系统有限公司