专栏首页音视频直播技术专家音视频直播技术--视频渲染之EGL

音视频直播技术--视频渲染之EGL

前言

我们在Andriod系统下做视频渲染时要使用 OpengGL ES, 而使用 OpengGL ES 就不得不提到 EGL。那么EGL是什么呢?它又在渲染时起到什么作用呢?今天我就给大家介绍一下 EGL.

什么是EGL

EGL是一套用于管理绘制Surface的API。它的运行机制如下:

  • 与系统的本地窗口进行通信。
  • 查询绘制Surface的有效类型与配置。
  • 创建绘制的Surface。
  • 创建Context来管理渲染资源,如OpenGL ES 的 Shader 数组数据。
  • 将 OpengGL ES 渲染的数据输出到 Surface中,并最终将 Surface中的内容输出到本地窗口。

下图展示了 EGL 在视频渲染中的作用:

  • Display(EGLDisplay) 是对实际显示设备的抽象。
  • Surface(EGLSurface)是对用来存储图像的内存区域FrameBuffer的抽象,包括Color Buffer, Stencil Buffer ,Depth Buffer.
  • Context (EGLContext) 存储OpenGL ES绘图的一些状态信息及Shader数组数据。

使用 EGL 的步骤

可以把 EGL 看作是 OpenGL ES 与 本地窗口系统之间的胶水层。使用EGL需按如下步聚操作:

获取EGLDisplay对象

在EGL能够确定什么类型的会制Surface或底层系统的其它特性之前,需要先与系统窗口建立通信。EGL提供了一个类型EGLDisplay,它封装了所有操作本地窗口的API。使用EGL时,第一步操作就是创建并初始化与EGLDisplay的连接。下面是连接EGLDisplay的具体函数:

EGLDisplay eglGetDisplay(EGLNativeDisplayType display_id);

初始化与EGL之间的连接

EGL成功与EGLDisplay连接后,需要初始化EGL,调用eglInitialize函数完这成这个作务。函数如下:

EGLBoolean eglInitialize(
        EGLDisplay display,
        int[] major,
        int majorOffset,
        int[] minor,
        int minorOffset
);

eglInitialize函数初始化EGL的内部数据结构,如果EGL初始化失败,就会返回EGL_FALSE。

获取EGLConfig对象

EGL初始化完成后,我们就可以获取渲染Surfaces的类型和配置了。EGLConfig包括所有关于Surface的配置信息。这些信息包括可用颜色数,与配置相关的额外缓冲区(如深度和模板缓冲),Surface的类型和众多的其他特点。函数如下:

boolean eglChooseConfig(
        EGLDisplay display,
        int[] attrib_list,
        int attrib_listOffset,
        EGLConfig[] configs,
        int configsOffset,
        int config_size,
        int[] num_config,
        int num_configOffset
);

创建EGLContext实例

EGLContext结构内部包含OpenGL ES 2所有的状态及所需的操作。例如,它包含引用到顶点和片段着色器的数组数据。在OpenGL ES 2可以绘制之前,需要先创建好EGLContext。函数如下:

EGLContext eglCreateContext(
        EGLDisplay display,
        EGLConfig config,
        EGLContext share_context,
        int[] attrib_list,
        int offset
);

创建EGLSurface实例

创建完EGLConfig后,可根据EGLConfig创建EGLSurface。EGLSurface相当于一块画布(一块内存空间),用户想绘制的信息首先都要先绘制到EGLSurface上。

EGLSurface eglCreateWindowSurface(
        EGLDisplay dpy,
        EGLConfig config,
        Object win,
        int[] attrib_list,
        int offset
);

连接EGLContext和EGLSurface

通过上面的步骤,我们已经有了 EGLContext 和 EGLSurface 对象。下面我们需要将二者关联在一起,这样 EGL 就可以控制 OpenGL ES 从 EGLContext 读取 shader 数据,并向 EGLSurface 中绘制内容了。

boolean eglMakeCurrent(
        EGLDisplay dpy,
        EGLSurface draw,
        EGLSurface read,
        EGLContext ctx
);

使用GL指令绘制图形

EGL将EGLSurface中的内容通过 EGLDisplay 输出到本地窗口上。

boolean eglSwapBuffers(
        EGLDisplay dpy,
        EGLSurface surface
);

断开并释放与EGLSurface关联的EGLContext对象

使用 eglMakeCurrent 函数,将 EGLSurface 和 EGLContext 分别设置为 EGL14.EGL_NO_SURFACE 和 EGL14.EGL_NO_CONTEXT,这样就将两者的关系断开了。

eglMakeCurrent(
          mEGLDisplay,
          EGL14.EGL_NO_SURFACE, 
          EGL14.EGL_NO_SURFACE,
          EGL14.EGL_NO_CONTEXT
);

删除EGLSurface对象

boolean eglDestroySurface(
        EGLDisplay dpy,
        EGLSurface surface
);

删除EGLContext对象

boolean eglDestroyContext(
        EGLDisplay dpy,
        EGLContext ctx
);

终止与EGLDisplay之间的连接

boolean eglTerminate(
        EGLDisplay dpy
);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++匿名函数(lambda)

    对于lambda,只要有返回值,且函数体包含一句语句以上时,其返回值的类型就无法由编译器自动推导,必须明确指定。

    音视频_李超
  • 通过WebRTC进行实时通信-建立信令服务交换数据

    换句话说,交换metadata需要在点对点传输音频、视频或数据之前。这个过程称之为信令。

    音视频_李超
  • 「转」javascript中的prototype

    在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例。但是在Javascript语言体系中,是不存在类(Cla...

    音视频_李超
  • P1280 尼克的任务

    题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成。 ...

    attack
  • 送你个动态图制作工具

    LICEcap是一款简洁易用的动画屏幕录制软件,它可将屏幕录像的内容直接保存为高质量(每帧颜色数量可超过256)GIF动态图片格式。并且支持特别标记鼠标操作动态...

    小诸葛
  • 羊皮书APP(Android版)开发系列(二十一)双联动分组ListView,类似于外卖点餐

    ok,到这里就完成了双ListView联动的实现,可以到这里下载运行体验https://github.com/wjie2014/DoubleListViewLi...

    热心的程序员
  • STL priority实例

    按顺序输出序列: 1 #include <iostream> 2 #include <vector> 3 #include <queue> 4 #inc...

    用户1154259
  • 美团点评Kubernetes集群管理实践

    今日头条丨一点资讯丨腾讯丨搜狐丨网易丨凤凰丨阿里UC大鱼丨新浪微博丨新浪看点丨百度百家丨博客中国丨趣头条丨腾讯云·云+社区

    数据猿
  • 美团点评Kubernetes集群管理实践

    作为国内领先的生活服务平台,美团点评很多业务都具有非常显著、规律的“高峰”和“低谷”特征。尤其遇到节假日或促销活动,流量还会在短时间内出现爆发式的增长。这对集群...

    美团技术团队
  • OEA 2.11 支持单机版数据库 - SQLite与SQLCE对比

    在 OEA 平台 设计中,需要支持多种数据库,这至少包括了 SqlServer、Oracle、一个单机文件数据库。而之前对于这一块,我们一直没有实现,只是预留了...

    用户1172223

扫码关注云+社区

领取腾讯云代金券