OpenGl 直接读取YUV420P

   前面已经讲过,ffmpeg提供了方法,将解码后的yuv420p格式重采样为RGBA格式,再通过surface进行播放。但视频重采样,或者说转码这个过程,ffmpeg太消耗性能,开销太大,现在主流的做法都是将解封装解码由ffmpeg处理,解码得到的YUV420格式,直接交给openGl进行输出显示。

   我们在android中,一般不会直接调用OpenGl, 而是调用EGL,EGL相当于是一个中间件,可以连接OpenGl与android之间。   

   在CMAKE中,直接引入这些库就行了,不需要再加入其它SO库,这是NDK里面就存在的。


OpenGl 直接读取YUV420P_第1张图片

在JAVA中,依然先设置一个XPLAY控件,完成一些JAVA层的初始化,再将此控件在XML中写入即可:


OpenGl 直接读取YUV420P_第2张图片

接着就是在C++文件,完成 Open方法。这里就是直接让yuv文件,通过EGL,播放出来 。


先说一下逻辑,EGL其实有俩个要点,顶点着色器和片元着色器。 就是所谓的shader。其实EGL就是通过shader,来将YUV转换为RGBA,效率奇高。这就是关键。


OpenGl 直接读取YUV420P_第3张图片

顶点着色器,用GLSL写,不明白,大概就是一种语言,直接复制

OpenGl 直接读取YUV420P_第4张图片

  片元着色器也是一样。这里定义了YUV转RBG的算法

OpenGl 直接读取YUV420P_第5张图片

    这里是初始化shader,两种着色器都是调用此方法创建

OpenGl 直接读取YUV420P_第6张图片

你可能感兴趣的:(OpenGl 直接读取YUV420P)