首页 / 专利库 / 电脑图像 / 着色器 / 顶点着色器 / 一种基于终端的网络直播中视频实时美颜及推流的方法

一种基于终端的网络直播中视频实时美颜及推流的方法

阅读:314发布:2020-05-13

专利汇可以提供一种基于终端的网络直播中视频实时美颜及推流的方法专利检索,专利查询,专利分析的服务。并且本 发明 公开一种基于终端的网络直播中视频实时美颜及推流的方法,应用于网络直播技术领域,包括对从摄像头到推流整个直播过程中涉及的美颜、 渲染 、编码、推流以及生命周期的管理都有详尽的描述,通过本发明方案,能够在终端如手机中实现网络直播中视频实时的美颜及推流。,下面是一种基于终端的网络直播中视频实时美颜及推流的方法专利的具体信息内容。

1.一种基于终端的网络直播中视频实时美颜及推流的方法,其特征在于,包括:
设定照相机的参数;
照相机通过表面纹理SurfaceTexture和开放图形绘制库OpenGL的纹理建立联系,通过对纹理的处理进行美颜,美颜后的数据通过纹理渲染到开放图形绘制库OpenGL的绘制缓冲图形绘制库表面GLSurface中并得到绘制,进而得到预览,包括,进入到处理视频流的循环,循环包括按照逐处理来进行,视频帧逐帧输出到纹理接收接口,纹理对象需要通过更新当前帧缓冲,获得最新帧数据,开放嵌入式表面OES纹理直接接收数据,转换所述开放嵌入式表面OES纹理为2D纹理,对2D纹理进行滤波美颜算法,通过开放图形绘制库OpenGL的机制进行绘制;
通过多媒体数字信号解码器MediaCodeC编码为指定格式的视频,照相机的视频流数据通过纹理传递到开放图形绘制库OpenGL的帧缓冲中,将帧缓冲的数据进一步交换到多媒体数字信号编解码器MediaCodeC创建的输入型表面Surface缓冲中,对数据进行编码处理,然后通过输出缓冲器OutPutBuffer获得编码后的数据;
采用实时消息传输Rtmp协议,对所述获得的编码后的数据视频流进行推流。
2.如权利要求1所述的基于终端的网络直播中视频实时美颜及推流的方法,其特征在于,所述设定照相机的参数,包括:
设置照相机的参数、预览回调方式,通过表面纹理SurfaceTexture来导出照相机的视频帧流,通过开放图形绘制库OpenGL中的纹理对象来构建表面纹理SurfaceTexture对象,使得当照相机的视频帧流导出到表面纹理SurfaceTexture的时候能够和纹理衔接,所述纹理包括开放嵌入式表面OES纹理。
3.如权利要求1所述的基于终端的网络直播中视频实时美颜及推流的方法,其特征在于,所述照相机通过表面纹理SurfaceTexture和开放图形绘制库OpenGL的纹理建立联系,通过对纹理的处理进行美颜,美颜后的数据通过纹理渲染到开放图形绘制库OpenGL的绘制缓冲图形绘制库表面GLSurface中并得到绘制,进而得到预览,包括:
创建图形绘制库表面视图GLSurfaceView,通过所述创建的图形绘制库表面视图GLSurfaceView,使用开放图形绘制库OpenGL的机制来进行绘制渲染,为图形绘制库表面视图GLSurfaceView设定渲染对象,渲染对象包括渲染器渲染器Renderer接口的实现;
创建开放嵌入式表面OES纹理,通过对特定的表面贴图进而得到渲染的机制,包括创建、绑定、设置参数,在绑定的时候,选择绑定外部表面开放嵌入式表面纹理GL_TEXTURE_EXTERNAL_OES类型的纹理,用于满足照相机预览输出的特殊场景;
创建表面纹理SurfaceTexture并关联照相机,从照相机预览中获得数据,对该获得的数据进行美颜处理,在美颜处理后进行显示及编码推流;
创建好表面纹理SurfaceTexture后,设置帧可达监听器
setOnFrameAvailableListener,通过帧可达监听器setOnFrameAvailableListener方法进行设置,当表面纹理SurfaceTexture每次从照相机那里接收到视频帧的时候,就被回调,通过触发图形绘制库表面视图GLSurfaceView的需要渲染requestRender来逐帧处理视频流,在配置好表面纹理SurfaceTexture后,通过照相机的设置预览纹理setPreviewTexture设为照相机预览接收对象,并开始预览。
4.如权利要求1所述的基于终端的网络直播中视频实时美颜及推流的方法,其特征在于,所述美颜后的数据通过纹理渲染到开放图形绘制库OpenGL的绘制缓冲图形绘制库表面GLSurface中并得到绘制之前,还包括滤波器的初始化,包括:
创建顶点着色器,加载顶点着色器脚本,编译所述脚本,查询所述脚本编译是否成功;
加载并编译片段着色器脚本;
创建程序并连接顶点、片段着色器,创建程序、依附着色器并进行程序链接,检查链接是否成功;
在检查到链接成功时,获取属性变量。
5.如权利要求2所述的基于终端的网络直播中视频实时美颜及推流的方法,其特征在于,所述转换所述OES纹理为2D纹理,包括:
清理开放图形绘制库OpenGL的颜色缓冲、位缓冲、深度信息缓冲;
通过调用更新纹理图像updateTextImage,更新表面纹理SurfaceTexture中的最新视频帧;
变换表面纹理SurfaceTexture的转换矩阵;
设置开放图形绘制库OpenGL的视点为(0,0,width,height),其中0,0是坐上坐标,width,height分别是宽度和高度,它是摄像头视频输出的画面大小,绑定帧缓冲,设置使用的程序;
设置顶点信息,纹理坐标和变换矩阵;
调用绘制方法,调用开放图形绘制库OpenGL的绘制图形数组glDrawArrays来将缓冲中的数据渲染;
复位相关设置,等待下一帧的转换到来。
6.如权利要求2或5所述的基于终端的网络直播中视频实时美颜及推流的方法,其特征在于,所述对2D纹理进行滤波美颜算法,包括:
设置顶点信息;
设置纹理坐标和变换矩阵;
判断纹理标识是否为空;
在判断出纹理标识为空时,选择已经激活的纹理单元,从开放嵌入式表面OES纹理中得到数据的2D纹理的标识;
在判断出纹理标识不为空时,通过绘制渲染美颜后的视频帧到屏幕中;
重设顶点、纹理坐标和纹理,完成一帧的渲染后,重设缓冲数据结构。
7.如权利要求6所述的基于终端的网络直播中视频实时美颜及推流的方法,其特征在于,所述对2D纹理进行滤波美颜算法之后,还包括将2D纹理导出到编码器,包括:
获取默认显示屏,通过嵌入式图形绘制层EGL窗体来协调开放图形绘制库OpenGL和显示系统的接口;
初始化显示屏幕;
设置属性列表并选择可达的开放图形绘制库OpenGL配置;
创建上下文,关联创建的上下文和显示屏幕;
根据本地窗体设置嵌入式图形绘制层EGL窗体,在所述获取到的默认显示屏上,通过传入多媒体数字信号编解码器MediaCodeC创建的输入表面Surface来创建窗口表面WindowSurface,这样凡是渲染到改屏幕的,都将渲染到多媒体数字信号编解码器MediaCodeC的输入表面Surface;
将所述创建的上下文设置为当前上下文。
8.如权利要求1所述的基于终端的网络直播中视频实时美颜及推流的方法,其特征在于,所述采用实时消息传输Rtmp协议,对所述获得的编码后的数据视频流进行推流,包括:
2D纹理作为输入,先进行美颜处理;
通过嵌入式图形绘制层EGL窗体的交换缓冲器swapBuffers交换方式,将数据交换到嵌入式图形绘制层MediaCodeC的输入表面Surface中;
嵌入式图形绘制层MediaCodeC对输入的数据帧进行编码;
从嵌入式图形绘制层MediaCodeC的输出缓冲器OutputBuffer中获取编码后的数据;
实时消息传输Rtmp推流,通过实时消息传输Rtmp库,对输出的数据帧进行推流,推送到直播流媒体服务器中。
9.如权利要求1所述的基于终端的网络直播中视频实时美颜及推流的方法,其特征在于,所述终端包括移动终端,包括:手机、平板电脑

说明书全文

一种基于终端的网络直播中视频实时美颜及推流的方法

技术领域

[0001] 本发明涉及网络直播技术领域,尤其涉及一种基于终端的网络直播中视频实时美颜及推流的方法。

背景技术

[0002] 直播是继图片社交后的被誉为新一代的社交媒介,随着互联网的飞速发展,网速的提升,终端直播技术变得现实。
[0003] 专利申请号为201110258416.X的发明专利提出“一种网络直播及录制方法”,该方法是关于直播一整套的系统说明,包括节目列表下载过程、HTTP(超文本传输协议)请求响应过程、录制过程,并且该方法是基于PC(个人电脑)端的,采用的技术是Flash(动画)和P2SP(双引擎加速器)技术,目前Flash已经被业内淘汰,该方法在PC端已经落后,更不能在终端平台使用。
[0004] 专利申请号为201510874169.4的发明专利提出“网络直播系统及直播方法”,该方法包括依次获取标准协议格式或私有协议格式封装的各个直播数据,对直播推流端并未涉及,而是在说明Rtmp(实时消息传输协议)是如何和CDN(内容分发网络)结合以及如何和自身的P2P业务系统结合,对终端直播的录制、推流等并未涉及,和该方案类似的方案还有专利申请号为201510894452.3的发明专利,都是关于直播服务器如何和CDN结合。
[0005] 专利申请号为201410386247.1的发明专利提出“基于移动网络丢包状态的直播视频数据传输差错控制方法”,包括DTU(数据转发中心)采用Rtmp向移动终端发送编码好的视频数据包,该方法提出如何将终端网络直播中的差错控制到最低,对直播的实时美颜和推流等都未提及。
[0006] 总结现有的技术方案,大多数方案要么是关于直播的服务器如何设计,要么是如何和与现有的业务系统结合,要么是对移动网络下的差错控制,然而这些方案都没有提出针对终端上的直播中视频实时的美颜及推流方案,现有技术还无法在终端中实现网络直播中视频实时的美颜及推流。

发明内容

[0007] 发明要解决的技术问题是提供一种基于终端的网络直播中视频实时美颜及推流的方法。
[0008] 本发明的目的在于提供一种基于终端的网络直播中视频实时美颜及推流的方法,包括:
[0009] 设定照相机的参数;
[0010] 照相机通过表面纹理SurfaceTexture和开放图形绘制库OpenGL的纹理建立联系,通过对纹理的处理进行美颜,美颜后的数据通过纹理渲染到开放图形绘制库OpenGL的绘制缓冲图形绘制库表面GLSurface中并得到绘制,进而得到预览;
[0011] 通过多媒体数字信号解码器MediaCodeC编码为指定格式的视频,照相机的视频流数据通过纹理传递到开放图形绘制库OpenGL的缓冲中,将帧缓冲的数据进一步交换到多媒体数字信号编解码器MediaCodeC创建的输入型表面Surface缓冲中,对数据进行编码处理,然后通过输出缓冲器OutPutBuffer获得编码后的数据;
[0012] 采用实时消息传输Rtmp协议,对所述获得的编码后的数据视频流进行推流。
[0013] 其中,所述设定照相机的参数,包括:
[0014] 设置照相机的参数、预览回调方式,通过表面纹理SurfaceTexture来导出照相机的视频帧流,通过开放图形绘制库OpenGL中的纹理对象来构建表面纹理SurfaceTexture对象,使得当照相机的视频帧流导出到表面纹理SurfaceTexture的时候能够和纹理衔接,所述纹理包括开放嵌入式表面OES纹理。
[0015] 其中,所述通过对纹理的处理进行美颜,美颜后的数据通过纹理渲染到开放图形绘制库OpenGL的绘制缓冲图形绘制库表面GLSurface中并得到绘制,进而得到预览,包括:
[0016] 进入到处理视频流的循环,循环包括按照逐帧处理来进行,视频帧逐帧输出到纹理接收接口,纹理对象需要通过更新当前帧缓冲,获得最新帧数据,开放嵌入式表面OES纹理直接接收数据,转换所述开放嵌入式表面OES纹理为2D纹理,对2D纹理进行滤波美颜算法,通过开放图形绘制库OpenGL的机制进行绘制。
[0017] 其中,所述照相机通过表面纹理SurfaceTexture和开放图形绘制库OpenGL的纹理建立联系,通过对纹理的处理进行美颜,美颜后的数据通过纹理渲染到开放图形绘制库OpenGL的绘制缓冲图形绘制库表面GLSurface中并得到绘制,进而得到预览,包括:
[0018] 创建图形绘制库表面视图GLSurfaceView,通过所述创建的图形绘制库表面视图GLSurfaceView,使用开放图形绘制库OpenGL的机制来进行绘制渲染,为图形绘制库表面视图GLSurfaceView设定渲染对象,渲染对象包括渲染器Renderer接口的实现;
[0019] 创建开放嵌入式表面OES纹理,通过对特定的表面贴图进而得到渲染的机制,包括创建、绑定、设置参数,在绑定的时候,我们选择绑定外部表面开放嵌入式表面纹理GL_TEXTURE_EXTERNAL_OES类型的纹理,用于满足照相机预览输出的特殊场景;
[0020] 创建表面纹理SurfaceTexture并关联照相机,从照相机预览中获得数据,对该获得的数据进行美颜处理,在美颜处理后进行显示及编码推流;
[0021] 创建 好 表面纹 理 Su rf ac eT ex tu re 后 ,设置 帧可 达监 听 器setOnFrameAvailableListener,通过帧可达监听器setOnFrameAvailableListener方法进行设置,当表面纹理SurfaceTexture每次从照相机那里接收到视频帧的时候,就被回调,通过触发图形绘制库表面视图GLSurfaceView的需要渲染requestRender来逐帧处理视频流,在配置好表面纹理SurfaceTexture后,通过照相机的设置预览纹理setPreviewTexture设为照相机预览接收对象,并开始预览。
[0022] 其中,所述美颜后的数据通过纹理渲染到开放图形绘制库OpenGL的绘制缓冲图形绘制库表面GLSurface中并得到绘制之前,还包括滤波器的初始化,包括:
[0023] 创建顶点着色器,加载顶点着色器脚本,编译所述脚本,查询所述脚本编译是否成功;
[0024] 加载并编译片段着色器脚本;
[0025] 创建程序并连接顶点、片段着色器,创建程序、依附着色器并进行程序链接,检查链接是否成功;
[0026] 在检查到链接成功时,获取属性变量。
[0027] 其中,所述转换所述OES纹理为2D纹理,包括:
[0028] 清理开放图形绘制库OpenGL的颜色缓冲、位缓冲、深度信息缓冲;
[0029] 通过调用更新纹理图像updateTextImage,更新表面纹理SurfaceTexture中的最新视频帧;
[0030] 变换表面纹理SurfaceTexture的转换矩阵;
[0031] 设置开放图形绘制库OpenGL的视点为(0,0,width,height),其中0,0是坐上坐标,width,height分别是宽度和高度,它是摄像头视频输出的画面大小,绑定帧缓冲,设置使用的程序;
[0032] 设置顶点信息,纹理坐标和变换矩阵;
[0033] 调用绘制方法,调用开放图形绘制库OpenGL的绘制图形数组glDrawArrays来将缓冲中的数据渲染;
[0034] 复位相关设置,等待下一帧的转换到来。
[0035] 其中,所述对2D纹理进行滤波美颜算法,包括:
[0036] 设置顶点信息;
[0037] 设置纹理坐标和变换矩阵;
[0038] 判断纹理标识是否为空;
[0039] 在判断出纹理标识为空时,选择已经激活的纹理单元,从开放嵌入式表面OES纹理中得到数据的2D纹理的标识;
[0040] 在判断出纹理标识不为空时,通过绘制渲染美颜后的视频帧到屏幕中;
[0041] 重设顶点、纹理坐标和纹理,完成一帧的渲染后,重设缓冲数据结构。
[0042] 其中,所述对2D纹理进行滤波美颜算法之后,还包括将2D纹理导出到编码器,包括:
[0043] 获取默认显示屏,通过嵌入式图形绘制层EGL窗体来协调开放图形绘制库OpenGL和显示系统的接口;
[0044] 初始化显示屏幕;
[0045] 设置属性列表并选择可达的开放图形绘制库OpenGL配置;
[0046] 创建上下文,关联创建的上下文和显示屏幕;
[0047] 根据本地窗体设置嵌入式图形绘制层EGL窗体,在所述获取到的默认显示屏上,通过传入多媒体数字信号编解码器MediaCodeC创建的输入表面Surface来创建窗口表面WindowSurface,这样凡是渲染到改屏幕的,都将渲染到多媒体数字信号编解码器MediaCodeC的输入表面Surface;
[0048] 将所述创建的上下文设置为当前上下文。
[0049] 其中,所述采用实时消息传输Rtmp协议,对所述获得的编码后的数据视频流进行推流,包括:
[0050] 2D纹理作为输入,先进行美颜处理;
[0051] 通过嵌入式图形绘制层EGL窗体的交换缓冲器swapBuffers交换方式,将数据交换到嵌入式图形绘制层MediaCodeC的输入表面Surface中;
[0052] 嵌入式图形绘制层MediaCodeC对输入的数据帧进行编码;
[0053] 从嵌入式图形绘制层MediaCodeC的输出缓冲器OutputBuffer中获取编码后的数据;
[0054] 实时消息传输Rtmp推流,通过实时消息传输Rtmp库,对输出的数据帧进行推流,推送到直播流媒体服务器中。
[0055] 其中,所述终端包括移动终端,包括:手机、平板电脑
[0056] 本发明提供的基于终端的网络直播中视频实时美颜及推流的方法,包括对从摄像头到推流整个直播过程中涉及的美颜、渲染、编码、推流以及生命周期的管理都有详尽的描述,通过本发明方案,能够在终端如手机中实现网络直播中视频实时的美颜及推流。附图说明
[0057] 图1,为本发明基于终端的网络直播中视频实时美颜及推流的方法的示意图;
[0058] 图2,为本发明线程模型的示意图;
[0059] 图3,为本发明美颜及预览的整体流程的示意图;
[0060] 图4,为本发明设置照相机及关联纹理的示意图;
[0061] 图5,为本发明美颜模的类图关系示意图;
[0062] 图6,为本发明滤波器的初始化流程示意图;
[0063] 图7,为本发明开放嵌入式表面OES纹理转2D纹理流程的示意图;
[0064] 图8,为本发明美颜算法的示意图;
[0065] 图9,为本发明数据流向的示意图;
[0066] 图10,为本发明更改默认的显示屏幕到多媒体数字信号编解码器MediaCodeC创建的表面Surface的流程的示意图;
[0067] 图11,为本发明编码推流线程的示意图;
[0068] 图12,为本发明直播模块的生命周期管理的示意图。

具体实施方式

[0069] 本发明提供一种基于终端的网络直播中视频实时美颜及推流的方法,应用于网络直播技术领域,包括对从摄像头到推流整个直播过程中涉及的美颜、渲染、编码、推流以及生命周期的管理都有详尽的描述,通过本发明方案,能够在终端如手机中实现网络直播中视频实时的美颜及推流。
[0070] 为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
[0071] 本发明提供一种基于终端的网络直播中视频实时美颜及推流的方法。
[0072] 一、整体流程
[0073] 请参见图1,图1为本发明基于终端的网络直播中视频实时美颜及推流的方法的示意图,包括:
[0074] Step1、照相机输出数据到纹理,通过对纹理的处理进行美颜,美颜后的数据在OpenGL(开放图形绘制库)的GLSurface(图形绘制库表面)中得到绘制,进而的到预览。这里面包含照相机基本参数的设定、照相机通过SurfaceTexture(表面纹理)和开放图形绘制库OpenGL的纹理建立联系,对纹理处理进而达到美颜效果,通过纹理渲染到开放图形绘制库OpenGL的绘制缓冲中并得到绘制;具体细节我们后面会展开来说明;
[0075] Step2、通过MediaCodeC(多媒体数字信号编解码器)编码为指定格式的视频,照相机的视频流数据通过纹理传递到开放图形绘制库OpenGL的帧缓冲中,将帧缓冲的数据进一步交换到多媒体数字信号编解码器MediaCodeC创建的输入型Surface(表面)缓冲中,对数据进行编码处理,然后通过OutPutBuffer获得编码后的数据,然后进行推流;
[0076] Step3、实时消息传输Rtmp协议进行推流,通过采用实时消息传输Rtmp协议,对视频流进行推流。
[0077] 二、线程模型
[0078] 在图1中,我们说明了本发明基于终端的网络直播中视频实时美颜及推流的方法的整体流程,这个流程中,最为重要的两个部分是美颜预览和编码推流;在移动手机上进行视频直播,对处理视频数据的实时性提出了很高的要求,为了保证不卡顿,提高处理效率和合理分离业务逻辑,达到业务上的高内聚,我们设计了如图2所示的线程模型,请参见图2,图2为本发明线程模型的示意图,本发明线程模型包括三个线程:
[0079] 1)、主线程:主线程即应用的UI线程,它负责渲染系统提供的组件以及系统的事件响应。在安卓系统中,主线程是应用的系统可视化资源所在的线程,所以,不能在其他子线程去访问系统可视资源;但我们可以通过开放图形绘制库OpenGL去在子线程中进行绘制;
[0080] 2)、美颜预览线程:系统的可视组件只能够在主线程中进行访问,但我们依然可以使用开放图形绘制库OpenGL在子线程中进行绘制,这种绘制是有别于系统组件的绘制,这里我们采用了GLSurfaceView(图形绘制库表面视图)组件,它的渲染对象Renderer(渲染器)的绘制就是在子线程里面,所以美颜预览线程,负责了将相机导出的视频帧流作为纹理,通过叠加美颜算法,然后渲染到开放图形绘制库OpenGL指定的表面Surface内存快中,进而进行渲染显示,以达到实时美颜并预览的功能;
[0081] 3)、编码推流线程:对视频编码和对视频美颜渲染一样,都是一个耗时操作,所以将编码推流从美颜预览的线程中独立出来,分离编码和网络带来对预览的卡顿是非常关键的,在编码线程我们通过多媒体数字信号编解码器MediaCodeC对视频流进行编码,然后通过实时消息传输Rtmp管理模块进行推流。
[0082] 三、美颜及预览
[0083] 这一节我们说明美颜和预览部分内容,美颜及预览是在美颜预览子线程完成的,在这一环节,我们需要使用图形绘制库表面视图GLSurfaceView组件,它最为重要的方法就是设置渲染对象渲染器Renderer,我们可以通过定制渲染器Renderer来达到绘制我们想要的内容,美颜及预览的整体流程如图3时序图所示,请参见图3,图3为本发明美颜及预览的整体流程的示意图,它牵涉到应用、照相机对象、纹理对象、渲染对象,本发明美颜及预览的整体流程,包括:
[0084] Step1、应用设置照相机:应用设置照相机主要包含设置照相机基本参数、预览回调方式;在此,本发明是通过表面纹理SurfaceTexture来导出照相机的视频帧流,而在构建表面纹理SurfaceTexture对象的时候,我们可以通过开放图形绘制库OpenGL中的纹理对象来构建它,使得当照相机的视频帧流导出到表面纹理SurfaceTexture的时候能够和纹理衔接;这里因为照相机视频帧的特殊性,这里的纹理只能是OES(开放嵌入式表面)纹理,设置好照相机以及它和纹理直接的联系后,设置步骤就完成了,进入Step2;
[0085] Step2、预览:在完成Step1的设置后,就可以开始相机的预览,预览开始后,进入到处理视频流的循环,循环是按照逐帧处理来进行的,视频帧会逐帧输出到纹理接收接口,纹理对象需要通过更新当前帧缓冲,获得最新帧数据,直接接收数据的是OES开放嵌入式表面纹理,我们还需要将它转换为2D纹理,然后对2D纹理进行滤波美颜算法,最后通过开放图形绘制库OpenGL的机制进行绘制。
[0086] 下面我们将这美颜预览这部分的内容展开说明,根据阶段,我们分为设置照相机及关联纹理、滤波器的初始化、OES开放嵌入式表面纹理转2D纹理流程、美颜绘制流程、美颜预览的数据流。
[0087] 3.1设置照相机及关联纹理
[0088] 美颜处理和预览的第一步是必须先创建和设置好照相机以及其数据导出链中的相关对象,特别是纹理,图4所示的是设置照相机及关联纹理,请参见图4,图4为本发明设置照相机及关联纹理的示意图,本发明设置照相机及关联纹理,包括:
[0089] Step1、创建图形绘制库表面视图GLSurfaceView:
[0090] 创建图形绘制库表面视图GLSurfaceView的目的是为了有一个地方可以让我们绘制视频帧,即预览所在的场所;
[0091] 采用图形绘制库表面视图GLSurfaceView是因为通过它我们可以使用开放图形绘制库OpenGL的机制来进行绘制渲染,图形绘制库表面视图GLSurfaceView它继承自表面视图SurfaceView,但它有自己独立的绘制线程。在图形绘制库表面视图GLSurfaceView的所有方法中,setRenderer(设置渲染器)方法是最为重要的,它为图形绘制库表面视图GLSurfaceView设定渲染对象;渲染对象是渲染器Renderer接口的实现,我们可以在onDrawFrame回调中逐帧的控制我们想要绘制的东西;
[0092] 此外,它还有onSurfaceCreated(表面创作)回调,它在表面Surface创建好后回调,在这里可以做一些初始化的工作;onSurfaceChanged(表面变化)回调,则是在尺寸发生变动的时候回调,这时候可以根据尺寸变化进行调整,例如横竖屏变化的时候,做出相应的调整;
[0093] Step2、设置照相机Camera:
[0094] 设置照相机首先需要做的是查询系统的照相机硬件信息,例如有几个照相机、前后置照相机是否都可用;
[0095] 然后打开照相机并设置好默认参数,例如设置默认打开前置摄像头、设置聚焦模式是输出连续视频还是连续图片、设置预览尺寸大小;
[0096] Step3、创建OES开放嵌入式表面类型纹理:
[0097] 纹理是开放图形绘制库OpenGL中的重要概念,它通过对特定的表面贴图进而得到渲染的机制,创建OES开放嵌入式表面纹理包含三个小的步骤:创建、绑定、设置参数;
[0098] 在绑定的时候,我们选择绑定GL_TEXTURE_EXTERNAL_OES(外部表面开放嵌入式表面纹理)类型的纹理,用于满足照相机预览输出的特殊场景;
[0099] Step4、创建表面纹理SurfaceTexture并关联照相机:
[0100] 表面纹理SurfaceTexture是安卓API 11加入的一个类,它和SurfaceView(表面视图)相像,但它不需要显示出来,我们需要从照相机预览中获得数据,然后对它进行美颜处理,然后进行显示及编码推流;
[0101] 这如果采用表面视图SurfaceView是做不到的,表面纹理SurfaceTexture正合适,它只管满足能够从照相机导出一帧一帧的原始数据即可;
[0102] 创建表面纹理SurfaceTexture的时候,需要传入一个开放图形绘制库OpenGL的纹理对象,这里就使用Step3中创建的纹理对象;
[0103] 创建好表面纹理SurfaceTexture后,设置帧可达监听器,通过setOnFrameAvailableListener方法进行设置,当表面纹理SurfaceTexture每次从照相机那里接收到视频帧的时候,就被回调,我们可以在这个监听器的实现中,通过触发图形绘制库表面视图GLSurfaceView的requestRender来逐帧处理视频流,在配置好表面纹理SurfaceTexture后,就可以通过照相机的setPreviewTexture将它设为照相机预览接收对象,并开始预览。
[0104] 在设置好照相机及关联好纹理对象后,我们就可以进行视频帧导出和处理了,如图5所示的是美颜模块的类图关系,请参见图5,图5为本发明美颜模块的类图关系示意图,本发明美颜模块的类图关系包括图形绘制库表面视图GLSurfaceView,它是表面视图SurfaceView在开放图形绘制库OpenGL架构下的发明派生类,用于绘制;
[0105] 渲染器Renderer接口是真正的绘制接口,这里定义CameraDisplay(照相机显示)类来实现具体的渲染绘制,Filter是滤波器,是OES开放嵌入式表面纹理转2D纹理以及各种美颜算法的载体,它可以在CameraDisplay中配置和使用;
[0106] 需要特别注意的是由于美颜算法是在2D纹理上进行的,而照相机导出的是OES开放嵌入式表面纹理,所以,我们这里需要从Filter(滤波器)派生出两种滤波器,一个是CameraInputFilter(照相机输入滤波器),相机输入滤波器,它的作用就是将OES开放嵌入式表面接收到的数据最后拷贝到2D纹理中,另一个是BeautyFilter(美颜滤波器),在2D纹理上进行美颜算法。
[0107] 在知道了美颜模块的类图关系后,我们详细说明其中的流程设计。
[0108] 3.2滤波器的初始化
[0109] 在实现绘制之前,我们需要去配置我们需要使用的开放图形绘制库OpenGL的一些基本流程,具体到移动平台是开放图形绘制库OpenGL ES,目前的版本是3.0或者一些旧一些的系统仍然是2.0,开放图形绘制库OpenGL绘制工序具有特定的管道流程,我们需要在这些流程上定制复合属于我们程序的配置;
[0110] 图6是滤波器的初始化流程,请参见图6,图6为本发明滤波器的初始化流程示意图,无论是OES开放嵌入式表面转2D的CameraInputFilter滤波器还是美颜的BeautyFilter(美颜滤波器),都是这个初始化流程,本发明滤波器的初始化流程,包括:
[0111] Step1、加载并编译顶点着色器脚本:
[0112] 首先需要创建着色器,根据类型去创建着色器,顶点着色器是GL_VERTEX_SHADER(顶点着色器)类型;
[0113] 然后加载着色器脚本,编译该脚本,最后查询该脚本编译是否成功;
[0114] Step2、加载并编译片段着色器脚本:
[0115] 其流程和加载编译顶点着色器流程一样,只是类型改为GL_FRAGMENT_SHADER(片段着色器);
[0116] Step3、创建程序并连接顶点、片段着色器:
[0117] 在开放图形绘制库OpenGL的渲染管道中,顶点着色器是片段着色器的输入,要将二者联系起来需要通过程序(Program);
[0118] 着色器就像编译器编译好的对象文件,需要连接器链接加载进程序中,而这个连接器就是程序,所以,我们需要创建程序、依附着色器并进行程序链接,检查链接是否成功,如果成功则进入Step4;
[0119] Step4、获取属性变量:
[0120] 我们的美颜算法是在开放图形绘制库OpenGL的GLSL(开放图形绘制库OpenGL着色语言)脚本中实现的,但脚本中的一些变量需要应用传递进去,这里有“position”、“inputTexture”、“textureCoordinate”分别表示渲染的顶点信息、纹理信息、纹理坐标信息。
[0121] 在说完滤波器的初始化流程后,我们可以对OES开放嵌入式表面纹理转2D纹理的流程、美颜及预览的流程分别做一个说明,即接下来的3.3小节和3.4小节。
[0122] 3.3OES开放嵌入式表面纹理转2D纹理流程
[0123] 摄像头预览导出的是OES开放嵌入式表面纹理,如果需要美颜或者编码处理,我们需要先转换成2D纹理,其流程如图7所示,请参见图7,图7为本发明开放嵌入式表面OES纹理转2D纹理流程的示意图,本发明开放嵌入式表面OES纹理转2D纹理流程,包括:
[0124] Step1、清理开放图形绘制库OpenGL的颜色缓冲、位缓冲、深度信息缓冲;
[0125] Step2、更新表面纹理SurfaceTexture中的最新视频帧,这个过程通过调用它的updateTextImage方法实现;
[0126] Step3、换的表面纹理SurfaceTexture的转换矩阵,转换矩阵是一个4*4的二位矩阵;
[0127] Step4、设置开放图形绘制库OpenGL的视点为(0,0,width,height),其中0,0是坐上角坐标,width,height分别是宽度和高度,它是摄像头视频输出的画面大小,绑定帧缓冲,设置使用的程序;
[0128] Step5、设置顶点信息,纹理坐标和变换矩阵;
[0129] Step6、调用绘制方法,通过上述步骤的设置之后,调用开放图形绘制库OpenGL的glDrawArrays(绘制图形数组)来将缓冲中的数据渲染,这里的渲染不是渲染到屏幕,而是从FrameBuffer(帧缓冲器)帧缓冲中拷贝到2D纹理缓冲中,这样就完成了OES开放嵌入式表面纹理到2D纹理的转换;
[0130] Step7:复位相关设置。完成拷贝后,复位相关设置,等待下一帧的转换到来。
[0131] 3.42D纹理美颜及渲染过程
[0132] 在完成OES开放嵌入式表面纹理转成2D纹理之后,我们可以对2D纹理进行美颜及渲染以及编码推流,在这一小节我们先描述2D纹理的美颜渲染过程,美颜根据需要的美颜效果,设置不同的美颜滤波器,不同的美颜滤波器主要是通过编辑开放图形绘制库OpenGL着色语言GLSL脚本来实现;
[0133] 对于开放图形绘制库OpenGL着色语言GLSL脚本的描述,可以参考相关开放图形绘制库OpenGL的书籍,在这里我们主要说明我们是如何对2D纹理进行美颜设计的,在上一节中,我们已经把OES开放嵌入式表面纹理转成2D纹理,我们通过纹理纹理id(身份识别码)来获得2D纹理对象,然后对其进行美颜算法,美颜算法的流程如图8所示,请参见图8,图8为本发明美颜算法的示意图,本发明美颜算法,包括:
[0134] Step1、设置顶点信息,顶点是开放图形绘制库OpenGL渲染中非常关键的概念,它决定了你渲染的面,所以,算法需要首先设置顶点信息;
[0135] Step2、设置纹理坐标和变换矩阵;
[0136] Step3、判断纹理标识是否为空,如果为空则转Step4,否则转Step5;
[0137] Step4、选择已经激活的纹理单元,这一步骤很关键,这是渲染第一帧的时候必经的路径,这时候会拿到上一节中从OES开放嵌入式表面纹理中得到数据的2D纹理的标识;
[0138] Step5、绘制,这里的绘制不再是非屏幕渲染,而是真实的渲染到屏幕中,这样屏幕上就可以看到美颜后的视频帧,根据设置的美颜滤波器不一样而效果不同;
[0139] Step6:重设顶点、纹理坐标和纹理,完成一帧的渲染后,重设相关缓冲等数据结构。
[0140] 3.5数据流向说明
[0141] 到本小节为止,我们说明了如何从摄像机中导出视频帧、美颜渲染,数据流向在本方案中显得非常重要,因为本发明就是为移动环境提供解决直播中视频的美颜和编码推流。
[0142] 如图9所示是数据流向的一个示意图,请参见图9,图9为本发明数据流向的示意图,本发明数据流向包括从照相机Camera导出的数据的第一个对象是表面纹理SurfaceTexture,然后从它导出OES开放嵌入式表面纹理,而OES开放嵌入式表面纹理因为不能直接做处理,所以需要转为2D纹理,而它的转换过程中借助了帧缓冲器FrameBuffer来实现非屏幕的渲染,转换成2D纹理后,在一个渲染线程中对其进行美颜渲染,在另一个线程中对其美颜后通过自定义窗体的方法输出到编码器中作为输入。
[0143] 到此,我们把方案中的美颜及预览部分描述完毕。下一节我们说明方案的另一部分,编码及推流。
[0144] 四、编码及推流
[0145] 在编码推流环节,我们首先要解决的是如何将2D纹理的数据进行编码,然后是编码后的数据如何推流。在编码线程,我们首先也得对2D纹理进行和美颜渲染线程一样的美颜处理。
[0146] 对于美颜部分的流程在这里就不再复述,我们将焦点放到如何对2D纹理的数据进行编码,我们的方法是对2D纹理进行导出,导出到多媒体数字信号编解码器MediaCodeC中,对其进行编码处理。
[0147] 4.1将2D纹理导出到编码器
[0148] 将2D纹理导出到编码器,我们需要更改默认的渲染显示器,就如同将OES开放嵌入式表面纹理变换成2D纹理一样,当然,这里有些不一样,主要是根据我们所选用的编码器来定的;
[0149] 在本小节我们说明,如何通过更改默认的显示屏幕来达到将数据导出到编码器中;本发明的编码器选用多媒体数字信号编解码器MediaCodeC,这是Android(安卓)系统在API 18中引入的一个基础库,更改默认的显示屏幕到多媒体数字信号编解码器MediaCodeC创建的表面Surface的流程如图10所示,请参见图10,图10为本发明更改默认的显示屏幕到多媒体数字信号编解码器MediaCodeC创建的表面Surface的流程的示意图,本发明更改默认的显示屏幕到多媒体数字信号编解码器MediaCodeC创建的表面Surface的流程,包括:
[0150] Step1、获取默认显示屏:
[0151] 需要注意的是开放图形绘制库OpenGL对具体的显示设备不关心,所以在安卓Android系统上,需要通过嵌入式图形绘制层Egl来协调开放图形绘制库OpenGL和显示系统的接口;
[0152] Step2、初始化显示屏幕;
[0153] Step3、设置属性列表并选择可达的开放图形绘制库OpenGL配置,优选选取开放图形绘制库OpenGL ES 3.0的配置,如果获取失败则使用开放图形绘制库OpenGL ES 2.0;
[0154] Step4、创建上下文,上下文的创建,将和显示屏幕关联起来;
[0155] Step5、根据本地窗体设置嵌入式图形绘制层EGL窗体,在Step1获取到的显示屏幕,通过传入多媒体数字信号编解码器MediaCodeC创建的输入表面Surface来创建窗口表面WindowSurface,这样凡是渲染到改屏幕的,都将渲染到多媒体数字信号编解码器MediaCodeC的输入表面Surface,这样2D纹理就顺利的输出到编码器多媒体数字信号编解码器MediaCodeC中,每一帧的输出通过嵌入式图形绘制层EGL窗体的交换缓冲器swapBuffers交换方法来交换输出;
[0156] Step6、将上下文设置为当前上下文。需要让上述步骤起效,则需要将上下文设置为当前上下文。
[0157] 4.2编码及推流
[0158] 在完成上一节的配置后,编码线程就可以获得每一帧2D纹理的输出,在本小节,我们说明编码推流线程的整个流程。如图11所示,请参见图11,图11为本发明编码推流线程的示意图,本发明编码推流线程,包括:
[0159] Step1、2D纹理作为输入,先进行美颜处理,这部分流程跟美颜渲染里面的美颜是一致的;
[0160] Step2、将数据交换到多媒体数字信号编解码器MediaCodeC的输入表面Surface中,这一步骤通过嵌入式图形绘制层EGL窗体的交换缓冲器swapBuffers交换方法来达到目的;
[0161] Step3、多媒体数字信号编解码器MediaCodeC会对输入的数据帧进行编码;
[0162] Step4、从多媒体数字信号编解码器MediaCodeC的OutputBuffer(输出缓冲器)中获取编码后的数据;
[0163] Step5、实时消息传输Rtmp推流,通过实时消息传输Rtmp库,对输出的数据帧进行推流,推送到直播流媒体服务器中。
[0164] 由于实时消息传输Rtmp是一个公共的协议,在这里我们就不再进行描述,可以参见相关公开资料即可,本小节将编码数据流的关键步骤描述完毕。
[0165] 五、运行状态的控制
[0166] 在Android系统中,软件由四大组件构建成,其中Activity是可见的控件,它的生命周期可以分为创建、开始、回复、运行态、暂停、停止、销毁几个步骤;所以,根据Activity的生命周期,直播推流模块根据其生命周期构造对应的生命周期来管理程序,让程序尽可能的节省资源的运行,如图12所示的是直播模块的生命周期管理,其生命状态和Activity的生命周期是吻合的,请参见图12,图12为本发明直播模块的生命周期管理的示意图,本发明直播模块的生命周期管理,包括:
[0167] 1)onCreate,创建:
[0168] 创建需要创建对应的数据结构和获取对应的资源,主要分两个方面,一方面是录制的准备,另一方面是实时消息传输Rtmp库的初始化;录制的初始化包含检测摄像头、硬件检测、系统版本检测(决定是否开美颜算法)、摄像头的初始化等工作,实时消息传输Rtmp模块则初始化基本配置,准备好链接需要的工作;
[0169] 2)start,开始:
[0170] 启动直播,开始采集视频流,并推流,onResume:恢复,直播sdk的生命周期方法之一,通常在直播页面Activity的onResume()方法中调用该方法,该方法会继续直播。包括录制和推流;
[0171] 3)运行态:
[0172] 录制和推流的常态,只要开始了都将处于这个状态;
[0173] 4)onPause,暂停:
[0174] 直播sdk的生命周期方法之一,通常在直播页面Activity的onPause()方法中调用该方法,方法首先会暂停录制,也会暂停实时消息传输Rtmp的推流;
[0175] 5)stop,停止:
[0176] 和暂停的功能基本类似,提供一些额外的资源释放;
[0177] 6)onDestroy,销毁:
[0178] 直播sdk(软件开发工具包)的生命周期方法之一,通常在直播页面Activity的onDestroy()方法中调用该方法,彻底销毁直播所占用的资源。
[0179] 其中,该终端包括移动终端,包括:手机、平板电脑。
[0180] 本发明提供的基于终端的网络直播中视频实时美颜及推流的方法,包括对从摄像头到推流整个直播过程中涉及的美颜、渲染、编码、推流以及生命周期的管理都有详尽的描述,通过本发明方案,能够在终端如手机中实现网络直播中视频实时的美颜及推流。
[0181] 需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或者操作之间存在任何这种实际的关系或者顺序。而且,术语“包含”、“包括”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系统要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个、、、、、、”限定的要素,并不排除在包括所述要素的过程、方法、物品、设备或者装置中还存在另外的相同要素。
[0182] 对于本发明基于终端的网络直播中视频实时美颜及推流的方法,实现的形式是多种多样的。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈