Android 音视频系列之 FFmpeg+OpenGL ES播放视频

目录

一、Android音视频硬解码篇:

二、使用OpenGL渲染视频画面篇

三、Android FFmpeg音视频解码篇

本文你可以了解到

如何在 NDK 层调用 OpenGL ES ,以及使用 OpenGL ES 来渲染 FFmpeg 解码出来的视频数据。

一、渲染流程介绍

Java 层,Android 已经为我们提供了 GLSurfaceView 用于 OpenGL ES 的渲染,我们不必关心 OpenGL ES 中关于 EGL 部分的内容,也无需关注 OpenGL ES 的渲染流程。

NDK 层,就没有那么幸运了,Android 没有为我们提供封装好 OpenGL ES 工具,所以想要使用 OpenGL ES ,一切就只有从头做起了。

但是也不必担心,关于 EGL 的使用,在前面文章【深入了解OpenGL之EGL】中专门做了详细的介绍,在 NDK 层,也是一样的,不过是使用 C/C++ 实现一遍而已。

下图,是本文整个解码和渲染的流程图。

渲染流程

在【Android FFmpeg视频解码播放】中,我们建立了 FFMpeg 解码线程,并且将解码数据输出到本地窗口进行渲染,只用到了一个线程。

而使用 OpenGL ES 来渲染视频,则需要建立另外一个独立线程与 OpenGL ES 进行绑定。

因此,这里涉及到两个线程之间的数据同步问题,这里,我们将 FFmpeg 解码出来的数据送到 绘制器 中,等待 OpenGL ES 线程的调用。

特别说明一下
这里,OpenGL 线程渲染的过程中,不是直接调用绘制器去渲染,而是通过一个代理来间接调用,这样 OpenGL 线程就不需要关心有多少个绘制器需要调用,统统交给代理去管理就好了。

二、创建 OpenGL ES 渲染线程

Java 层一样,先对 EGL 相关的内容进行封装。

EGLCore 封装 EGL 底层操作,如

  • init 初始化
  • eglCreateWindowSurface/eglCreatePbufferSurface 创建渲染表面
  • MakeCurrent 绑定 OpenGL 线程
  • SwapBuffers 交换数据缓冲
  • ......

EGLSurfaceEGLCore 进一步封装,主要是对 EGLCore 创建的 EGLSurface 进行管理,并对外提供更加简洁的调用方法。

EGL 原理请阅读《深入了解OpenGL之EGL》一文,这里将不再具体介绍。

封装 EGLCore

头文件 elg_core.h

  // egl_core.h

  extern "C" {
  #include <EGL/egl.h>
  #include <EGL/eglext.h>
  };

  class EglCore {
  private:
      const char *TAG = "EglCore";

      // EGL显示窗口
      EGLDisplay m_egl_dsp = EGL_NO_DISPLAY;
      // EGL上线问
      EGLContext m_egl_cxt = EGL_NO_CONTEXT;
      // EGL配置
      EGLConfig m_egl_cfg;

      EGLConfig GetEGLConfig();

  public:
      EglCore();
      ~EglCore();

      bool Init(EGLContext share_ctx);

      // 根据本地窗口创建显示表面
      EGLSurface CreateWindSurface(ANativeWindow *window);

      EGLSurface CreateOffScreenSurface(int width, int height);

      // 将OpenGL上下文和线程进行绑定
      void MakeCurrent(EGLSurface egl_surface);

      // 将缓存数据交换到前台进行显示
      void SwapBuffers(EGLSurface egl_surface);

      // 释放显示
      void DestroySurface(EGLSurface elg_surface);

      // 释放ELG
      void Release();
  };

具体实现

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值