短视频图像处理 OpenGL ES 实践
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
推荐阅读:
短视频图像处理 OpenGL ES 实践的更多相关文章
- Android短视频SDK转码实践
一. 前言 一些涉及的基本概念: 转码:一般指多媒体文件格式的转换,比如分辨率.码率.封装格式等: 解复用(demux):从某种封装中分离出视频track和音频track,然后交给后续模块进行处理: ...
- 短视频 SDK 架构设计实践
作者简介 孔维乐,七牛云客户端团队 Android 平台高级开发工程师,专注音视频,图形图像领域.OpenGL 专家,先后参与直播推流及连麦 SDK 的开发,主导短视频 SDK 的架构设计与实现, 对 ...
- 从350ms到80ms,揭秘阿里工程师 iOS 短视频优化方案
内容作为 App 产品新的促活点,受到了越来越多的重视与投入,短视频则是增加用户粘性.增加用户停留时长的一把利器.短视频的内容与体验直接关系到用户是否愿意长时停留,盒马也提出全链路内容视频化的规划,以 ...
- OpenGL ES应用开发实践指南:iOS卷
<OpenGL ES应用开发实践指南:iOS卷> 基本信息 原书名:Learning OpenGL ES for iOS:A Hands-On Guide to Modern 3D Gra ...
- TextureView+SurfaceTexture+OpenGL ES来播放视频(三)
引自:http://www.jianshu.com/p/291ff6ddc164 做好的Demo截图 opengl-video 前言 讲了这么多,可能有人要问了,播放视频用个android封装的Vid ...
- TextureView+SurfaceTexture+OpenGL ES来播放视频(一)
引自:http://www.ithao123.cn/content-8733143.html 最近发现视频直播类应用层出不穷,比如233手游直播,蓝鲸直播,微录客等等什么的,连android界大神老罗 ...
- 2018亚太CDN峰会开幕, 阿里云王海华解读云+端+AI的短视频最佳实践
4月11-12日,2018亚太CDN峰会在北京隆重召开,在11日下午的短视频论坛中,阿里云高级技术专家王海华进行了<短视频最佳实践:云+端+AI>的主题演讲,分享了短视频的生命周期关键点和 ...
- TextureView+SurfaceTexture+OpenGL ES来播放视频(二)
引自:http://www.jianshu.com/p/b2d949ab1a1a 在使用OpenGL ES 绘制前,我先概括下接下来要做的工作:我先借用一个博主kiffa举的的一个栗子,我觉得说的恰到 ...
- iOS图像处理之Core Graphics和OpenGL ES初见
http://www.jianshu.com/p/f66a7ca326dd iOS支持两套图形API族:Core Graphics/QuartZ 2D 和OpenGL ES.OpenGL ES是跨平台 ...
随机推荐
- Powerdesigner 连接mysql 在指定的DSN中,驱动程序和应用程序之间的体系结构不匹配 SQLSTATE = IM014
系统环境: WIN7 64位系统, 用Powerdesigner 连接MySQL 逆向工程时 报错 "在指定的DSN中,驱动程序和应用程序之间的体系结构不匹配 SQLSTATE = IM01 ...
- Linux常见命令(四)——mkdir
今天我们来介绍第四个命令:mkdir.mkdir (Make Directory 创建目录): 若指定目录不存在则创建目录.在创建目录时,要求创建目录的用户具有写权限,并应保证新建的目录没有重名. 用 ...
- shell 多进程
shell 多进程来模拟多线程 (1){ } 建立代码块 (2)使用 & 将进程放入后台 [zheng@localhost ~]$ cat threads.sh #!/bin/bash ;i& ...
- [js高手之路]面向对象+设计模式+继承一步步改造简单的四则运算
到目前为止,我已经写完了面向对象完整的一个系列知识,前面基本属于理论,原理的理解,接下来,我们就用学到的知识来实战下吧. 看看理解原理和理论是否重要?例子从简单到复杂 一.单体(字面量)封装加减乘除 ...
- Spring Data Jpa(Hibernate) OneToMany
这个其实非常简单.假设有topic 和 subscriber两个实体类,不考虑关联关系,则连个类的代码如下: /** * Created by csonezp on 2017/8/31. */ @En ...
- 线性代数-矩阵-【2】矩阵生成 C和C++实现
矩阵的知识点之多足以写成一本线性代数. 所以我们把矩阵的运算封装成矩阵类.以C++为主进行详解. 点击这里可以跳转至 [1]矩阵汇总:http://www.cnblogs.com/HongYi-Lia ...
- centos 7 最小安装后 安装FTP服务器 vsftp
1.首先查看下 系统配置 rpm -q ftp #肯定是没安装, 2.安装 vsftpd yum -y vsftpd 3.vim /etc/vsftpd/vsftpd.conf anonymous_e ...
- 使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序
使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻 ...
- 通过日期在js中求出判断间隔天数,周期等实现分享
在我们在项目的时候,可能出现这样的一种情况,有一个开始时间和一个结束时间,而这两个时间用$('#StartTime').val(); 取出来的时候又是datetime 类型,我们需要求这个时间中的间隔 ...
- MySQL存储引擎中的MyISAM和InnoDB区别
MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然性能极佳,但却有一个缺点 ...