快手 · 移动端音视频开发实战
展晓凯
快手回森技术负责人
12246 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 25 讲
快手 · 移动端音视频开发实战
15
15
1.0x
00:00/00:00
登录|注册

05|移动平台的视频渲染(二):OpenGL ES上下文环境搭建

你好,我是展晓凯。今天我们来继续学习移动平台的视频渲染。
上一节课,我们使用 OpenGL ES 提供给开发者的接口,创建出了一个 GLProgram,但是如果让这个 GLProgram 运行起来还需要有一个上下文环境来支撑。由于 OpenGL ES 一开始就是为跨平台设计的,所以它本身并不承担窗口管理以及上下文环境构建的职责,这个职责需要由各自的平台来承担。
Android 平台使用的是 EGL,EGL 是 Khronos 创建的一个框架,用来给 OpenGL 的输出与设备的屏幕搭建起一个桥梁。EGL 的工作机制是双缓冲模式,也就是有一个 Back Frame Buffer 和一个 Front Frame Buffer,正常绘制操作的目标都是 Back Frame Buffer,渲染完毕之后,调用 eglSwapBuffer 这个 API,会将绘制完毕的 Back Frame Buffer 与当前的 Front Frame Buffer 进行交换,然后显示出来。EGL 承担了为 OpenGL 提供上下文环境以及窗口管理的职责。
iOS 平台使用的是 EAGL,与 EGL 的双缓冲机制比较类似,iOS 平台也不允许我们直接渲染到屏幕上,而是渲染到一个叫 renderBuffer 的对象上。这个对象你可以理解为一个特殊的 FrameBuffer,最终再调用 EAGLContext 的 presentRenderBuffer 方法,就可以将渲染结果输出到屏幕上去了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了在移动平台上使用OpenGL ES进行视频渲染的复杂性,涉及到在Android和iOS平台上搭建OpenGL ES的上下文环境。在Android平台上,可以使用GLSurfaceView简化开发流程,但灵活性较差;而在Native层基于C++环境搭建OpenGL ES的上下文环境则需要引入头文件与so库、EGLDisplay作为绘制的目标以及EGLContext提供线程的上下文。在iOS平台上,使用EAGL进行类似的操作,需要创建Render Buffer并将其绑定到CAEAGLLayer上。文章重点介绍了在Android平台上使用EGL的双缓冲模式以及在Native层使用EGL搭建OpenGL ES的开发环境的具体步骤。此外,还介绍了为绘制线程绑定上下文和销毁资源的操作。另外,文章还介绍了SDL库的介绍与使用,以及在Mac + CLion的C++工程中如何使用sdl2库来构建OpenGL ES的上下文环境。通过本文,读者可以快速了解移动平台上使用OpenGL ES进行视频渲染的基本流程和关键技术点,为后续学习SDL库打下基础。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《快手 · 移动端音视频开发实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(8)

  • 最新
  • 精选
  • 大土豆
    我感觉这课程小白是听不懂了。我这种之前把EGL的代码当成八股文和模板的,倒是又重新理解了一遍。

    作者回复: 小白慢慢学习也是可以看懂的,后续我会加上事例代码,只要想学的人这套课程一定可以提供最系统的内容。

    2022-08-03归属地:北京
    3
  • 小跑猫
    有一个困惑请教,GLSurfaceview本身实现了一套opengl上下文,如果再把它的surface传到native去关联ANAtiveWindow,并在native层创建上下文之后进行渲染,这两套上下文会不会冲突?

    作者回复: GLSurfaceview其实就是SurfaceView+OpenGL上下文管理,不能将GLSurfaceVIew的Surface在传递到Native层去的,我们这里讲解的是把SurfaceView或者TexureView的Surface传递到Native层去构建ANativeWindow。

    2022-08-28归属地:北京
    1
  • 我的無力雙臂
    demo的示例代码有链接吗

    作者回复: 在课程更新完毕之后,会把代码公布出来哈,大家先学知识。

    2022-08-03归属地:北京
    1
  • Aaron
    老师,请问有源代码的链接吗

    编辑回复: 代码🔗 https://github.com/zhanxiaokai

    2022-10-22归属地:北京
  • 一个正直的小龙猫
    这节课看不懂了,想问一个其他相关的问题,iOS平台使用metal 会不会更合适一些?

    作者回复: 也可以,不过iOS现在使用OpenGL ES底层也会转换为Metal的,像播放器、美颜、预览这种简单应用使用OpenGL ES足以满足。

    2022-09-07归属地:北京
  • peter
    请教老师两个问题: Q1:EGL和OpenGL ES是什么关系? EGL是OpenGL ES的一部分吗?比如,EGL是OpenGL ES的底层部分。或者,两者是相互独立的两个实体? Q2:能否提供可运行的源代码?我懂一点安卓,能用AS创建简单的工程,所以最好是安卓版本,基于AndroidStudio的源代码,能运行后产生一个简单的结果即可,比如打印一句话等。文章写得很好,很流畅,逻辑清晰,但没有实际的操作就好像少了一点什么。

    作者回复: A1: EGL是OpenGL ES在Android或者linux平台的实现,提供了上下文环境。可以理解为OpenGL定义了一套标准协议,EGL按照标准进行实现,就像JVM有很多家实现一样; A2: 会有的,不过最近在紧急的更新课程,源码预计9月份可以传上去。

    2022-08-04归属地:北京
  • 王厂长
    有example代码吗,这个很重要啊

    作者回复: 有的,课程更新完毕之后,会慢慢更新上来的。

    2022-08-03归属地:北京
  • 王建峰
    提到渲染后的显示的过程,有点不太明白,我们渲染后的图形,如果有多个图层进行合成,合成应该在哪个地方做呢,谁来执行这部分的程序?合成后的图像会写到backing buffer,然后设置成 fronting buffer 到显示屏,可以这样做嘛?
    2023-08-27归属地:重庆
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部