2017年,短视频正以其丰富的内容表现力和时间碎片化的特点,快速崛起,而短视频最具可玩性之处就在支持人脸识别的动态贴图和各种不同效果的美颜、滤镜等。那短视频动态贴纸、滤镜、美颜等功能究竟是如何实现的呢?

为什么选择 OpenGL ES

Android 手机在处理 3D 图形相关的计算时一般都会选择使用 GPU。相较于 CPU,GPU 在图像动画处理时能提供更快的速度以达到更高的帧率。 Android 设备的 GPU 处理提供了两套不同的 API :Vulkan 和 OpenGL ES。其中 VulKan 只支持 Android 7.0 以上的设备。OpenGL ES 则支持所有的 Android 版本。

同时 OpenGL ES 作为 OpenGL 的子集,针对手机、PDA 和游戏主机等嵌入式设备去除了 glBegin/glEnd,四边形、多边形等复杂图元等许多非绝对必要的特性,消除它的冗余功能,从而提供了更容易学习和易于在移动图形硬件中实现的库。

所以目前,在短视频图像处理中 OpenGL ES 凭借它良好的系统支持性和功能的高度精简性使它成为了最广泛的 GPU 处理 API 之一。

下文我将以 Android 为例通过绘制一个三角形,简单介绍一下如何使用 OpenGL ES 2.0。

如何使用 OpenGL ES 绘制一个三角形

创建一个画布

首先要在 manifest 配置文件中添加申明使用 OpenGL ES 2.0 接口:

Android 为 3D 图形提供了两个可以作为画布的控件,GLSurfaceView 和 TextureView 。其中 GLSurfaceView 使用起来更加简单方便,只要像普通的 View 一样在布局文件中定义即可。

然后再 Activity 中直接用 findViewById() 获取 view 即可。

还需要调用 setEGLContextClientVersion() 方法来指定使用的 OpenGL ES 版本。

GLSurfaceView 的渲染模式有两种,默认是幕 RENDERMODE_CONTINUOUSLY 连续不断的更新屏 ,另外一种是RENDERMODE_WHEN_DIRTY只有在调用 requestRender() 在更新屏幕(要在 onSurfaceCreated()方法后调该改方法 )。

创建一个渲染器

上面创建的 GLSurfaceView 控件需要一个 GLSurfaceView.Renderer 来进行图像的渲染。使用 setRender() 为 GLSurfaceView 绑定一个渲染器。

GLSurfaceView.Renderer 有三个方法 :

onSurfaceCreated():调用一次,用来配置 View 的 OpenGL ES 环境。

onDrawFrame():每次重新绘制 View 时被调用。

onSurfaceChanged():如果 View 的几何形态发生变化时会被调用,例如当设备的屏幕方向发生改变时。

绘制三角形

创建一个 Triangle 类,确定三角形的坐标并传入一个 ByteBuffer 中。

定义 Vertex Shader 和 Fragment Shader 用来渲染图形顶点和图形表面。

用一个辅助方法加载 Vertex Shader 和 Fragment Shader 。

创建一个 Program 并传入 Vertex Shader 和 Fragment Shader 。

创建一个 onDraw() 方法用于绘制图形。

最后在 GLSurfaceView.Renderer 的 onDrawFrame () 方法中执行绘制方法。

这样就可以通过 OpenGL ES 2.0 在屏幕上绘制一个三角形了。效果如图:

上文以使用 OpenGL ES 在屏幕绘制一个三角形为例,展示了  OpenGL ES 的基础使用方法。感兴趣的朋友可以通过  Android 的官网教程(https://developer.android.com/training/graphics/opengl/environment.html)学习了解。

短视频图像处理实现

我们知道了如何在 Android 使用 OpenGL ES,那么短视频中滤镜和美颜等操作又是如何实现的?

首先在短视频采集过程中,需要提供一个 view 作为摄像头的预览画面展示,Android 中提供了 GLSurfaceView 以及 TextureView 这两个 API 来实现相机预览。通过这种方式就可以使用 Android 提供的 OpenGL ES 环境,对图像进行处理。比如美颜是对肤色部分做模糊美白加亮操作,滤镜贴纸是将素材图片处理成纹理叠加到原视频纹理中。

创建 SurfaceTexture 绑定 Camera 之后开启相机预览。

这里涉及很多 OpenGL 的操作。有兴趣的同学可以 看下这个开源项目(https://github.com/wuhaoyu1990/MagicCamera) 提供了丰富的滤镜效果示例。

又拍云最近推出了一站式短视频解决方案,提供短视频录制端、播放端 SDK,上传加速,不限量存储以及稳定快速的 CDN服务。短视频拍摄端 SDK 集成美颜、滤镜、动态贴纸等众多功能。一站式短视频解决方案,即可满足你的全部需求!

参考内容:维基百科 — OpenGL ES

推荐阅读:

短视频 SDK 功能点技术实现方式详解

短视频图像处理 OpenGL ES 实践的更多相关文章

  1. Android短视频SDK转码实践

    一. 前言 一些涉及的基本概念: 转码:一般指多媒体文件格式的转换,比如分辨率.码率.封装格式等: 解复用(demux):从某种封装中分离出视频track和音频track,然后交给后续模块进行处理: ...

  2. 短视频 SDK 架构设计实践

    作者简介 孔维乐,七牛云客户端团队 Android 平台高级开发工程师,专注音视频,图形图像领域.OpenGL 专家,先后参与直播推流及连麦 SDK 的开发,主导短视频 SDK 的架构设计与实现, 对 ...

  3. 从350ms到80ms,揭秘阿里工程师 iOS 短视频优化方案

    内容作为 App 产品新的促活点,受到了越来越多的重视与投入,短视频则是增加用户粘性.增加用户停留时长的一把利器.短视频的内容与体验直接关系到用户是否愿意长时停留,盒马也提出全链路内容视频化的规划,以 ...

  4. OpenGL ES应用开发实践指南:iOS卷

    <OpenGL ES应用开发实践指南:iOS卷> 基本信息 原书名:Learning OpenGL ES for iOS:A Hands-On Guide to Modern 3D Gra ...

  5. TextureView+SurfaceTexture+OpenGL ES来播放视频(三)

    引自:http://www.jianshu.com/p/291ff6ddc164 做好的Demo截图 opengl-video 前言 讲了这么多,可能有人要问了,播放视频用个android封装的Vid ...

  6. TextureView+SurfaceTexture+OpenGL ES来播放视频(一)

    引自:http://www.ithao123.cn/content-8733143.html 最近发现视频直播类应用层出不穷,比如233手游直播,蓝鲸直播,微录客等等什么的,连android界大神老罗 ...

  7. 2018亚太CDN峰会开幕, 阿里云王海华解读云+端+AI的短视频最佳实践

    4月11-12日,2018亚太CDN峰会在北京隆重召开,在11日下午的短视频论坛中,阿里云高级技术专家王海华进行了<短视频最佳实践:云+端+AI>的主题演讲,分享了短视频的生命周期关键点和 ...

  8. TextureView+SurfaceTexture+OpenGL ES来播放视频(二)

    引自:http://www.jianshu.com/p/b2d949ab1a1a 在使用OpenGL ES 绘制前,我先概括下接下来要做的工作:我先借用一个博主kiffa举的的一个栗子,我觉得说的恰到 ...

  9. iOS图像处理之Core Graphics和OpenGL ES初见

    http://www.jianshu.com/p/f66a7ca326dd iOS支持两套图形API族:Core Graphics/QuartZ 2D 和OpenGL ES.OpenGL ES是跨平台 ...

随机推荐

  1. Linux sort命令中文手册(info sort翻译)

    说明: (1).本手册只挑选了有用的信息进行翻译,如要查看完完整整的内容,请自行info sort. (2).译文中,在括号中使用了"注"的,为本人所加,非原文内容,助于理解和说明 ...

  2. 【LCT】一步步地解释Link-cut Tree

    简介 Link-cut Tree,简称LCT. 干什么的?它是树链剖分的升级版,可以看做是动态的树剖. 树剖专攻静态树问题:LCT专攻动态树问题,因为此时的树剖面对动态树问题已经无能为力了(动态树问题 ...

  3. VMware Workstation 12 Pro 之安装林耐斯CentOS X64系统

    VMware Workstation 12 Pro 之安装林耐斯CentOS X64系统... -------------- --------------------------- --------- ...

  4. zoj3785 What day is that day?

    It's Saturday today, what day is it after 11 + 22 + 33 + ... + NN days? Input There are multiple tes ...

  5. 中间件学习之RMI+JDBC远端数据库的访问

    问题: RMI+JDBC远端数据库的访问.实现简单的成绩查询系统(创建表,录入成绩,查询成绩等).在服务器端,通过JDBC访问数据库.客户端调用服务端提供的各种数据库操作. 环境准备: (1).确保J ...

  6. 使用VMware Workstation安装win7镜像文件时遇见的错误

    最近打算使用虚拟机安装个系统玩玩,就去网站上找了教程安装下win7系统.但是在安装过程中遇见两个问题,现在把遇见的问题总结记录一下,以及解决方法罗列一下. 我当时使用的是VMware 12版的,系统是 ...

  7. [2014-02-19]如何移除响应头中的.net framework 版本信息 以及mvc版本信息?

    先来看一个简单mvc3网站的响应头 修改Global.asax文件 在Application_Start方法中添加如下代码 MvcHandler.DisableMvcResponseHeader = ...

  8. MongoDB环境安装

    ---------------------MongoDB安装环境--------------------- 1.MongoDB下载地址:http://www.mongodb.org/downloads ...

  9. 自动化测试:behave

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  10. 【DDD】领域驱动设计实践 —— 架构风格及架构实例

    概述 DDD为复杂软件的设计提供了指导思想,其将易发生变化的业务核心域放置在限定上下文中,在确保核心域一致性和内聚性的基础上,DDD可以被多种语言和多种技术框架实现,具体的框架实现需要根据实际的业务场 ...